【发布时间】:2014-01-06 02:07:28
【问题描述】:
所以这里有一些关于我的设置的背景信息。使用 apache 和 php 5.2.17 运行 Centos。我有一个网站,列出了许多不同零售商网站的产品。我有爬虫脚本运行以从每个网站抓取产品。由于每个网站都不同,因此必须自定义每个爬虫脚本以爬取特定的零售商网站。所以基本上我每个零售商都有 1 个爬虫。此时我有 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 个爬虫后,我才刚刚开始看到这种情况发生。而且它并不总是同一个爬虫得到这个错误,它会是随机时间中的任何一个无法分叉其重新启动执行命令的爬虫。
有没有人知道是什么导致 php 无法分叉,或者甚至是更好的方法来处理这些进程以一起解决错误?是否有我应该研究的过程限制或类似的东西?提前感谢您的帮助!
【问题讨论】: