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

时间:2010-10-15 21:39:27

标签: php apache timeout

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

set_time_limit(0);
ignore_user_abort(1);

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

4 个答案:

答案 0 :(得分:8)

  

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

当然。您应该从命令行(CLI

运行脚本

答案 1 :(得分:6)

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

  • 甲。 process_controller.php
  • B中。 process.php

工作流程应为:

  1. 用户使用浏览器调用脚本A
  2. 脚本A使用system()或exec()启动脚本B,并通过命令行向其传递“进程令牌”。
  3. 脚本B将执行状态写入共享空间:名为令牌的文件,数据库表。一般情况下,脚本A也可以通过使用令牌作为参考
  4. 来读取
  5. 脚本A包含一个AJAX调用,在轮询中,向脚本A询问给定令牌的进程状态
  6. 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>
    

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

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

答案 2 :(得分:1)

使用php的system()来调用启动服务/后台任务的shell脚本。

答案 3 :(得分:1)

如果你需要在浏览器中运行它,你应该确保php.ini文件中没有php执行限制,但是在mod_php(或者你正在使用的是什么)中没有设置限制阿帕奇。