在 Linux 伺服器上編寫定時腳本時,常會將其加入 crontab 定時執行。隨著時間推移,若腳本執行時間較長,極易出現重複運行導致資源耗盡的問題。本文將分享兩種有效的 PHP 解決方案,幫助開發者防止程序重複執行。
此方法通過 shell_exec 執行系統命令,檢查指定腳本是否已在運行:
// 檢測程序是否運行
function ifrun($clsname, $bf = 0) {
// 獲取進程列表並保存到臨時文件
$str = shell_exec("/bin/ps ax > /home/root/{$clsname}_run.txt");
// 統計目標腳本進程數量
$str = shell_exec("/bin/grep -c '{$clsname}.php' /home/root/{$clsname}_run.txt");
if ($bf > 0) {
return ($str >= $bf) ? 1 : 0;
} else {
// 預設閾值為 2(包含 grep 自身進程)
return ($str >= 2) ? 1 : 0;
}
}
// 調用示例:允許最多 5 個同名進程
if (ifrun('pooy', 5)) {
die("pooy is running");
}
// 備註:pooy 為腳本文件名 pooy.php 的前綴
將進程列表導出到文件,再通過 PHP 讀取分析:
system('ps -ef | grep wget > /root/pooy.txt');
$arr = file('/root/pooy.txt');
$total = count($arr);
for ($i = 0; $i < $total; $i++) {
$count = array();
// 檢查進程命令中是否包含特定路徑特徵
if (stristr($arr[$i], 'www/pooy') !== FALSE) {
$count[] = 'no';
break;
}
}
if (count($count) >= 1) {
echo "A same programs are running";
exit();
} else {
echo "start__________________________________________________";
}
// 註:"www/pooy" 為程序命令中的唯一標識字符串
兩種方法各有優勢:第一種靈活可配置並發數;第二種邏輯直觀,適合簡單場景。根據業務需求選擇即可有效解決定時任務重複執行問題。