假设我已经创建了一个网页抓取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
}
没关系,过程是,
- 在浏览器上打开
getdata.php
- 等
- 仍然等待,因为大约有一百万页将被抓取。
- 等
- 最后请求超时。
- 失败
所以问题是我不知道如何使这个过程合理。 在浏览器上打开页面并等待它完成抓取 URL,我认为这是一种非常糟糕的做法。
如何使 getdata.php 像 cron 一样在后台运行?
最好的方法是什么?
谢谢。
除了@hackartists答案之外,我还要补充一点,根本不要通过浏览器调用这个PHP页面。 相反,请从命令行调用它
http://www.php.net/manual/en/features.commandline.introduction.php
在浏览器上打开 getdata.php
应该是
调度 getdata.php 使用 cron 从命令行运行
此外,记录成功或失败,以便您可以设置一些日志文件监控以了解您的网络抓取作业何时失败(毕竟,您不想每天坐在浏览器前并自己监控)。
在
代码顶部使用
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 。 在杀死时间硬编码可能是一个好主意,如果在某个小时后它会停止,以免它运行超过一天并且第二个实例启动并且您同时运行多个实例。