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)" - и вы перезапускаете один из них, другой все еще пытается связаться с первым экземпляром. Вам нужно найти какое-то указание на то, что (перезапущенный) сервер отключился и заново открыть соединение. По сути, одна сторона разговора зависла, но другая все еще слушает.. ничего.

Другие вопросы по тегам