max_execution_time替代方案

时间:2012-05-10 03:50:16

标签: php for-loop timeout execution-time php-ini

所以这是低点:

我正在开发的客户端是HostGator,它将max_execution_time限制为30秒并且无法覆盖(我已经尝试并确认它不能通过他们的支持和维基)

我所做的代码就是上传文件......

  1. 循环通过xml
  2. 获取文件中的所有Feed下载链接
  3. 下载每个xml文件
  4. 单独循环遍历每个文件的每个xml数组,并根据它们的来源(即文件名)将每个项目的信息插入数据库中
  5. 现在有什么方法我可以以某种方式排队或将工作负载分成多个文件?我知道代码完美无瑕地工作,并在插入之前检查每个项目是否存在,但是我无法绕过execution_limit。

    如有任何建议,请与我们联系。

3 个答案:

答案 0 :(得分:2)

您是否知道可以通过注册关机处理程序欺骗max_execution_time?在该代码中,您可以再运行30秒; - )

好的,现在换一些更有用的东西。

您可以在数据库中添加一个小型队列表,以便在脚本中途死亡的情况下跟踪您的位置。

  • 获取所有下载链接后,将其添加到表格
  • 然后下载一个文件并进行处理;当你完成后,你从队列中检查它们(删除)
  • 每次运行时,检查队列中是否还有工作

为此,您需要多次请求该URL;也许使用JavaScript来继续重新加载直到工作完成?

答案 1 :(得分:2)

时间限制仅在通过Web服务器执行PHP脚本时有效,如果您从CLI执行脚本或作为后台进程,它应该可以正常工作。

请注意,如果您不够谨慎,执行外部脚本会有些危险,但这是一个有效的选项。

检查以下资源:

Process Control Extensions

具体而言:

pcntl-exec

pcntl-fork

答案 2 :(得分:0)

我处于这样的境地。我的方法类似于杰克的

  • 接受执行时间限制就在那里
  • 设计应用程序以应对突然退出(查看register_shutdown_function
  • 确定流程中所有时间要求严格的部分
  • 持续保存流程进度
  • 修改您的组件,以便它们能够从任意点开始,例如XML文件中的位置或继续下载您要提取的XML链接列表

对于任务我做了两个模块,导入实际处理;任务管理处理这些任务。
对于调用TaskManager我使用CRON,现在这取决于webhosting提供给你的东西,如果它足够了。还有一个WebCron。

Jack的JavaScript方法的优点是它只在需要时添加请求。如果没有要执行的任务,脚本运行时将非常短并且可能被夸大了*,但仍然如此。缺点是需要用户一直等待,而不是关闭标签/浏览器,JS支持等。 *)在这样的时刻,点击1个用户的要求可能要低得多

然后当然要考虑性能改进,缓存,跳过不需要/没有改变等等。