2

我在我的 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 设置.. 它不是通过网络服务器运行的,它只是来自命令行,所以给出了。

4

3 回答 3

4

看起来你没有正确分离你的进程。目前,如果您的进程的父进程死亡,您的进程也会死亡。如果您将进程置于后台(创建一个真正的守护进程),您将不会遇到 scuh 的麻烦。

您可以以这种方式执行您的 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 守护进程结束时结束。

于 2012-10-22T15:57:40.643 回答
0

长时间运行的 PHP 脚本不应无故死掉或挂起。我有连续运行 6 个月 + 的脚本。您的脚本主体内部一定有其他事情发生。

于 2012-10-22T15:46:32.327 回答
0

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

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

于 2017-01-27T16:10:57.187 回答