Странное поведение тайм-аута с использованием PHP-клиента - PullRequest
0 голосов
/ 29 февраля 2012

Я пытаюсь создать прокси-подобную страницу, которая перенаправляет AJAX-запрос на SOAP-сервер. Браузер отправляет 2 запроса на одну и ту же страницу (т.е. server.php с другой строкой запроса) каждые 10 секунд. Сервер делает мыльный вызов на мыльный сервер в зависимости от строки запроса. Все работает нормально.

Затем я помещаю спящий режим (40 секунд) в сервер мыла, чтобы имитировать медленный ответ, а также устанавливаю тайм-аут на вызывающего, чтобы прервать вызов через несколько секунд.

server.php: Pseudo code:

$timeout = 10;
ini_set("default_socket_timeout", $timeout);

$id = $_GET['id'];

$wsdl= 'http://soapserver/wsdl'
$client = new SoapClient($wsdl,array('connection_timeout'=> $timeout));
print($client->getQuote($id));

Если браузер отправляет запрос ajax на http://myserver/server.php?id=IBM запрос останавливается после установленного времени ожидания. Если я попытаюсь сделать второй звонок до того, как первый остановится, второй не соблюдает тайм-аут.

i.e.

Request:

GET http://myserver/server.php?id=IBM 
and after 1 second 
GET http://myserver/server.php?id=AAP

Response:

after 10 seconds:
No data
after 20 seconds:
No data

Я также пытался не использовать PHP SOAP и использовать curl, но получил те же результаты.

Я также пытался открыть 3 вкладки в браузере и позвонить:

http://myserver/server.php?id=IBM
http://myserver/server.php?id=AAP
http://myserver/server.php?id=MSX

Первый останавливается через 10 секунд, второй - через 20 секунд, а третий - через 30 секунд.

Это нормальное поведение или я что-то упускаю? Заранее спасибо

1 Ответ

0 голосов
/ 29 февраля 2012

Вы, вероятно, начинаете сеансы, и session_start() блокирует второй вызов до тех пор, пока другой запрос не "освободит" сеанс (другими словами: завершился и больше не будет записывать данные в сеанс). Для запросов, требующих много времени, не начинайте сеанс, если он вам не нужен, и если он вам действительно необходим, получите все необходимые данные, а затем вызовите session_write_close() ПЕРЕД тем, как вы занимаетесь трудоемким процессом. Если вам нужно написать в сеанс позже, просто позвоните session_start() еще раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...