2014-08-28 67 views
1

如果在LAMP堆棧中創建一個長期運行的PHP腳本,使用:什麼可能會不必要地停止長時間運行的PHP腳本?

set_time_limit(0); 
header("Connection: close"); 
ignore_user_abort(true); // just to be safe 
ob_start(); 

$size = ob_get_length(); 
header("Content-Length: $size"); 
ob_end_flush(); 
flush();    
session_write_close(); 

//Some long running code here 

在哪些方面可能這個腳本隨後被外部終止(該腳本本身)?

+1

'kill -9 pid_of_script'。 '關機','重啓'。超過cpu的時間限制,超過PHP以外的流程限制,等等等等等等。我們應該繼續嗎? – 2014-08-28 16:12:33

+0

@MarcB - 你能否回答我的問題?我也想發表一些評論給你的答案。 – MarcF 2014-08-28 16:19:59

回答

3

主要的原因使您的示例腳本會意外終止或undesireably是:

  • rebootshutdown - 這應該是ovious。

  • PHP,Apache的內存限制或OS級別的內存不足都會終止此腳本。

  • 在某些設置中,對於使用的CPU週期也可能有限制。

  • 運行時發生的任何PHP致命錯誤。

  • kill <pid>幾乎所有信號(不僅是kill -9)都會終止腳本。

  • 如果腳本使用mod_phpapache內部運行,那麼apache重新啓動也會終止該腳本。
    請注意,apache中的每個長時間運行的腳本會阻止工作線程/進程,這可能會對服務器性能造成影響。此可能不適用於php-fcgi環境!

爲了防止這種一些

  • 運行Apache環境之外的腳本。
    我更喜歡打電話echo '/usr/bin/php myscript.php'| at now。 (使用at調度程序,請參閱聯機幫助頁)

    at完全脫離Apache的腳本,所以它在Apache進程結束時仍會運行。

  • 將PHP內存限制設置爲高值或無限。 (任何東西> 512M通常都是一個壞主意)
    這可以在腳本中完成。

-3

您可以創建一個運行時間過長的bash腳本,並使用cronjob執行它。

例如:

#!/bin/bash 
# This script will kill process which running more than X hours 
# egrep: the selected process; grep: hours 
PIDS="`ps eaxo bsdtime,pid,comm | egrep "spamd|exim|mysqld|httpd" | grep " 1:" | awk '{print $2}'`" 

# Kill the process 
echo "Killing spamd, exim, mysqld and httpd processes running more than one hour..." 
for i in ${PIDS}; do { echo "Killing $i"; kill -9 $i; }; done; 

http://forum.directadmin.com/showthread.php?t=26179

+1

我想OP會問爲什麼腳本會意外/不想要的死亡原因 - 而不是如何殺死它。 – Kaii 2014-08-28 16:21:11

+0

爲什麼有人會殺死mysqld/httpd:O – DanFromGermany 2014-08-28 16:21:44

+1

@DanFromGermany:很多原因... – 2014-08-28 16:46:57

相關問題