所以这是低谷:
我正在开发的客户端在 HostGator 上,它将他们的max_execution_time限制为 30 秒,并且无法覆盖(我已经尝试并确认它不能通过他们的支持和 wiki(
我让代码做的是获取上传的文件并...
- 循环通过 XML
- 获取文件中的所有源下载链接
- 下载每个 XML 文件
- 单独遍历每个文件的每个XML数组,并根据每个项目的来源(即文件名(将每个项目的信息插入数据库
现在有什么方法可以以某种方式将其排队或将工作负载拆分为多个文件?我知道代码完美运行,并在插入之前检查每个项目是否存在,但我无法绕过execution_limit。
任何建议不胜感激,如果您有任何问题,请告诉我!
时间限制仅在通过 Web 服务器执行 PHP 脚本时有效,如果您从 CLI 或作为后台进程执行脚本,它应该可以正常工作。
请注意,如果您不够小心,执行外部脚本有些危险,但这是一个有效的选项。
检查以下资源:
过程控制扩展
具体来说:
PCNTL-exec
PCNTL-fork
您是否知道可以通过注册关闭处理程序来欺骗max_execution_time
?在该代码中,您可以再运行 30 秒 ;-(
好的,现在做一些更有用的事情。
您可以在数据库中添加一个小队列表,以跟踪您的位置,以防脚本中途死亡。
- 获取所有下载链接后,将它们添加到表中
- 然后你下载一个文件并处理它;完成后,你从队列中勾选(从中删除(
- 每次运行时,您都会检查队列中是否还有剩余工作
要做到这一点,你需要请求该URL几次;也许使用JavaScript继续重新加载,直到工作完成?
我处于这种情况。我的方法与杰克的方法相似
- 接受执行时间限制将简单地存在
- 设计应用程序以应对突然退出(查看
register_shutdown_function
( - 识别流程中所有耗时的部分
- 持续保存过程进度
- 修改您的组件,以便它们能够从任意点开始,例如 XML 文件中的位置或继续下载要获取的 XML 链接列表
对于任务,我制作了两个模块,导入用于实际处理;任务管理,用于处理这些任务。
为了调用任务管理器,我使用CRON,现在这取决于虚拟主机为您提供什么,如果足够的话。还有一个WebCron。
Jack 的 JavaScript 方法的优点是它只在需要时添加请求。如果没有要执行的任务,脚本运行时将非常短,并且可能被夸大*,但仍然如此。缺点是它需要用户一直等待,而不是关闭选项卡/浏览器,JS支持等。*( 在这种情况下,可能比 1 个用户点击 1 次要求低得多
然后当然要研究性能改进,缓存,跳过不需要/未更改的内容等。