长时间运行的PHP脚本挂起

时间:2012-10-22 15:38:32

标签: php linux bash

我在我的php脚本中设置了这个设置,只要它需要解析并执行mysql查询并获取超过100,000行的图像,就可以运行它。

ignore_user_abort(true);
set_time_limit(0);
#begin logging output
error_reporting(E_ALL);
ini_set('memory_limit', '512M');

我在shell中运行这样的命令:

nohup php myscript.php > output.txt

运行大约8到10个小时后,这个脚本仍然会运行,但执行只是停止...没有更多的输出..这不是我检查过的僵尸进程。它还没有达到内存限制,如果没有,它会退出吗?

发生了什么事?照看这个脚本并编写自定义代码来轻松推送它是一件非常痛苦的事情。到底是怎么回事?我读了unix可能清理僵尸但它不是僵尸。我知道这不是php设置..而且它不是通过网络服务器运行它只是来自命令行所以给出了。

3 个答案:

答案 0 :(得分:4)

看起来您没有正确分离过程。目前,如果您的流程的父级已经死亡,您的流程也将会死亡。如果你把你的进程放在后台(创建一个真正的守护进程),你将不会遇到麻烦。

您可以通过这种方式执行PHP以真正分离它:

php myscript.php > output.txt 2>&1 &

供您参考:

> output.txt

会将标准输出(即你的回声,打印等)重定向到output.txt文件

2>&1

将错误输出重定向到标准输出,将其写入相同的output.txt文件

&
在你的情况下,

是最重要的事情:它将分离你的进程以创建一个真正的守护进程。

编辑:如果您在断开shell时遇到麻烦,最简单的方法是将脚本放在bash脚本上,例如run.sh

#!/bin/bash
php myscript.php > output.txt 2>&1 &

你将以这种方式运行你的脚本:

bash run.sh &

在这种情况下,你的shell会“认为”你的程序在shell脚本结束时结束,而不是在php守护程序的末尾。

答案 1 :(得分:1)

长时间运行的PHP脚本不应该没有理由地死掉或挂起。我的脚本连续运行了6个月+。你的脚本体内必须有其他东西。

答案 2 :(得分:-1)

我知道我应该用评论来回答这个问题,但我没有足够的声誉来做这件事......

也许您的流程消耗了100%的CPU,我遇到了while循环的问题,而没有在循环结束时调用sleep()usleep()