什么可能会不合需要地停止长期运行的PHP脚本?

时间:2014-08-28 16:10:28

标签: php

如果在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

这个脚本后来以什么方式在外部终止(到脚本本身)?

2 个答案:

答案 0 :(得分:3)

您的示例脚本意外或不期望地结束的主要原因是:

  • rebootshutdown - 这应该是显而易见的。

  • PHP的内存限制,Apache的内存限制或操作系统级别的内存不足将导致此脚本失效。

  • 在某些设置中,也可能对使用的CPU周期有限制。

  • 运行时发生的任何PHP致命错误。

  • kill <pid>几乎所有信号(不仅是kill -9)都会终止脚本。

  • 如果脚本使用apachemod_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;

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