注意,在循环中使用此函数(即带有套接字的守护进程)时,例如 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 来检测套接字上的新连接(它是“可读”事件)]