2009-09-26 69 views
2

我使用Ajax啓動可能需要幾個小時才能運行的PHP腳本。它是異步完成的,因此即使瀏覽器關閉,PHP腳本也會完成。查找/處理停滯的PHP腳本

我需要處理任何因任何原因而停滯/掛起的PHP腳本。什麼是最好的方式去做這件事?有沒有辦法讓PHP腳本的進程ID可以用來定期檢查活動?在開始新腳本之前,我需要殺死任何出色的腳本。

感謝, 布賴恩

+3

解決您的問題並不是一個解決方案,但啓動一個能夠在瀏覽器上運行數小時的腳本會感覺不對:是不是沒有辦法ld從命令行發送它,也許使用cron作業? – 2009-09-26 20:36:04

+0

我希望我能在Pascal MARTIN的評論上投票10次左右。 – gahooa 2009-09-26 20:54:06

回答

5

一個解決方案可能是基於這樣的想法:

  • 在長時間運行腳本的開頭,使用getmypid以獲得其PID(進程ID)
  • 將該PID存儲在文件中
  • 腳本結束時,即將結束之前,刪除該文件。

當另一個進程啓動時,它可以檢查該文件是否存在:

  • 如果是和該文件中包含與PID的進程仍在運行,二是你必須:
    • 要麼殺了它
    • 或停止,考慮在同一時間運行一個進程是不夠
  • 如果該文件存在,但與PID的進程不是,這意味着你的第一個進程死亡(如致命錯誤,例如)
  • 如果文件不存在,這意味着第一個進程完成正常

關於檢測進程是否正在運行並最終將其殺死,我不確定PHP是否提供了這種功能......可能需要使用exec來調用命令行實用程序,如pskill ..

+0

謝謝,非常有幫助。是的,我可以通過exec來運行它。更多細節:1)不是所有的都需要幾個小時 - 有的只需要幾分鐘,2)限制是每個用戶一個進程,而不是全部,每次可能有幾十個用戶。 作爲一個後續,是否有一個PHP腳本來監視資源的有效方法,所以我不會有可能炸燬我的服務器? – Brian 2009-09-26 21:10:55

+0

如果你在Linux服務器上,也許http://php.net/sys_getloadavg可以做(取決於你做什麼);;如果一次有數十個用戶和進程,請注意不要「吃」太多的Apache進程,因爲只有MaxClients可以同時運行。 – 2009-09-26 21:15:36

+0

非常感謝。 – Brian 2009-09-26 21:24:19