-1

假设我创建了一个网页抓取 PHP 页面 ( getdata.php),它通过 cUrl 获取特定网站页面的内容,而不是将一些有用的信息保存到 txt 文件或数据库中。

的伪代码getdata.php

min = get latest search id from database
max = 1.000.000 (yes one million different pages)

while (min < max) {

  url = "http://www.website.com/page.php?id=".$min
  content = getContentFromURL(url)
  saveUsefulInfoToDb(content)
  min++
  set latest search id as min in database
}

没关系,流程是,

  1. getdata.php在浏览器上打开
  2. 等待
  3. 还是等等吧,因为大约有一百万页会被刮掉。
  4. 等待
  5. 最后请求超时。
  6. 失败

所以问题是我不知道如何使这个过程合理。在浏览器上打开页面并等待它完成抓取 URL,我认为这是一个非常糟糕的做法。

如何让 getdata.php 像 cron 一样在后台运行?

最好的方法是什么?

谢谢。

4

2 回答 2

3

除了@hackartists 的回答,我还要补充一点,根本不要通过浏览器调用这个 PHP 页面。相反,从命令行调用它

http://www.php.net/manual/en/features.commandline.introduction.php

在浏览器上打开 getdata.php

应该

使用 cron 安排 getdata.php 从命令行运行

此外,记录成功或失败,以便您可以设置一些日志文件监控以了解您的网络抓取作业何时失败(毕竟,您不想每天坐在浏览器前并自己监控)。

于 2012-06-08T19:02:21.320 回答
2

在代码顶部使用

set_time_limit(0);
ignore_user_abort(true);

然后每天或在需要时使用 cron 启动它。您肯定希望这是一个后台进程而不是网页。这两行将允许它作为网页或 cmd 行脚本无限期地运行。如果你想把它做成一个网页,你仍然可以使用 cron 来“触发”它,比如

0 0 * * * /usr/bin/curl "http://yoursite.com/getdata.php" >> "/var/www/errors.log"

一些建议,因为我已经这样做了很多次了:一定要创建一个日志功能来打印到一个文件,这样你就可以在它运行时看到它在做什么,或者你将看不到它并且在 php 文件中编写一个终止开关所以您可以告诉它停止运行,而无需使用 unix top 或重新启动 apache。在终止时间内硬编码可能是一个好主意,如果在某个小时后它会停止,以免它运行超过一天并且第二个实例启动并且您同时运行多个实例。

于 2012-06-08T19:01:10.353 回答