我有一个“代理”服务器(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发送准确的刷新结果?
答案 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);
?>