与函数 socket_accept 相比,此函数多了个“timeout”参数。
要让此函数无限期地等待传入连接,就像 socket_accept 中一样,请将 timeout 设置为 -1。它对 PHP 5.0.4 有效。
(PHP 5, PHP 7, PHP 8)
stream_socket_accept — 接受由 stream_socket_server() 创建的套接字上的连接
$socket
, ?float $timeout
= null
, string &$peer_name
= null
): resource|false接受先前由 stream_socket_server() 创建的套接字上的连接。
socket
要从中接受连接的服务器套接字。
timeout
覆盖默认的套接字接受超时。时间应以秒为单位。默认情况下,使用 default_socket_timeout。
peer_name
如果包含且可从所选传输获得,则将设置为连接的客户端的名称(地址)。
注意:
也可以稍后使用 stream_socket_get_name() 确定。
返回到已接受的套接字连接的流,或在失败时返回 false
。
版本 | 描述 |
---|---|
8.0.0 |
timeout 现在可以为空。 |
此函数不应与 UDP 服务器套接字一起使用。相反,请使用 stream_socket_recvfrom() 和 stream_socket_sendto()。
与函数 socket_accept 相比,此函数多了个“timeout”参数。
要让此函数无限期地等待传入连接,就像 socket_accept 中一样,请将 timeout 设置为 -1。它对 PHP 5.0.4 有效。
要检查是否有新的连接正在等待,而不阻塞,或者(当使用非阻塞模式时)不出现通知,可以使用 stream_accept(而不是 socket_select)。
<?php
class GenericClass {
protected $resSocket=null;
function acceptConnections() {
# 检查我们是否仍然有资源
if(is_resource($this->resSocket)) {
$arrRead=array($this->resSocket);
$arrWrite=array();
/** @warning 通过引用传递 $arrRead,$arrWrite */
if(stream_select($arrRead,$arrWrite,$arrWrite,0)) {
$resConnection=stream_socket_accept($this->resSocket,0);
# ... 其他操作在这里
}
}
}
}
?>
这段代码可能非常有用...
以下代码适用于“服务器”。它监听消息直到 CTRL-C
<?php
while (true)
{
// 每 5 秒断开连接...
receive_message('127.0.0.1','85',5);
}
function receive_message($ipServer,$portNumber,$nbSecondsIdle)
{
// 创建套接字...
$socket = stream_socket_server('tcp://'.$ipServer.':'.$portNumber, $errno, $errstr);
if (!$socket)
{
echo "$errstr ($errno)<br />\n";
}
else
{
// 当有连接时,我会接收它... 如果我在 $nbSecondsIdle 秒内没有收到消息,以下函数将停止。
while ($conn = @stream_socket_accept($socket,$nbSecondsIdle))
{
$message= fread($conn, 1024);
echo '我收到了:'.$message;
fputs ($conn, "OK\n");
fclose ($conn);
}
fclose($socket);
}
}
?>
以下代码适用于“客户端”。它发送消息并读取响应...
<?php
send_message('127.0.0.1','85','要发送的消息...');
function send_message($ipServer,$portServer,$message)
{
$fp = stream_socket_client("tcp://$ipServer:$portServer", $errno, $errstr);
if (!$fp)
{
echo "错误:$errno - $errstr<br />\n";
}
else
{
fwrite($fp,"$message\n");
$response = fread($fp, 4);
if ($response != "OK\n")
{echo '命令无法执行...\n原因:'.$response;}
else
{echo '执行成功...';}
fclose($fp);
}
}
?>
敬启者,这可能与您密切相关,stream_set_blocking 对 stream_socket_accept 没有任何影响。
如果您希望它立即返回,无论是否连接,请将超时参数设置为 0。