如何运行PHP进程更长的时间

时间:2015-01-20 11:30:03

标签: php curl web-scraping screen-scraping

我正在使用php和curl进行网络抓取以废弃整个网站

但完成抓取过程需要一天以上的时间

我甚至用过

ignore_user_abort(true);
set_error_handler(array(&$this, 'customError'));
set_time_limit (0);
ini_set('memory_limit', '-1');

我在使用简单的html DOM抓取页面后也清除了内存 从页面获取抓取详细信息

但是仍然进程运行并且在某些链接之后运行良好,之后它会停止,尽管进程继续循环浏览器并且没有生成错误日志

无法理解似乎是什么问题。
另外我需要知道PHP是否可以 运行过程两三天?

提前致谢

2 个答案:

答案 0 :(得分:1)

PHP可以在你需要的时候运行,但事实上它在每次看起来都是相同的点后停止表明你的脚本存在问题。

你说你已经尝试了ignore_user_abort(true);,但后来表示你是通过浏览器运行的。此设置仅适用于命令行,因为关闭此类脚本的浏览器窗口无论如何都不会终止该过程。

你有xDebug吗? simplehtmlDOM会在格式错误的html(例如断开的链接中的链接)中抛出一些相当有趣的错误。 xDebug会在浏览器中抛出MAX_NESTING_LEVEL错误,但不会在控制台中抛出此错误,除非您已使用-d标志明确告知它。

还有很多其他错误,通知,警告等会破坏/停止您的脚本而不会向error_log写入任何内容。

你有任何错误吗?

以这种方式使用cURL时,使用多个cURL来并行处理URL非常重要 - 根据您的环境,一次可以轻松实现150-200个URL。

如果您确实已经解决了内存问题并释放了所有可用空间,那么问题必须是它正在抓取的特定页面。

我建议您通过控制台运行脚本,并确切地知道它何时停止分别运行该URL - 至少这将表明它是否是内存问题。

还要记住,set_error_handler(array(&$this, 'customError'));不会捕获PHP可以抛出的每种错误类型。

下次运行时,通过控制台调试以显示进度,并通过PHP(打印到控制台)或通过系统进程管理器跟踪实际内存使用情况。通过这种方式,您可以更加了解脚本的实际问题。

答案 1 :(得分:0)

即使您设置了无限内存,也存在物理限制。

如果以递归方式调用URL,则可以填充内存。

尝试循环并使用数据库:

扫描页面,如果数据库中尚未存在,则存储已创建的链接。 完成后,执行选择,并获取第一个未扫描的URL {}环