PHP警告:exec()无法分叉

时间:2013-12-18 03:02:30

标签: php centos

所以这里有一些关于我的设置的背景信息。使用apache和php 5.2.17运行Centos。我有一个网站,列出了许多不同零售商网站的产品。我有爬虫脚本,可以从每个网站上获取产品。由于每个网站都不同,因此必须自定义每个爬虫脚本以抓取特定零售商网站。基本上我每个零售商都有1个爬虫。目前,我有21个爬虫正在不断运行,以收集和刷新这些网站上的产品。每个爬虫都是一个php文件,一旦php脚本运行完毕,它会检查以确保它自己运行的唯一实例,并且在脚本的最后它使用exec在原始实例关闭时重新开始。这有助于防止内存泄漏,因为每个爬网程序在关闭之前都会重新启动。但是最近我将检查爬虫脚本,并注意到其中一个Isnt不再运行,并在错误日志中找到以下内容。

PHP Warning:  exec() [<a href='function.exec'>function.exec</a>]: Unable to fork [nice -n 20 php -q /home/blahblah/crawler_script.php &gt;/dev/null &amp;]

这应该是重新启动这个特定的爬虫,但是因为它“无法分叉”它从未重新启动,并且爬虫的原始实例像通常那样结束。

显然它不是权限问题,因为这21个爬虫脚本中的每一个在运行结束时每5或10分钟运行一次这个exec命令,并且大部分时间它按预期运行。这似乎每天发生一次或两次。它似乎是某种限制,因为我刚刚开始看到这种情况发生,因为我添加了我的第21个爬虫。它并不总是与获取此错误的爬虫相同,它将是随机时间中的任何一个无法分叉其重新启动exec命令。

有没有人知道什么可能导致php无法分叉,甚至可能更好的方法来处理这些进程,以便一起解决错误?是否存在我应该研究的过程限制或某种性质的过程?在此先感谢您的帮助!

5 个答案:

答案 0 :(得分:7)

处理限制

  

“我应该研究过程限制”

有人(系统管理员?)出于安全原因限制了max user process,这是可疑的。你能试试吗?

$ ulimit -a
....
....
max user processes              (-u) 16384
....

请在PHP中运行前面的命令,如下所示

echo system("ulimit -a");

我搜索过php.ini或httpd.conf是否有这种限制,但我找不到它。

错误处理

  

“甚至更好的方法来处理这些过程,以便一起解决错误?

exec()的第三个参数返回$cmd的退出代码。 0表示成功,非零表示错误错误代码。参考http://php.net/function.exec

exec($cmd, &$output, &$return_val);

if ($ret_val != 0)
{
    // do stuff here
}
else
{
    echo "success\n";
}

答案 1 :(得分:5)

在我的情况下(大型PHPUnit测试套件),一旦进程达到57%的内存使用量,就会说unable to fork。所以,还有一件事要注意,它可能不是一个过程限制,而是记忆。

答案 2 :(得分:2)

我遇到了同样的问题,我尝试了这个,它对我有用;

ulimit -n 4096

答案 3 :(得分:1)

对于遇到此问题的任何其他人,可能会出现此问题的答案中列出的几个问题。

然而,我的问题是我的nginx用户没有适当的shell来执行我想要的命令。将.bashrc添加到nginx用户的主目录中修复此问题。

答案 4 :(得分:1)

问题通常是由系统或进程或可用内存耗尽引起的。通过运行free -m确保您有足够的资源。您将得到如下结果:

total used free shared buffers cached Mem: 7985 7722 262 19 189 803 -/+ buffers/cache: 6729 1255 Swap: 0 0 0

缓冲区/缓存行是您要查看的内容。请注意,本机上的可用内存为1255 MB。运行程序时,请继续尝试free -m并检查free内存以查看是否属于低数百。如果确实如此,您将需要找到一种方法来运行您的程序,同时减少消费者的内存。