【问题标题】:php script longer than max execution time (progress bar)php 脚本长于最大执行时间(进度条)
【发布时间】:2013-01-26 14:59:31
【问题描述】:

我目前从事一个小型项目,其中一些数据是从网络收集的,系统会在这些数据之间创建一些关系。当然它从一开始就不是完美的,所以我需要制作一个脚本来更新我制作的更新脚本的所有连接和关系。

脚本基本上可以工作,但是之后会有一个漂亮的后端,这不是我真正想要的。

脚本需要大约 10 分钟,因为我不只是想从 php 设置 max_execution_time,所以我想到了另一种方法。我没有一次加载 1000 个 sql 条目,而是一次将其剥离到 200 个,并在第一轮结束时重复下一个 200 个。因此我使用了 php http_request。我只是给你看一个精简版的脚本:

require_once 'HTTP/Request.php'; 
$max = $db->query("SELECT COUNT(id) as max FROM db_table");
$lower = $_POST['lower'] ? $_POST['lower'] : 0;
$plus = 250;
$entries = $db->query("SELECT * FROM db_table LIMIT {$lower},{$plus}");

foreach($entries as $entry){
  DO SOME STUFF TO UPDATE THE RELATIONS BETWEEN THE DATA
}

$lower = $lower + $plus;

if($lower <= $max) {
  $request = new HTTP_Request("path to the script"); 
  $request->setMethod(HTTP_REQUEST_METHOD_POST); 
  $request->addPostData("lower", $lower);
  $result = $request->sendRequest(); 
}

就是这样。正如我所说,它有效,因为它是一个新请求,因此它不受 max_execution_time 的影响。但是浏览器只是在加载、加载和加载,过了一会儿它就完成了。但是,我当然不能为进度条之类的东西显示任何刷新的数据。

我看到许多使用 php flush() 的条目,但这对我不起作用,因为(我猜)我用来解决问题的愚蠢方式。 如果您需要在 webspace 上安装某些东西并且您无法更改最大执行时间或安装 http_request,您将如何执行此操作?

正如我所说,稍后它应该看起来像一个进度条。我想我必须使用 ajax,只需将脚本推到每一轮,然后通过 javascript 更新进度条。

你能帮帮我吗?

【问题讨论】:

    标签: php mysql execution-time


    【解决方案1】:

    您仍然遇到 max_execution_time 问题,因为您从 Web 浏览器请求的页面始终处于活动状态,直到 HTTPRequests 完成才完成。尝试使用参数 lower 将页面定位到另一个页面。

    header("Location: myscript.php?lower=$lower");
    

    【讨论】:

    • 不,我对执行时间没有任何问题。执行时间设置为 30 秒,脚本大约需要 12 分钟。如果我只使用标题 - ajax 脚本会注意到吗?
    • 您是从 ajax post/get 命令调用它吗?你没有在你的问题中提到这一点。
    • 如果你使用 ajax,你应该使用 javascript 来处理这个迭代。当一个页面加载成功时转到另一个参数较低的页面。因此,您可以在每次成功请求后更新进度条。
    • 到目前为止没有使用 ajax,我只是提到我认为,稍后会通过 ajax 调用脚本 - 在我看来,通过 javascript 迭代并不是最好的方法。最好的情况是脚本可以单独运行;)当您有一个具有不同步骤的大型安装程序时,其他软件如何做到这一点?
    最近更新 更多