2011-09-29 44 views
8

我已经创建了一个php/mysql刮板,它运行良好,并且不知道如何最有效地将它作为cron作业运行。php cron作业可以运行多长时间?我做得对吗?

有300个网站,每个网站有20 - 200页被刮掉。需要4到7个小时才能清除所有网站(取决于网络延迟和其他因素)。刮板需要每天进行一次完整的运行。

我应该将其作为一个运行整个4-7小时的cron作业,还是每隔7小时运行一次,或者每隔10分钟运行一次,直至完成?

该脚本被设置为从所述的cron这样运行:

while($starttime+600 > time()){ 
    do_scrape(); 
} 

哪个将运行do_scrape()函数,它在一个时间擦伤10页的URL,直到(在这种情况下)600秒具有通过。 do_scrape可能需要5到60秒才能运行。

我在这里问这里,因为我无法在网上找到关于如何运行这个的任何信息,并且对每天运行这个有点警惕,因为php并没有真正设计为7小时运行一个脚本。

我写了它在香草PHP/MySQL,它运行在削减debian VPS只安装了lighttpd/mysql/php5。我用6000秒(100分钟)的超时运行它没有任何问题(服务器没有摔倒)。

任何有关如何去完成这项任务的意见,表示赞赏。我应该注意什么等。?还是我要执行这一切都错了?

谢谢!

回答

8

长时间运行写得很好的PHP脚本没有任何问题。我有几个字母已经连续运行好几个月了。只要注意你的记忆使用情况,你应该没问题。

也就是说,你的架构是非常基础的,并且不可能很好地扩展。

你可能会考虑从一个巨大的整体脚本转向一个分而治之的策略。例如,听起来你的脚本正在为每个URL都发出同步请求。如果这是真的,那么大多数7小时的运行时间都是空闲地等待来自某个远程服务器的响应。

在理想的世界中,你不会写这种事情的PHP。一些处理线程的语言可以很容易地通过回调来完成异步http请求。这就是说,如果我是用PHP做这件事的话,我的目标是要有一个脚本来踢N个孩子从URL抓取数据,并将响应数据粘贴在某种工作队列中,然后再将另一个脚本几乎一直运行,处理它在队列中找到的任何工作。

然后,您只需让您的fetcher-script-manager每小时运行一次,就可以管理一些获取数据的工作进程(在parellel中,所以延迟不会杀死您),并将工作粘贴到队列中。然后,队列分析器将看到队列中的工作并对其进行处理。

取决于你如何实现队列,这可以很好地扩展。你可以有多个盒子获取远程数据,并将其粘贴在一些中央队列框(使用mysql或memcache实现的队列或其他)。你甚至可以想象有多个箱子正在排队工作。

当然,魔鬼是在细节中,但这种设计通常比单线程抓取进程重复脚本更具可伸缩性和通用性。

+0

欢呼声回复。由于后处理的数量很少(每〜2-5秒的页面请求约150ms),我们决定坚持使用单片结构而不是卷曲脚本和处理脚本。 我们使用多卷曲一次获得10个URL,所以它是半多线程的,虽然不理想。 Python将是理想的,但它是一个用我们所知道的(php)来快速完成工作的例子。 谢谢! – Rob

2

您应该没有问题,一天运行一次即可完成。我就是这样做的。如果php通过Web服务器提供服务,超时是一个大问题,但是由于您直接通过php可执行文件解释,所以这是可以的。不过,我会建议你使用python或其他更友好的东西。