PHP 不僅是 Web 開發利器,通過編譯 CLI SAPI(命令列介面),亦可成為強大的系統管理、任務調度、數據處理腳本語言。本文詳述 PHP CLI 環境構建、Shebang 機制、參數解析與進階用法,助你拓展 PHP 應用邊界。
wget https://www.php.net/distributions/php-8.3.x.tar.gz(選擇對應版本)tar -xzf php-*.tar.gz && cd php-*./configure --disable-all --enable-cli --with-config-file-path=/etc/php/cli
make && sudo make installstrip /usr/local/bin/php 移除調試符號,體積減少 30%+。php -v 輸出版本資訊即成功。#!/usr/local/bin/php -q
<?php
echo "Hello, World!\n";
?>
關鍵點:
#!/usr/local/bin/php -q:Shebang 行指定解析器路徑,-q 抑制 HTTP Header 輸出(CGI 模式預設行為)。<?php ... ?> 閉合標籤,純 PHP 文件建議省略結尾標籤防止輸出空白。chmod +x hello.php,直接 ./hello.php 運行。PHP CLI 自動提供兩個超全局變量:
$argc:參數總數(含腳本名,最小為 1)$argv:參數陣列,$argv[0] 為腳本路徑,$argv[1] 起為實際參數#!/usr/local/bin/php -q
<?php
if ($argc !== 3) {
fwrite(STDERR, "Usage: {$argv[0]} \n");
exit(1);
}
$sum = $argv[1] + $argv[2];
echo $sum . "\n";
?>
執行:./sum.php 10 20 → 輸出 30
#!/usr/local/bin/php -q
<?php
$sum = 0;
for ($i = 1; $i < $argc; $i++) {
$sum += $argv[$i];
}
echo $sum . "\n";
?>
執行:./bigsum.php 1 2 3 4 5 → 15;./bigsum.php 1 2 3 4 5 6 → 21
<?php
// 讀取管道輸入
$stdin = fopen('php://stdin', 'r');
while (($line = fgets($stdin)) !== false) {
echo strtoupper($line);
}
fclose($stdin);
// 區分輸出流
fwrite(STDOUT, "正常輸出\n");
fwrite(STDERR, "錯誤訊息\n");
$env = getenv('APP_ENV') ?: 'production';
$dbHost = $_ENV['DB_HOST'] ?? 'localhost';
<?php
$colors = ['red'=>31, 'green'=>32, 'yellow'=>33, 'blue'=>34];
function colorize($text, $color) {
global $colors;
return "\033[{$colors[$color]}m$text\033[0m";
}
echo colorize("成功!", 'green') . "\n";
<?php
declare(ticks=1);
pcntl_signal(SIGTERM, function() { echo "收到終止信號,優雅退出\n"; exit(0); });
while (true) {
// 任務邏輯
sleep(5);
}
php -c /etc/php/cli/php.ini script.php 隔離 Web 與 CLI 配置(如 memory_limit=-1、max_execution_time=0)。require __DIR__.'/vendor/autoload.php'; 復用框架組件(Symfony Console、Laravel Zero 等)。/etc/systemd/system/php-worker.service 管理長期運行腳本。logrotate 處理腳本輸出日誌。PHP CLI 打破了「只能寫網頁」的刻板印象,配合豐富的擴展生態(pcntl、posix、ffi、swoole),完全勝任運維自動化、數據管道、微服務側車等場景。下次需要寫 Bash/Python 腳本時,不妨嘗試 PHP——你可能會愛上它的類型系統與生態一致性。