注意,在循环中使用此函数时(例如,带有套接字的守护进程)。例如,socket_accept() 每次没有传入连接可供读取时都会发出警告。我的 php 错误日志文件在几秒钟内变得很大,最终导致服务器崩溃。
当然,我在函数之前使用了 @ 来解决这个问题。
[编辑:可以使用 socket_select 检测套接字上的新连接(它是“可读”事件)]
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_set_nonblock — 为文件描述符 fd 设置非阻塞模式
函数 socket_set_nonblock() 为由 socket
参数指定的套接字设置 **O_NONBLOCK
** 标志。
当在非阻塞套接字上执行操作(例如接收、发送、连接、接受等)时,脚本不会暂停其执行,直到它接收到信号或能够执行该操作。相反,如果操作会导致阻塞,则调用的函数将失败。
示例 #1 socket_set_nonblock() 示例
<?php
$socket = socket_create_listen(1223);
socket_set_nonblock($socket);
socket_accept($socket);
?>
此示例在所有接口的端口 1223 上创建一个监听套接字,并将套接字设置为 **O_NONBLOCK
** 模式。除非此时正好有一个挂起的连接,否则 socket_accept() 将立即失败。
注意,在循环中使用此函数时(例如,带有套接字的守护进程)。例如,socket_accept() 每次没有传入连接可供读取时都会发出警告。我的 php 错误日志文件在几秒钟内变得很大,最终导致服务器崩溃。
当然,我在函数之前使用了 @ 来解决这个问题。
[编辑:可以使用 socket_select 检测套接字上的新连接(它是“可读”事件)]