【问题标题】:How to run PHP process for longer time如何长时间运行 PHP 进程
【发布时间】:2015-01-20 11:30:03
【问题描述】:

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

但是完成爬取过程需要一天多的时间

我什至用过

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

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

但是进程仍然在运行并且在停止之后对于一些链接工作正常,尽管进程不断循环浏览器并且没有生成错误日志

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

提前致谢

【问题讨论】:

  • 如果 simple-html-dom 速度慢或占用内存,您可以考虑this replacement

标签: php curl web-scraping screen-scraping


【解决方案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(打印到控制台)或通过您的系统进程管理器。这样,您将更接近于找出脚本的实际问题。

【讨论】:

    【解决方案2】:

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

    如果递归调用url,内存可以填满。

    尝试做一个循环并使用数据库:

    扫描一个页面,如果数据库中还没有建立的链接,则存储它。 完成后,进行选择,并获取第一个未扫描的 URL {循环}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多