我正在开发一个 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 让我重新审视这一点。