php fsockopen如何知道连接是否处于活动状态
我对php-fsockopen命令有问题 我需要在服务器上打开套接字连接以实现消息交换。 如果服务器没有收到来自我(客户端)的任何信息,它会在某个超时后关闭连接(我不知道确切的情况,也不能更改) 问题是。。。我怎么知道几分钟前打开的插座是否还活着 这是我用来打开连接的脚本php fsockopen如何知道连接是否处于活动状态,php,sockets,fsockopen,connection-timeout,Php,Sockets,Fsockopen,Connection Timeout,我对php-fsockopen命令有问题 我需要在服务器上打开套接字连接以实现消息交换。 如果服务器没有收到来自我(客户端)的任何信息,它会在某个超时后关闭连接(我不知道确切的情况,也不能更改) 问题是。。。我怎么知道几分钟前打开的插座是否还活着 这是我用来打开连接的脚本 $socket = fsockopen("automation.srv.st.com", 7777, $errno, $errstr); if ($socket === false) { echo "Unable to
$socket = fsockopen("automation.srv.st.com", 7777, $errno, $errstr);
if ($socket === false) {
echo "Unable to open Socket. Error {$errno} : {$errstr}\n";
die();
}
$status = stream_get_meta_data($socket);
print_r($status);
然后打印出来
Array
(
[stream_type] => tcp_socket/ssl
[mode] => r+
[unread_bytes] => 0
[seekable] =>
[timed_out] =>
[blocked] => 1
[eof] =>
)
然后,在写入服务器的每条消息中
fwrite($socket, $message);
。。。我在200毫秒内收到反馈:
$answer = fread($socket, 1024);
但是,如果我的脚本花了30分钟没有向服务器发送任何消息(因为它没有任何通信内容),那么服务器会自动关闭连接,我无法理解如何在重新实例化新连接之前检查它:
如果用
if ($socket) echo "The socket is still having a valid resource\n";
$status = stream_get_meta_data($socket);
print_r($status);
但这将回答我的$socket仍然是一个有效的流资源
我试过了
if ($socket) echo "The socket is still having a valid resource\n";
$status = stream_get_meta_data($socket);
print_r($status);
我将得到完全相同的输出:
Array (
[stream_type] => tcp_socket/ssl
[mode] => r+
[unread_bytes] => 0
[seekable] =>
[timed_out] =>
[blocked] => 1
[eof] =>
)
然后,我尝试在写东西之前读取一些数据,但它阻止了fgets语句:
$result = fgets($socket, 1024); //--- Blocking statement
echo ">".$result."\n";
所以,我几乎被绊倒了。我的问题是:如何知道使用fsockopen命令打开的套接字在一段时间后是否仍然有效?
我必须使用哪种命令,或者您建议我使用哪种方法来实现
谢谢,任何人都可以帮助我
再见,
Stefano我不知道这是否是正确的方法,也不知道它是否会引起某人的兴趣,但我最后发现的唯一方法是使用
feof($socket);
或者更好
if (feof($socket) === true) echo "Socket close\n";
都不是
get_resource_type($socket);
或
将产生预期的行为
无论如何,感谢所有人
Stefano这将是一个棘手的问题,因为TCP连接可以长时间保持活动状态,甚至可以在重新启动后存活下来。现在有一种方法可以在没有发送数据的情况下立即知道连接是否已断开。有TCP keepalive,但自动检查仅每小时左右一次。根据系统的不同,您可以通过发送长度为0字节的数据按需获得此行为。实验。有一个可选参数可以设置fsockopen的超时时间,也许它会有所帮助。或者可能是流设置超时()