2013-10-09 3 views
1

У меня есть «прокси-сервер» (A), на котором запущен Apache/PHP с запросом другого сервера (B), использующего Apache/PHP, используя file_get_contents. Когда пользователь запрашивает сервер A, он запрашивает сервер B. Запрос на сервере B требуется до двух минут для завершения, поэтому он очень рано реагирует на ожидающую анимацию, за которой следует PHP flush(), sth. как это:Ответ PHP-сервера на сервер «proxy»

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 не «зеркально» А. Таким образом, пользователь должен ждать полного времени, прежде чем увидеть окончательный ответ. Когда я вызываю сервер 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'; 
?> 

Q: Есть способ заставить сервер A «зеркально отобразить» ранний flush с сервера B, отправив точно сброшенный результат с сервера B?

ответ

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); 

?> 
+0

Как именно я должен сделать это в A.php? – migg

+0

Я обновляю свой ответ –

+0

@migg, помогает вам? –

Смежные вопросы