2
我寫了一個長時間運行的PHP後臺程序。有幾次,我希望它停止,但停止優雅,如何最好的告訴一個後臺PHP程序停止
我所做的是,在主邏輯循環中我測試了具有特定名稱的文件的存在。如果文件存在,則程序停止。當我想讓程序自行結束時,我只是創建該文件。
有沒有更好的方法來做到這一點。
我不想殺死這個過程。我希望程序自行結束。
我寫了一個長時間運行的PHP後臺程序。有幾次,我希望它停止,但停止優雅,如何最好的告訴一個後臺PHP程序停止
我所做的是,在主邏輯循環中我測試了具有特定名稱的文件的存在。如果文件存在,則程序停止。當我想讓程序自行結束時,我只是創建該文件。
有沒有更好的方法來做到這一點。
我不想殺死這個過程。我希望程序自行結束。
正如評論中所建議的那樣,您可以使用信號來終止您的過程。你將要使用的信號是SIGTERM
信號(重點煤礦)[ref]:
SIGTERM信號被髮送到一個進程要求其終止。與SIGKILL信號不同,它可以被過程捕獲,解釋或忽略。這允許進程執行良好的終止釋放資源並且在適當的情況下保存狀態。 SIGINT與SIGTERM幾乎完全相同。
爲此,請在啓動主循環前使用pcntl_signal
函數註冊信號處理程序。
declare(ticks = 1);
$stopProcess = FALSE;
pcntl_signal(SIGTERM, function() use (&$stopProcess) {
echo "Received SIGTERM...\n";
// Do further cleanup work either here or after the end of your main loop
$stopProcess = TRUE;
});
while (!$stopProcess) {
// main work loop
}
// Do cleanup work either here or in your signal handler
在命令行中,你可以使用kill
可執行到SIGTERM信號發送到您的過程:
$ kill -TERM <process id>
,你可以在你的PHP文件執行信號處理程序(HTTP:// PHP。 net/manual/en/function.pcntl-signal.php),然後使用kill SIGHUP,kill SIGKILL等與控制檯進程進行交互。 –
是的,這就是我所做的。我測試了一個文件stopProgramX的存在 – sdfor