【问题标题】:Splitting PHP script into chunks to avoid max_execution_time将 PHP 脚本拆分为块以避免 max_execution_time
【发布时间】:2016-01-05 14:31:56
【问题描述】:

万事如意,

这实际上是我提出的第一个问题,但是我虔诚地使用堆栈溢出及其出色的搜索功能,但我在这里停下来。

我一直在编写一些 PHP 代码,这些代码基本上接受澳大利亚机场的用户输入,获取与飞机类型相关的 PDF(无论出于何种原因,出版商将它们作为单个 PDF 发布),并将它们放入一个 PDF文件。我现在已经让它运行得相当顺利,但计划中的最后一个问题是,当你放置在许多机场(或有很多 PDF 的机场)时,它超过了 max_execution_time 并给我一个 500 内部服务器错误。不幸的是,我使用 GoDaddy 的共享主机,无法在 php.ini 或带有 set_time_limit() 的脚本中更改这一点。这家伙有同样的问题,我和他一样一无所获:PHP GoDaddy maximun execution time not working

无论如何,除了切换我的主机之外,我唯一的想法就是分解 php 代码,这样它就不会一次全部运行。唯一的问题是我正在运行一个 foreach 循环,我完全不知道从哪里开始。

这是我保存 PDF 的代码:

foreach ($pos as $po){
    file_put_contents("/dir/temp/$chartNumber$po", file_get_contents("http://www.airservicesaustralia.com/aip/current/dap/$po"));   
    $chartNumber = $chartNumber + 1;    
}

数组 $pos 是通过网站的正则表达式搜索生成的,只需要很少的时间,保存 PDF 文件让我很头疼,如果它设法得到所有文件,合并可能需要一点时间这段代码的时间也是如此:

exec("gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=/dir/finalpdf/$date.pdf /dir/temp/*.pdf");

我的问题是,有没有什么办法可以在单独的脚本中执行每个 foreach 循环,然后从中断的地方继续?还是该换新主机了?

提前干杯!

【问题讨论】:

  • 瓶颈是什么?获取文档还是调用 ghostscript?

标签: php pdf


【解决方案1】:

我的建议是使用 AJAX 请求,将每个请求拆分为每个文件。

以下是我的处理方式:

  1. 发出请求以生成 $pos 数组并以 JSON 格式返回。
  2. 通过传递 $po 及其在数组中的位置(假设为 $chartNumber),请求生成每个文件。
  3. 检查最后一个文件是否在 jquery 中生成(返回 true),并调用脚本写入最终文件,返回文件名以供下载。

当然,最好的解决方案是切换到云托管。我个人使用 digitalocean.com 运行大型 PHP 获取脚本,没有任何限制。

【讨论】:

  • 根据其他地方的答案,这如何更快?
  • 它实际上更慢 :) 但是为了避免在 PHP 中达到 max_execution_time,您必须分段调用脚本,因此每个单独部分的执行不应超过 max_execution_time
  • 那么你是从什么地方提出请求的?你在哪里组装最终的 PDF?如果这是一个 PHP 脚本,那么 it 将达到最大执行时间:(
  • 阿贾克斯。基本上,您需要创建一个基本的 Web 界面,通过 javascript 发出这些请求,调用 PHP。
  • 抱歉 Edvinas - 我不明白如何解决 PHP 脚本运行时间不超过最大执行时间的问题。发出 AJAX 请求的 PHP 脚本仍然需要等待被调用的脚本执行。减少执行时间的唯一方法是并行运行从属脚本
【解决方案2】:

我接受了 Edvinas 的建议并转移到 digitalocean.com,现在脚本运行没有任何问题。我还设法通过使用 parallelcurl 下载每个文件来减少时间,它一次下载 5 个,所以我可以下载并生成一个完整的 100 页文件(比我预期的要大)不到5分钟。我想除了在我自己的服务器上托管 PDF(在这种情况下我可能会错过更新的图表),这将尽可能快地运行它。

感谢您的建议!

【讨论】:

    【解决方案3】:

    将操作分解成批次并按顺序运行实际上会比您当前执行的操作花费更长的时间。如果性能瓶颈在于组件的创建,更好的解决方案是generate the parts in parallel

    使用此代码进行组合也可能需要一些时间

    嗯,解决任何性能问题的第一部分应该是分析以确定瓶颈。如果没有对主机的直接管理员访问权限,您将无法加快单行 shell 脚本的执行速度 - 但如果您可以运行 shell 命令,那么您可以运行 background job outside of the webserver process group

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多