萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 命令行模式 (CLI) 完全指南:安裝、參數、標準流、守護進程

為什麼用 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()。
copyright © 萬盛學電腦網 all rights reserved