我有一个PHP脚本,需要很长时间(5-30分钟)才能完成。以防万一,脚本使用curl从另一台服务器上抓取数据。这就是它花费这么长时间的原因;它必须等待每个页面加载,然后才能处理它并移动到下一个页面。
我希望能够启动脚本,直到它完成,这将在数据库表中设置一个标志。
我需要知道的是如何能够在脚本结束运行之前结束http请求。另外,php脚本是最好的方式吗?
发布于 2010-02-06 17:26:54
更快更脏的方法是在php中使用ignore_user_abort
函数。这基本上是说:不要关心用户做了什么,运行这个脚本直到它完成。如果它是一个面向公众的站点,这就有点危险了(因为如果脚本被启动20次,最终可能会有20++版本的脚本同时运行)。
“干净”的方式(至少是IMHO)是,当你想要启动进程并每小时(大约)运行一次cronjob以检查是否设置了该标志时,设置一个标志(例如在db中)。如果已设置,则长时间运行的脚本将启动;如果未设置,则不会发生任何事情。
发布于 2010-02-06 17:49:56
您可以使用exec或system启动后台作业,然后在其中执行工作。
此外,还有更好的方法来抓取你正在使用的网页。您可以使用线程方法(多个线程一次处理一个页面),或者使用eventloop (一个线程同时处理多个页面)。我个人使用Perl的方法是使用AnyEvent::HTTP。
发布于 2010-02-06 17:35:52
不,PHP不是最好的解决方案。
我不确定是Ruby还是Perl,但是使用Python你可以把你的页面抓取器重写成多线程的,它的运行速度可能至少快20倍。编写多线程应用程序可能是一个挑战,但我编写的第一个Python应用程序是多线程页面抓取器。您可以通过使用其中一个shell执行函数从PHP页面中简单地调用Python脚本。
https://stackoverflow.com/questions/2212635
复制相似问题