将PHP脚本拆分为块以避免max_execution_time

时间:2016-01-05 14:31:56

标签: php pdf

G'所有,

这实际上是我提出的第一个问题,但是我使用堆栈溢出它的超棒搜索功能,但我已经停止了。

我已经编写了一些PHP代码,它基本上为澳大利亚机场提供用户输入,获取与飞机类型相关的PDF(无论出于何种原因,发布者将其作为单个PDF格式发布&#39 ; s),并将它们放入一个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循环,然后从我离开的地方拿起它?或者是时候获得新的托管?

提前干杯!

3 个答案:

答案 0 :(得分:1)

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

感谢您的建议!

答案 1 :(得分:0)

我的建议是使用AJAX请求,按文件分割每个请求。

这是我如何接近它:

  1. 请求生成$ pos数组并以JSON格式返回。
  2. 通过传递$ po及其在数组中的位置(假设是$ chartNumber)来请求生成每个文件。
  3. 检查是否在jquery中生成了最后一个文件(返回true),并调用脚本编写最终文件,返回文件名以供下载。
  4. 但是,当然最好的解决方案是切换到云托管。我个人使用digitalocean.com,我在这里运行大型PHP提取脚本没有任何限制。

答案 2 :(得分:0)

将操作分解为批处理并按顺序运行它们实际上需要的时间比您当前所做的要长。如果性能瓶颈在于创建组件,则更好的解决方案是generate the parts in parallel

  

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

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