PHP通过“代理”服务器刷新服务器响应

时间:2013-10-09 20:34:29

标签: php http

我有一个“代理”服务器(A)运行Apache / PHP,请求使用file_get_contents运行Apache / PHP的另一台服务器(B)。当用户请求服务器A时,它请求服务器B.服务器B上的请求最多需要两分钟才能完成,因此它很早就会响应等待动画,然后是PHP flush(),某事。像这样:

User       --->   Server A (a.php)             --->   Server B (b.php)
                  - file_get_contents to B            - flush after 1s
                  - nothing happens after 1s          - response end after 2m 
waits 2m   <---   

我现在遇到的问题是,B的早期刷新不会被A“镜像”。所以用户必须等待全部时间才能看到最终的响应。当我直接呼叫服务器B时,它会在1秒后显示等待的动画。

“a.php”的最小示例代码:

<?php
$stream_context = stream_context_create(array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded'
    )
));

echo file_get_contents('http://1.2.3.4/b.php', false, $stream_context);
?>

“b.php”的最小示例代码:

<?php
echo 'Loading...';
flush();

// Long operation
sleep(60);

echo 'Result';
?>

问: 有没有办法让服务器A从服务器B“镜像”早期的flush,从服务器B发送准确的刷新结果?

1 个答案:

答案 0 :(得分:1)

使用fopen / fread而不是file_get_contents。 然后你可以在读取之间刷新

这样的事情:

<?php
$stream_context = stream_context_create(array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded'
    )
));

$fp = fopen('http://1.2.3.4/b.php', 'r', false, $context);
while (!feof($fp)) {
  echo fread($fp, 8192);
  flush();
}
fclose($fp);

?>