我正在處理一個php套接字客戶端腳本。我希望腳本能夠處理服務器停機時間。PHP:重新連接客戶端套接字
我啓動連接如下
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
function connect()
{
global $socket;
global $ip;
global $port;
$connected = FALSE;
while($connected === FALSE)
{
sleep(5);
$connected = socket_connect($socket, $ip, $port);
}
}
connect();
它試圖連接,直到服務器可用。
再往下看,我檢測到服務器不再響應,斷開套接字並嘗試重新連接到服務器。
$ret = socket_write($socket, $str, strlen($str));
if ($ret === false)
{
socket_shutdown($socket, 2);
socket_close($socket);
connect();
}
不過,我從socket_connect出現以下錯誤:
A connect request was made on an already connected socket.
在這一點上,即使服務器重新上線,爲我的腳本重新連接的唯一方式是通過殺死它,並開始它再次。是否有更多關閉客戶端套接字連接?我所能找到的大部分主題都涉及監聽傳入連接的套接字。
我試着再次使用「unset」重新創建$ socket,後面跟着「socket_create」,但那也沒有幫助。
編輯: 我的意思,如果我改變的代碼下面
$ret = socket_write($socket, $str, strlen($str));
if ($ret === false)
{
socket_shutdown($socket, 2);
socket_close($socket);
unset($socket);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
connect();
}
最後一塊,然後我仍然得到同樣的錯誤。
任何幫助將不勝感激。
解決:原來這是一個真正的全局變量未設置的問題。這段代碼與socket_write是在一個單獨的功能。我在函數的開頭添加了「global $ socket」,但事實證明,我還需要在未設置之後添加它。另外,爲了取消設置全局,我應該使用unset($ GLOBALS ['socket']); 感謝EJP讓我重新審視這一點。
你把「未定」放在哪裏? – PleaseStand 2013-04-26 22:28:29
在socket_close後。然後我在connect()之前調用socket_create。 – 2013-04-26 22:38:07