在使用PHP 編寫命令行腳本時,有時候我們希望通過cli_set_process_title和cli_get_process_title來設置或獲取進程標題,以便更清晰地標識當前運行的腳本狀態,尤其在使用ps 、 top等工具進行進程監控時。這在編寫守護進程、任務隊列消費者等CLI 應用中非常實用。
然而,許多開發者在調用cli_get_process_title()時會遇到返回空字符串或者false的問題。明明前面已經調用過cli_set_process_title()成功設置了標題,為什麼再獲取卻失敗呢?問題可能並不在你的代碼,而是在PHP 的構建方式。
PHP 的cli_set_process_title和cli_get_process_title函數來自於proctitle支持,這是PHP 在編譯時可選的一項功能。如果你的PHP 沒有啟用--enable-cli且在構建過程中沒有啟用--enable-proctitle ,那麼這些函數就形同虛設。
你可以使用以下命令檢查:
php -i | grep "Process title"
如果沒有相關輸出,或者你發現以下行缺失:
Process title support => enabled
那就說明你的PHP 環境沒有啟用這個特性。
以下是一個設置並嘗試獲取進程標題的例子:
<?php
cli_set_process_title("my_worker_task");
$title = cli_get_process_title();
if ($title === false || $title === "") {
echo "無法獲取進程標題,請檢查 PHP 是否啟用了 proctitle 支持。\n";
} else {
echo "當前進程標題是: " . $title . "\n";
}
如果你的PHP 沒有啟用相關支持,執行後你可能只會看到警告或空輸出。
你需要在編譯PHP 時加入--enable-cli (通常默認啟用)和--enable-proctitle選項。例如:
./configure --enable-cli --enable-proctitle
make && make install
這會啟用進程標題支持,之後你就可以正常使用這兩個函數了。
如果你無法重新編譯PHP,可以考慮通過exec()或調用系統命令手動設置進程標題,例如:
<?php
$title = "my_custom_task";
exec("exec -a $title php your_script.php");
不過需要注意的是,這種方式不夠優雅,也可能因為exec()被禁用或不同系統行為不同而不可靠。
cli_get_process_title()拿不到進程標題,很可能不是代碼的問題,而是PHP 沒有啟用相關功能支持。開發者在遇到此類問題時,第一時間應檢查當前PHP 環境的構建參數。特別是在使用Docker 或某些操作系統自帶PHP 版本時,更應該留意這個細節。