2013-04-09 144 views
0

我正在使用PHP套接字在端口6000上偵聽傳入連接,並且其工作完美率爲99%,但發送請求時發生連接錯誤的時間爲1%服務器。我創建了一個不同的腳本,以無限循環的方式每秒鐘在端口6000上ping套接字,並將結果寫入日誌文件,以便查看它是否中斷,以及78,000個成功ping,23失敗。PHP Socket隨機斷開連接

我的代碼一定會有一些小的邏輯錯誤導致這種情況。如果有人有任何想法,非常感謝。

插座:

if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) 
{ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 

    die("Couldn't create socket: [$errorcode] $errormsg \n"); 
} 

echo "Socket created \n"; 

// Bind the source address 
if(!socket_bind($sock, "0.0.0.0" , 6000)) 
{ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 

    die("Could not bind socket : [$errorcode] $errormsg \n"); 
} 

echo "Socket bind OK \n"; 

if(!socket_listen ($sock , 10)) 
{ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 

    die("Could not listen on socket : [$errorcode] $errormsg \n"); 
} 

echo "Socket listen OK \n"; 

echo "Waiting for incoming connections... \n"; 

//start loop to listen for incoming connections 
while (true) 
{ 
    //Accept incoming connection - This is a blocking call 
    $client = socket_accept($sock); 

    //read data from the incoming socket 
    $input = ""; 
    $input = socket_read($client, 10000000); 

    if ($input != "") 
    { 
     // do my logic here with $input 
    } 
} 
socket_close($sock); 

編輯:不,我沒有使用CMD ping通。這是我的PHP腳本這是做ping操作:

<?php 
$host = '0.0.0.0'; 
$port = 6000; 
$waitTimeoutInSeconds = 1; 
while(true) 
{ 
    if($fp = fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds)) 
    { 
     $file = 'log.txt'; 
     $current = file_get_contents($file); 
     $today = date("Y-m-d_H:i:s"); 
     $current .= $today . " - SUCCESS\n"; 
     file_put_contents($file, $current); 
    } 
    else 
    { 
     $file = 'log.txt'; 
     $current = file_get_contents($file); 
     $today = date("Y-m-d_H:i:s"); 
     $current .= $today . " - FAILED\n"; 
     file_put_contents($file, $current); 
    } 
    fclose($fp); 
    sleep(1); 
} 
?> 

對於實際交易中,客戶端只連接一秒鐘,而它會通過在原始文本的XML請求,然後做一些邏輯這需要不到一秒鐘。既然它在Ping測試中失敗了,那意味着我的聽衆因爲某種原因打破了一秒鐘呢?

回答

0

我不確定我是否理解正確。

你說約有0.03%的ping失敗。這是你的問題嗎?如果這些是真實ping(來自cmd.exe的ping.exe),那麼它與您的邏輯無關。這是網絡。 (啓用WiFi的主機?)

如果你確信這是你的邏輯: 如果有人連接,多長時間,他有聯繫嗎?連接到前一個客戶端的新請求會發生什麼?我想你可能會在這裏找到你的答案。

也嘗試使用連續連接和發送虛擬數據的客戶端進行測試,而不是ping。並記錄客戶端收到的回覆。

+0

我更新了我的問題與我的腳本ping。是的,這是我的問題。我需要套接字來接受100%的請求。爲什麼只有少數人會無法工作是沒有道理的。 – Jonny07 2013-04-09 15:46:47

+0

放棄之前,您的海綿等待1秒鐘。這也可能表明0.03%需要超過1秒才能連接。嘗試記錄$ errStr和$ errCode。是超時還是別的? – 2013-04-09 15:58:10

+0

啊好點。我已經更新了它,給它5秒的超時時間並回應錯誤。我會看看是否有更多的錯誤,並保持發佈。 – Jonny07 2013-04-09 16:29:19