使用庞大的PHP脚本防止504网关超时

tsp*_*sp3 4 php apache timeout

我目前在我的本地计算机(Windows)上运行Apache服务器(2.2),我用它来运行一些PHP脚本来处理一些繁琐的工作.其中一个脚本涉及大量移动,调整大小和下载/上载文件到另一台服务器.我非常希望脚本能够不断运行,这样我就不必每次超时都重新启动脚本.

set_time_limit(0);
ignore_user_abort(1);
Run Code Online (Sandbox Code Playgroud)

两者都在我的脚本中设置,但是大约30分钟到一小时后脚本停止,我在浏览器中收到504网关超时消息.我在Apache或PHP中缺少什么来防止超时?或者我应该以不同的方式运行脚本?

dev*_*ler 8

或者我应该以不同的方式运行脚本?

当然.您应该从命令行(CLI)运行脚本


Ces*_*sar 6

如果我应该实现这样的东西我会你2个不同的脚本:

  • A. process_controller.php
  • B. process.php

工作流程应该是:

  1. 用户使用浏览器调用脚本A.
  2. 脚本A使用system()或exec()启动脚本B,并通过命令行向其传递"进程令牌".
  3. 脚本B将执行状态写入共享空间:名为标记的文件,数据库表.一般来说,脚本A也可以通过使用令牌作为参考来读取
  4. 脚本A在轮询中包含一个AJAX调用,它向脚本A询问给定令牌的进程状态

Ajax民意调查:

<script>  
 var $myToken;  
 function ajaxPolling()
 {
   $.get('process_controller.php?action=getStatus&token='+$myToken, function(data) {
    $('.result').html(data);
 });

 }
 setInterval("ajaxPolling()",60*1000); //Every minute
</script>
Run Code Online (Sandbox Code Playgroud)

关于两个进程之间的通信有一些考虑因素,具体取决于您可以并行运行脚本B的实例数

  1. 只有一个:您不需要随机/唯一令牌
  2. 每位用户一个: session_start(); $token = session_id();
  3. 每个用户不止一个:session_start(); $ token = session_id().microtime();