PHP Conference Japan 2024

socket_set_nonblock

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_set_nonblock为文件描述符 fd 设置非阻塞模式

描述

socket_set_nonblock(Socket $socket): bool

函数 socket_set_nonblock() 为由 socket 参数指定的套接字设置 **O_NONBLOCK** 标志。

当在非阻塞套接字上执行操作(例如接收、发送、连接、接受等)时,脚本不会暂停其执行,直到它接收到信号或能够执行该操作。相反,如果操作会导致阻塞,则调用的函数将失败。

参数

socket

使用 socket_create()socket_accept() 创建的 Socket 实例。

返回值

成功时返回 **true**,失败时返回 **false**。

变更日志

版本 描述
8.0.0 socket 现在是一个 Socket 实例;之前,它是一个 resource

示例

示例 #1 socket_set_nonblock() 示例

<?php
$socket
= socket_create_listen(1223);
socket_set_nonblock($socket);

socket_accept($socket);
?>

此示例在所有接口的端口 1223 上创建一个监听套接字,并将套接字设置为 **O_NONBLOCK** 模式。除非此时正好有一个挂起的连接,否则 socket_accept() 将立即失败。

参见

添加注释

用户贡献的注释 1 条注释

4
kpobococ at gmail dot com
15 年前
注意,在循环中使用此函数时(例如,带有套接字的守护进程)。例如,socket_accept() 每次没有传入连接可供读取时都会发出警告。我的 php 错误日志文件在几秒钟内变得很大,最终导致服务器崩溃。

当然,我在函数之前使用了 @ 来解决这个问题。

[编辑:可以使用 socket_select 检测套接字上的新连接(它是“可读”事件)]
To Top