2011-12-28 66 views
2

服務器A使用fsockopen,fwrite和fgets從遠程服務器B收集信息。遠程服務器B創建mysql查詢並提供此信息。當服務器A第一次加載時,所有信息(來自遠程服務器B)出現在服務器A上 - 意味着連接正常工作。 但是,有時在頁面刷新時(在服務器A上),沒有顯示遠程服務器B的信息。爲什麼是這樣?當刷新頁面時,fsockopen並不總是執行mysql查詢

服務器A上的代碼非常簡單:

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 [email protected]('[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()請求信息時,問題纔會出現。 備註:問題出在於遠程服務器B執行的mysql查詢,每次都會出現前手輸出的任何文本。 感謝您的時間

+0

我認爲你需要張貼一些srv A和B的例子。 – ethrbunny 2011-12-28 15:51:28

回答

0

如果你有兩個插座像你一樣互相交談 - 帶一個「while(true)」 - 並且你重新啓動其中一個,另一個仍然試圖與第一個實例通信。您需要查看某些指示(已重新啓動)的服務器已斷開連接並重新打開連接。基本上,談話的一方已經掛斷了,但另一方仍在聽。

+0

這聽起來是對的。雖然我仍然是新手。你會怎麼建議我去做這件事? – YWSW 2011-12-28 16:50:52

+0

我不熟悉'fsockopen','fgets'等,但我敢打賭,有一些信號表明談話的一面已經關閉。另外 - (只是偷看) - 'fgets'函數使用第二個參數作爲長度。你會阻止,直到你獲得所有的價值。嘗試一個較小的值(或1)並自己構建響應。這會讓你知道連接是否關閉。 – ethrbunny 2011-12-28 16:53:49

+0

似乎不起作用 – YWSW 2011-12-28 17:20:09