PHP:重新连接客户端套接字
我正在处理一个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让我重新审视这一点。
您无法重新连接套接字。你必须创建一个新的。
我该如何去做呢?重新创建套接字仍然给我同样的错误。即如果我调用“unset($ socket); $ socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);”在socket_close之后但connect()之前。 – 2013-04-26 23:43:13
在全新的未连接套接字上收到错误消息并不合理。你确定新代码被执行了吗? – EJP 2013-04-27 10:42:43
你把“未定”放在哪里? – PleaseStand 2013-04-26 22:28:29
在socket_close后。然后我在connect()之前调用socket_create。 – 2013-04-26 22:38:07