我已经创建了一个php/mysql刮板,它运行得很好,但我不知道如何将它作为cron作业来最有效地运行。
有300个站点,每个站点都有20 - 200个页面被抓取。抓取所有站点需要4-7个小时(取决于网络延迟和其他因素)。刮刀需要每天做一次完整的运行。
我应该将其作为1个cron作业运行整个4-7个小时,还是每小时运行7次,或者每10分钟运行一次,直到完成?
该脚本设置为从cron运行,如下所示:
while($starttime+600 > time()){
do_scrape();
}它将运行do_scrape()函数,该函数一次抓取10个urls,直到(在本例中)经过600秒。do_scrape可能需要5- 60秒才能运行。
我在这里问,因为我在网上找不到任何关于如何运行这个程序的信息,并且我对每天运行这个程序有点谨慎,因为php并不是真的被设计成作为一个脚本运行7个小时。
我用普通的PHP/mysql写的,它运行在只安装了lighttpd/mysql/php5的cut down debian VPS上。我运行它的时候超时6000秒(100分钟),没有任何问题(服务器没有倒下)。
任何关于如何完成这项任务的建议都是值得感谢的。我应该注意什么,等等?或者我是不是在执行这一切都是错的?
谢谢!
发布于 2011-09-29 11:53:45
长时间运行一个写得很好的PHP脚本并没有错。我有一些脚本已经连续运行了几个月了。只要注意你的内存使用情况,你就不会有问题。
也就是说,您的架构非常基础,并且不太可能很好地扩展。
您可以考虑从大型的整体脚本转移到分而治之的策略。例如,听起来你的脚本对每一个抓取的URL都发出了同步请求。如果这是真的,那么这7个小时的大部分运行时间都在等待某个远程服务器的响应。
在理想的情况下,你不会写这样的PHP。一些处理线程并可以轻松地使用回调进行异步http请求的语言会更适合。
也就是说,如果我在PHP中做这件事,我的目标是有一个脚本来踢N个从URL中抓取数据的孩子,并将响应数据放在某种工作队列中,然后是另一个几乎一直运行的脚本,处理它在队列中找到的任何工作。
然后你只需让你的fetcher-script-manager每小时运行一次,它会管理一些获取数据的工作进程(以并行方式,所以延迟不会杀死你),并将工作放在队列中。然后,队列计算器看到队列上的工作,并对其进行处理。
根据您实现队列的方式,这可以很好地扩展。您可以让多个机器获取远程数据,并将其粘贴到某个中央队列机器上(使用mysql、memcache或其他语言实现的队列)。您甚至可以想象有多个框从队列中获取工作并完成工作。
当然,问题在于细节,但这种设计通常比单线程的fetch-process-repeat脚本更具伸缩性,而且通常更健壮。
发布于 2011-09-29 11:38:52
你应该不会有问题,每天运行一次,直到完成。这就是我要做的。如果php是通过web服务器提供服务的,那么超时是一个大问题,但是既然你是直接通过php可执行文件来解释的,这是可以的。不过,我建议您使用python或其他对任务更友好的工具。
https://stackoverflow.com/questions/7592126
复制相似问题