加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP警告:exec()无法fork

发布时间:2020-12-13 18:22:42 所属栏目:PHP教程 来源:网络整理
导读:所以这里有一些关于我的设置的背景信息.用apache和php 5.2.17运行Centos.我有一个网站,列出了许多不同零售商网站的产品.我有用于从每个网站获取产品的爬虫脚本.由于每个网站都不同,因此必须自定义每个爬虫脚本以抓取特定零售商网站.基本上我每个零售商都有1
所以这里有一些关于我的设置的背景信息.用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无法分叉或甚至更好的方式来处理这些过程,以便一起解决错误?是否存在我应该研究的过程限制或某种性质的过程?在此先感谢您的帮助!

流程限制

“Is there a process limit I should look into”

有人(系统管理员?)出于安全原因限制了最大用户进程,这是可疑的.你能试试吗?

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

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

echo system("ulimit -a");

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

错误处理

“even a better way to handle these processes as to get around the error all together?

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读