0

所以这是低调:

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

我所做的代码是获取上传的文件,然后......

  1. 循环通过 xml
  2. 获取文件中的所有提要下载链接
  3. 下载每个xml文件
  4. 单独循环每个文件的每个 xml 数组,并根据每个项目的来源(即文件名)将每个项目的信息插入数据库

现在有什么办法可以让我以某种方式排队或将工作负载分成多个文件吗?我知道代码可以完美运行,并在插入之前检查每个项目是否存在,但我被困在 execution_limit 附近。

任何建议表示赞赏,如果您有任何问题,请告诉我!

4

3 回答 3

2

你知道你可以max_execution_time通过注册一个关闭处理程序来欺骗吗?在该代码中,您可以再运行 30 秒 ;-)

好的,现在来点更有用的。

您可以在数据库中添加一个小队列表来跟踪您的位置,以防脚本中途终止。

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

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

于 2012-05-10T04:16:37.707 回答
2

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

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

检查以下资源:

过程控制扩展

特别是:

pcntl-exec

pcntl-fork

于 2012-05-10T04:21:14.337 回答
0

我就是这种情况。我的方法类似于杰克的

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

对于任务我做了两个模块,Import 用于实际处理;TaskManagement 用于处理这些任务。
为了调用 TaskManager,我使用 CRON,现在这取决于虚拟主机为您提供什么,如果它足够的话。还有一个 WebCron。

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

然后当然要研究性能改进、缓存、跳过不需要/未更改的内容等。

于 2013-12-01T10:23:44.040 回答