為什麼用 PHP CLI?
- 腳本自動化 (Cron 定時任務、部署腳本、數據遷移)。
- 調試現有 Web 代碼 (無需瀏覽器、直接輸出變量)。
- 高性能守護進程 (Worker、Queue Consumer、WebSocket Server)。
- 利用現有 PHP 生態 (ORM、HTTP Client、Console 組件) 快速構建工具。
安裝與驗證
# Linux (Debian/Ubuntu)
sudo apt install php-cli
# macOS (Homebrew)
brew install php
# Windows: 下載 PHP zip 包,解壓加入 PATH
# 驗證
php -v
php -m # 已載入擴展
php --ini # 配置文件路徑
運行腳本
php script.php # 直接運行
php -r 'echo "Hello CLI\n";' # 直接執行代碼片段
php -f script.php # 同 script.php
php -S localhost:8000 # 內置開發服務器
cat data.json | php process.php # 管道輸入
命令行參數處理
<?php
// $argv[0] 是腳本名,$argv[1]... 為參數
// $argc 為參數總數 (含腳本名)
echo "Script: $argv[0]\n";
echo "Args: " . implode(', ', array_slice($argv, 1)) . "\n";
// 使用 getopt 解析短/長選項
$options = getopt('hf:v', ['help', 'file:', 'verbose']);
if (isset($options['h'], $options['help'])) {
echo "Usage: php $argv[0] -f [-v]\n";
exit;
}
$file = $options['f'] ?? $options['file'] ?? 'default.txt';
$verbose = isset($options['v']) || isset($options['verbose']);
// ...
?>
標準流 (STDIN/STDOUT/STDERR)
<?php
// 讀取標準輸入 (管道/重定向)
$stdin = fopen('php://stdin', 'r');
while (($line = fgets($stdin)) !== false) {
echo strtoupper($line); // 輸出到 STDOUT
}
fclose($stdin);
// 寫入標準錯誤
fwrite(STDERR, "Error: something wrong\n");
// 文件描述符常量: STDIN, STDOUT, STDERR (PHP 自動打開)
?>
常見應用場景
- 定時任務:
crontab -e → 0 2 * * * /usr/bin/php /path/script.php >> /var/log/script.log 2>&1
- 長時間運行腳本:
set_time_limit(0); ignore_user_abort(true); 防止超時/斷開中止。
- 守護進程:使用
ReactPHP、Swoole、Workerman 或 Symfony Console + Supervisor 管理。
- 交互式控制台:
php -a 進入交互模式,或用 PsySH (更強大的 REPL)。
性能與調試
- 開啟 OPcache (cli 獨立 ini) 提升啟動速度。
- Xdebug + IDE 遠程調試 CLI 腳本 (
php -dxdebug.mode=debug script.php)。
- 內存分析:
php -d memory_limit=512M script.php、memory_get_peak_usage()。