我已经创建了一个运行良好的php / mysql scraper,并且不知道如何最有效地将其作为cron作业运行。
有300个网站,每个网站都有20到200页被抓取。刮掉所有站点需要4-7个小时(取决于网络延迟和其他因素)。刮刀需要每天完成一次。
我应该将其作为1个cron作业运行,运行整个4-7个小时,或者每小时运行7次,或者每10分钟运行一次直到完成?
脚本设置为从cron运行,如下所示:
while($starttime+600 > time()){
do_scrape();
}
将运行do_scrape()函数,该函数一次擦除10个URL,直到(在这种情况下)600秒已经过去。 do_scrape可能需要5到60秒才能运行。
我在这里问,因为我无法在网上找到有关如何运行此信息的任何信息,并且对于每天运行这一点非常谨慎,因为php并非真正设计为在7小时内作为单个脚本运行。 / p>
我在vanilla PHP / mysql中编写它,它运行在减少debian VPS上,只安装了lighttpd / mysql / php5。我已经运行它超时6000秒(100分钟)没有任何问题(服务器没有倒下)。
对于如何执行此任务的任何建议表示赞赏。我应该注意什么......?还是我要执行这一切都错了?
谢谢!
答案 0 :(得分:8)
长时间运行编写良好的PHP脚本没有错。我有一些脚本几乎连续运行了好几个月。只是看你的内存使用情况,你应该没事。
也就是说,您的架构非常基础,并且不太可能很好地扩展。
你可以考虑从一个庞大的单片脚本转变为分而治之的策略。例如,听起来您的脚本正在对每个URL进行同步请求。如果这是真的,那么大部分7小时的运行时间都在等待来自某个远程服务器的响应。
在一个理想的世界里,你不会写这种东西PHP。一些处理线程并且可以通过回调轻松完成异步http请求的语言会更适合。
也就是说,如果我在PHP中这样做,我的目标是创建一个脚本,可以从N个孩子那里获取数据,并将响应数据粘贴到某种工作队列中,然后再添加另一个脚本它几乎一直在运行,处理它在队列中找到的任何工作。
然后你只需要让你的fetcher-script-manager每小时运行一次,它管理一些获取数据的工作进程(在parellel中,所以延迟不会杀死你),并将工作粘在队列上。然后,queue-cruncher会看到队列中的工作并对其进行处理。
根据您实现队列的方式,这可以很好地扩展。您可以使用多个框来获取远程数据,并将其粘贴在某个中央队列框中(使用mysql或memcache或其他任何方式实现队列)。你甚至可以想象有多个盒子从队列中完成工作并完成工作。
当然,魔鬼在细节中,但这种设计通常比单线程fetch-process-repeat脚本更具可伸缩性,通常更强大。
答案 1 :(得分:2)
每天完成一次运行它应该没有问题。这就是我这样做的方式。如果通过Web服务器提供php,则超时是一个大问题,但由于您直接通过php可执行文件进行解释,这是可以的。我会建议你使用python或其他更适合任务的东西。