【问题标题】:Prevent timeout during large request in PHP在 PHP 中的大请求期间防止超时
【发布时间】:2011-04-23 23:28:02
【问题描述】:

我正在向 brightcove 服务器发出大量请求,以对我的视频中的元数据进行批量更改。似乎它只完成了 1000 次迭代然后停止了 - 任何人都可以帮助调整此代码以防止发生超时吗?它需要进行大约 7000/8000 次迭代。

<?php
include 'echove.php';

$e = new Echove(
    'xxxxx',
    'xxxxx'
);

// Read Video IDs
# Define our parameters
$params = array(
    'fields'         => 'id,referenceId'

);

# Make our API call
$videos = $e->findAll('video', $params);


    //print_r($videos);
    foreach ($videos as $video) {

        //print_r($video);
        $ref_id = $video->referenceId;
        $vid_id = $video->id;

        switch ($ref_id) {
            case "":
                $metaData = array(
                    'id' => $vid_id,
                    'referenceId' => $vid_id
                );

                # Update a video with the new meta data
                $e->update('video', $metaData);                
                echo "$vid_id updated sucessfully!<br />";
                break;
            default:
                echo "$ref_id was not updated. <br />";
                break;
        }
    }
?>

谢谢!

【问题讨论】:

  • 如果您决定在基于浏览器的应用程序上使用set_time_limit,作为警告,那么您的浏览器可能会在您收到任何响应之前超时。不是真正的答案,更多只是有用的信息;)

标签: php http timeout request


【解决方案1】:

也可以使用ignore_user_abort() 绕过浏览器中止。即使关闭浏览器,脚本也会继续运行(谨慎使用)。

【讨论】:

    【解决方案2】:

    尝试不时发送“状态:102 处理中”以防止浏览器超时(最好的选择是介于 15 到 30 秒之间)。处理请求后,您可以发送最终响应。

    浏览器不应再以这种方式超时。

    【讨论】:

    • 这行得通吗?我很想使用它,但作为 CGI 标头,您不能多次发送Status:。该 CGI 标头的 HTTP 版本(例如“HTTP/1.2 102 处理”)将如何到达浏览器?第一个会立即发送吗?后续的甚至可能/合法吗?
    • -1。假设用户没有关闭浏览器并且连接保持活动状态,那么浏览器没有理由因为脚本超时而出错。相反,这与 PHP 本身的脚本执行时间限制有关。所以这个答案是 100% 不正确的,应该删除,以免混淆任何人。
    • 某些浏览器会超时连接:support.mozilla.org/en-US/questions/1042479
    • 如果脚本没有响应,浏览器将超时。我不知道 102 是否合适。我通常会输出一些 HTML,即使它只是说正在处理。然后,如果您正在运行一个循环,只需每隔几秒钟就传递一次数据,只需在每个循环中添加一个带有空行的回显。
    • 对于任何感兴趣的人,这不会阻止 Cloudflare 的自定义 100 秒超时
    【解决方案3】:

    试试set_time_limit() 功能。调用set_time_limit(0) 将取消脚本执行的任何时间限制。

    【讨论】:

    • 小心,firefox 用network.http.keep-alive.timeout 选项“覆盖”这个
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2011-01-04
    • 2018-11-30
    相关资源
    最近更新 更多