使用巨大的PHP脚本避免504网关超时

5

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

set_time_limit(0);
ignore_user_abort(1);

我的脚本里面都有设置,但是大约30分钟到1小时后,脚本就停止了,并且在我的浏览器中出现了504 Gateway Time-out的消息。我是否需要在Apache或PHP中添加一些内容以防止超时?或者我应该以不同的方式运行脚本?

4个回答

8

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

一定的。您应该从命令行(CLI)运行您的脚本。


6
如果我要实现这样的东西,我会使用两个不同的脚本:
  • A. process_controller.php
  • B. process.php
工作流程应该是:
  1. 用户通过浏览器调用脚本A
  2. 脚本A使用system()或exec()启动脚本B,并通过命令行传递“进程标记”。
  3. 脚本B将执行状态写入共享空间:一个名为标记的文件、数据库表。通常情况下,脚本A也可以通过使用标记作为参考来读取它。
  4. 脚本A包含一个AJAX调用,在轮询中,请求给定标记的进程状态。
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
如果您需要在浏览器中运行它,您应该确保php.ini文件中没有php执行限制,并且在apache下没有设置mod_php(或者您使用的其他内容)的限制。

1
使用 PHP 的 system() 调用一个 shell 脚本,以启动一个服务或后台任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接