首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个php cron作业可以运行多长时间/我做得对吗?

一个php cron作业可以运行多长时间/我做得对吗?
EN

Stack Overflow用户
提问于 2011-09-29 11:28:18
回答 2查看 3.1K关注 0票数 8

我已经创建了一个php/mysql刮板,它运行得很好,但我不知道如何将它作为cron作业来最有效地运行。

有300个站点,每个站点都有20 - 200个页面被抓取。抓取所有站点需要4-7个小时(取决于网络延迟和其他因素)。刮刀需要每天做一次完整的运行。

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

该脚本设置为从cron运行,如下所示:

代码语言:javascript
复制
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分钟),没有任何问题(服务器没有倒下)。

任何关于如何完成这项任务的建议都是值得感谢的。我应该注意什么,等等?或者我是不是在执行这一切都是错的?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-29 11:53:45

长时间运行一个写得很好的PHP脚本并没有错。我有一些脚本已经连续运行了几个月了。只要注意你的内存使用情况,你就不会有问题。

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

您可以考虑从大型的整体脚本转移到分而治之的策略。例如,听起来你的脚本对每一个抓取的URL都发出了同步请求。如果这是真的,那么这7个小时的大部分运行时间都在等待某个远程服务器的响应。

在理想的情况下,你不会写这样的PHP。一些处理线程并可以轻松地使用回调进行异步http请求的语言会更适合。

也就是说,如果我在PHP中做这件事,我的目标是有一个脚本来踢N个从URL中抓取数据的孩子,并将响应数据放在某种工作队列中,然后是另一个几乎一直运行的脚本,处理它在队列中找到的任何工作。

然后你只需让你的fetcher-script-manager每小时运行一次,它会管理一些获取数据的工作进程(以并行方式,所以延迟不会杀死你),并将工作放在队列中。然后,队列计算器看到队列上的工作,并对其进行处理。

根据您实现队列的方式,这可以很好地扩展。您可以让多个机器获取远程数据,并将其粘贴到某个中央队列机器上(使用mysql、memcache或其他语言实现的队列)。您甚至可以想象有多个框从队列中获取工作并完成工作。

当然,问题在于细节,但这种设计通常比单线程的fetch-process-repeat脚本更具伸缩性,而且通常更健壮。

票数 8
EN

Stack Overflow用户

发布于 2011-09-29 11:38:52

你应该不会有问题,每天运行一次,直到完成。这就是我要做的。如果php是通过web服务器提供服务的,那么超时是一个大问题,但是既然你是直接通过php可执行文件来解释的,这是可以的。不过,我建议您使用python或其他对任务更友好的工具。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7592126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档