首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP CLI 模式完全指南:參數解析、標準輸入、長時間腳本、守護進程實戰

     編輯:PHP 相關知識

為什麼要用 PHP CLI?

  • 定時任務、佇列消費者、資料遷移、報表生成、守護進程
  • 無 HTTP 超時限制、無輸出緩衝干擾、可直接存取檔案系統與環境變數
  • 效能較 Web-FPM 高(無請求生命週期開銷)

常用啟動參數速查

參數說明範例
-r直接執行代碼片段(無需 <?php 標籤)php -r 'echo "hi\n";'
-R對 STDIN 每行執行代碼($argn 當前行,$argi 行號)cat data.txt | php -R 'echo $argi . ": " . $argn . "\n";'
-f執行檔案(可省略)php -f script.php / php script.php
-l語法檢查(不執行)php -l script.php
-m列出已載入模組php -m | grep curl
-i顯示 phpinfo()php -i | grep memory_limit
-d臨時覆蓋 ini 設定php -d memory_limit=512M script.php
-a互動模式(REPL)php -a

命令列參數獲取:$argv / $argc

<?php
// test.php
var_dump($argc); // 參數個數(含腳本名)
var_dump($argv); // 參數陣列

/* 執行:
php test.php id name sex
輸出:
int(4)
array(4) {
  [0]=> string(8) "test.php"
  [1]=> string(2) "id"
  [2]=> string(4) "name"
  [3]=> string(3) "sex"
}
*/

進階參數解析:getopt() / Symfony Console

<?php
// 短選項 -f -v  長選項 --file= --verbose
$options = getopt('f:v', ['file:', 'verbose', 'dry-run']);
/*
php script.php -f data.csv --verbose --dry-run
輸出:
array(3) {
  'f' => 'data.csv'
  'verbose' => false
  'dry-run' => false
}
*/
// 注意:無值的長選項值為 false,短選項需在字串後加冒號表示需值

複雜 CLI 工具建議直接使用 Symfony Console Component:自動生成幫助、參數驗證、命令分組、進度條、表格輸出、自動完成。

標準輸入/輸出/錯誤流

<?php
// 讀取 STDIN(管道/重導向)
$stdin = fopen('php://stdin', 'r');
while (($line = fgets($stdin)) !== false) {
    echo strtoupper(trim($line)) . "\n";
}
fclose($stdin);

// 寫入 STDOUT / STDERR
fwrite(STDOUT, "正常輸出\n");
fwrite(STDERR, "錯誤輸出\n");

// 管道範例
// cat huge.log | php process.php > result.txt 2> errors.log

長時間腳本關鍵設定

<?php
// 1. 移除執行時間限制
set_time_limit(0); // 或 php -d max_execution_time=0

// 2. 忽略用戶中斷(關閉瀏覽器/斷開 SSH 繼續跑)
ignore_user_abort(true);

// 3. 記憶體限制(視需求調整)
ini_set('memory_limit', '512M');

// 4. 輸出即時刷新(避免緩衝導致日誌延遲)
ob_implicit_flush(true); // 或每次 echo 後 flush()

// 5. 進程標題(ps/top 顯示友好名稱)
cli_set_process_title('my-queue-worker: processing');

守護進程 / 常駐腳本模板

<?php
// worker.php
declare(ticks=1); // 訓號處理需求

$running = true;
pcntl_signal(SIGTERM, fn() => $running = false);
pcntl_signal(SIGINT,  fn() => $running = false);

while ($running) {
    $job = fetchJobFromRedis(); // 你的佇列邏輯
    if ($job) {
        processJob($job);
    } else {
        usleep(500000); // 0.5s 空閒休眠
    }
}

// 優雅關閉邏輯
echo "Worker stopped gracefully.\n";

生產環境建議改用 Supervisor / systemd 管理進程,而非裸跑 PHP 守護進程。

效能優化技巧

  1. OpCache 啟用 CLI 快取: opcache.enable_cli=1、opcache.jit=1255 (PHP 8.1+ JIT)
  2. 預載入: opcache.preload=/path/to/preload.php,啟動時預編譯核心類
  3. 避免 require_once 重複掃描: Composer ClassMap / OpCache 解決
  4. 批次處理用 Generator 節省記憶體: yield 逐行讀取大檔

除錯與分析

  • php -d xdebug.mode=profile script.php 生成 cachegrind.out.*,用 KCacheGrind/QCacheGrind 分析
  • php -d xdebug.mode=trace script.php 函數調用追蹤
  • strace -p 系統調用級別追蹤(卡住時極有效)

總結

PHP CLI 是伺服器端自動化的利器。掌握 getopt()、STDIN/STDOUT/STDERR、pcntl_signal、ignore_user_abort、set_time_limit(0) 這幾大核心,配合 Supervisor 進程管理與 OpCache/JIT 加速,即可構建穩健、高效的命令列工具與長時間服務。複雜交互介面請拥抱 Symfony Console,別重複造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved