PHP:重新连接客户端套接字

时间:2013-04-26 22:04:47

标签: php sockets

我正在研究一个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_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();
}

然后我仍然得到同样的错误。

非常感谢任何帮助。

已解决:原来这是一个全局变量未设置的问题。带有socket_write的那段代码是在一个单独的函数中。我在函数的开头添加了“global $ socket”,但事实证明我还需要在未设置之后添加它。另外,要取消设置全局,我应该使用unset($ GLOBALS ['socket']); 感谢EJP让我重新审视这个。

1 个答案:

答案 0 :(得分:2)

您无法重新连接套接字。你必须创建一个新的。