这是关于我的设置的背景信息。使用apache和php 5.2.17运行Centos。我有一个网站,列出了许多不同零售商网站的产品。我有爬虫脚本,运行从每个网站抓取产品。由于每个网站是不同的,每个爬虫脚本必须定制,以抓取特定的零售商网站。所以基本上每个零售商我有一个爬虫。在这个时候,我有21个爬虫不断运行,以收集和更新这些网站的产品。每个爬虫都是一个php文件,一旦完成了php脚本,它就会检查,以确保它是唯一运行的实例,并且在脚本的最末端,它使用exec再次启动自己,而原始实例关闭。这有助于防止内存泄漏,因为每个爬行器在关闭之前重新启动。不过,最近我将检查爬虫脚本,并注意到其中一个脚本不再运行,在错误日志中我发现了以下内容。
PHP Warning: exec() [<a href='function.exec'>function.exec</a>]: Unable to fork [nice -n 20 php -q /home/blahblah/crawler_script.php >/dev/null &]这是什么应该再次启动这个特定的爬虫,然而,因为它是“无法叉”,它从来没有重新启动和最初的实例的爬虫结束,它通常这样做。
显然,这不是一个权限问题,因为这21个爬虫脚本在运行结束时每5或10分钟运行一次这个exec命令,而且大部分时间它都按其应有的方式工作。这种情况似乎一天可能会发生一两次。这似乎是一个限制,因为我只是最近才开始看到这种情况发生,因为我添加了我的第21次爬虫。并且它并不总是得到这个错误的相同的爬虫,它将是他们中的任何一个在一个随机的时间内无法发送它的重新启动的exec命令。
有没有人知道是什么原因导致php无法分叉,或者可能是一个更好的方法来处理这些进程,从而避免错误的发生?是否有一个过程限制,我应该调查或类似的性质?提前感谢您的帮助!
发布于 2013-12-18 04:17:40
过程极限
“是否存在我应该研究的过程限制?”
怀疑有人(系统管理员?)设置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, &$ret_val);
if ($ret_val != 0)
{
// do stuff here
}
else
{
echo "success\n";
}发布于 2016-02-24 21:40:46
在我的例子中(大型PHPUnit测试套件),当进程达到57%的内存使用率时,它会说是unable to fork。因此,还有一件事情需要注意,它可能不是进程限制,而是内存。
发布于 2016-05-17 09:13:25
我遇到了同样的问题,我尝试了这个,它对我起了作用;
ulimit -n 4096https://stackoverflow.com/questions/20648949
复制相似问题