PHP警告:exec()无法分叉

 mobiledu2502853717 发布于 2023-02-09 15:44

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

PHP Warning:  exec() [function.exec]: Unable to fork [nice -n 20 php -q /home/blahblah/crawler_script.php >/dev/null &]

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

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

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

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

    2023-02-09 15:46 回答
  • 流程限制

    "我是否应该研究过程限制"

    有人(系统管理员?)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";
    }
    

    2023-02-09 15:47 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有