批处理如何解决PHP超时问题


9

Drupal 7文档将Batch API引入为:

该函数允许将表单处理分散到多个页面请求中,从而确保不会因PHP超时而中断处理

我的意思是说Batch为开发人员处理了与超时有关的问题。

但是,其他帖子(例如,批处理API在内部如何工作?)暗示开发人员有责任在等待另一个用户到达并再次调用Batch之前,告诉Batch要做多少工作—从而避免了超时。

如果后者是正确的,那么我认为Batch不保证作业不会超时。批次是否提供任何保证?是否由开发人员猜测在超时之前可以处理多少个批处理?

谢谢!


3
这是一个非常该死的好问题,谢谢:-)
Chapabu

Answers:


5

Batch简单地说:“我最多将执行N项操作,然后刷新页面……并执行更多操作。”

如果您说每个作业块执行5个项目,每个项目花费5秒,那么默认php超时值为30秒就可以了。

如果您说每个作业块执行20个项目,每个项目花费5秒,则每个请求的工作量太高,可能会超时。

请记住,当您使用PHP时,页面的生命周期是request in -> response out。并且您的网络服务器可以使每个线程在有限的时间内保持活动状态。您必须解决该超时问题-Batch API可以帮助您完成。

使用诸如Migrate之类的社区模块在服务器端运行Drush等东西可以帮助您完全避免超时(如果需要)。

编辑

还请记住,每个页面请求都是完整的drupal引导程序,并且Batch API从中断的地方开始提取。使用Batch API时,这是最昂贵的操作之一,每N个项目会重新加载drupal。这就是为什么人们一直在研究服务器端技术来创建节点,导入内容等的原因。Batch API非常适合简单,重复的任务。但是在复杂的数据集或非常大的数据集中它往往会崩溃。


1
您是说每次页面加载都会调用Batch吗?即。批处理醒来,看是否有任何任务(例如穷人的cron)?这被怀疑;但是,我不明白您为什么强调流程的计算成本。难道这不是额外的成本,只是几次比较以及Batch在队列中进行的任何工作,还是Batch做一些特别的事情,例如通过加载页面来调用自身?
烤面包机

1
请参阅下面的kiamlaluno答案。批处理进度条页面仅在X秒后重新加载。如果您在[网络]标签中加载Firebug或Chrome,然后运行Batch API作业,请查看这些URL,您将简单地看到同一页面,其中包含不同的项目偏移量和块大小。每个单页请求自举所有drupal的计算成本很高。例如,运行Drush sql导入仅加载一次drupal。对于大型数据集和问题,批处理API开销过高。
tenken

3

批处理API只需通过即可注册_batch_shutdown()为关机功能register_shutdown_function()。该函数只是将正在执行的批处理的当前状态保存在数据库表中。
Batch API不能保证您正在执行的操作不会在中间被中断。这就是批处理操作通常执行简单操作的原因,例如从保存表中读取数据库行并将数据库行保存在另一个表中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.