fsockopen не всегда выполняет запросы mysql при обновлении страницы
Сервер A использует fsockopen, fwrite и fgets для сбора информации с удаленного сервера B. Удаленный сервер B создает запросы mysql и предоставляет эту информацию. При первой загрузке сервера A вся информация (с удаленного сервера B) появляется на сервере A - это означает, что соединение работает нормально. Однако иногда при обновлении страницы (на сервере A) информация об удаленном сервере B не отображается. Почему это?
код на сервере А довольно прост:
function test_http_request($path, $host, $test_request, $port=80){
$test_request_proc= test_encode($test_request);
//http request
$http_request = "POST $path HTTP/1.0\r\n";
$http_request .= "Host: $host\r\n";
$http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
$http_request .= "Content-Length: " . strlen($test_request_proc) . "\r\n";
$http_request .= "User-Agent: testConnection/PHP\r\n";
$http_request .= "\r\n";
$http_request .= $test_request_proc;
/////output
$test_resource = '';
//open socket
if(false == ($test_connect =@fsockopen('[remote server Bs IP ]', $port, $errno, $errstr, 10))){die('could not open test connection');}
//send http_request
fwrite($test_connect, $http_request);
//get response
while(!feof($test_connect))$test_resource .= fgets($test_connect, 1160);
//close socket
fclose($test_connect);
$test_resource = explode("\r\n\r\n", $test_resource, 2);
return $test_resource;
}
Согласно журналам ошибок удаленного сервера B, запросы mysql (которые выполняются для предоставления информации серверу A) не выполняются (ресурс является логическим). Иногда они исполняются, а иногда они не исполняются. Проблема не в языке запросов, поскольку он отлично работает, когда запрос запрашивается и выполняется на удаленном сервере B. Только когда сервер A запрашивает информацию через fsockopen (), проблема возникает.примечание: проблема заключается исключительно в запросах mysql, выполняемых удаленным сервером B, любой текст, выводимый заранее, появляется каждый раз. Спасибо за ваше время
1 ответ
Если у вас есть два сокета, говорящих друг с другом, как у вас - с помощью "while(true)" - и вы перезапускаете один из них, другой все еще пытается связаться с первым экземпляром. Вам нужно найти какое-то указание на то, что (перезапущенный) сервер отключился и заново открыть соединение. По сути, одна сторона разговора зависла, но другая все еще слушает.. ничего.