如果在LAMP堆栈中创建了长时间运行的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
这个脚本后来以什么方式在外部终止(到脚本本身)?
答案 0 :(得分:3)
您的示例脚本意外或不期望地结束的主要原因是:
reboot
和shutdown
- 这应该是显而易见的。
PHP的内存限制,Apache的内存限制或操作系统级别的内存不足将导致此脚本失效。
在某些设置中,也可能对使用的CPU周期有限制。
运行时发生的任何PHP致命错误。
kill <pid>
几乎所有信号(不仅是kill -9
)都会终止脚本。
如果脚本使用apache
在mod_php
内运行,那么apache restarts也会终止脚本。
请注意,apache中的每个长时间运行的脚本都会阻塞工作线程/进程,这可能对您的服务器性能有害。此 可能 不适用于php-fcgi
环境!
要阻止某些:
在apache环境之外运行脚本。
我更喜欢致电echo '/usr/bin/php myscript.php'| at now
。 (使用at
调度程序,请参阅联机帮助页)
at
完全将您的脚本与apache分离,因此当apache进程结束时它仍会运行。
将PHP内存限制设置为高值或无限。 (任何&gt; 512M通常都是一个坏主意)
这可以在脚本内完成。
答案 1 :(得分:-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;