我正在编写一个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"answers"socket_create"重新创建$socket,但这也没有帮助。
编辑:我的意思是,如果我把最后一段代码改成
$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();
}
,我仍然得到相同的错误。
任何帮助都将是非常感激的。
SOLVED:原来这是一个全局变量未设置的问题。使用socket_write的代码块位于一个单独的函数中。我在函数的开头添加了"global $socket",但事实证明我还需要在unset之后添加它。此外,要取消设置全局,我应该使用unset($GLOBALS['socket']);感谢EJP让我重新检查这个
无法重新连接套接字。你必须创建一个新的