| 參數 | 說明 | 範例 |
|---|---|---|
-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 守護進程。
opcache.enable_cli=1、opcache.jit=1255 (PHP 8.1+ JIT)opcache.preload=/path/to/preload.php,啟動時預編譯核心類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,別重複造輪子。