PHP Conference Nagoya 2025

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() устанавливает флаг O_NONBLOCK на сокете, который указали в параметре socket.

Когда операция (например, получение, отправка, соединение, принятие соединения,… выполняется на неблокирующем сокете, скрипт не будет приостанавливать исполнение до получения сигнала или возможности выполнить операцию. Если выполняемая операция должна привести к блокированию выполнения скрипта, то вместо этого вызываемая функция вернёт ошибку.

Список параметров

socket

Экземпляр класса Socket, который создали функцией socket_create() или socket_accept().

Возвращаемые значения

Функция возвращает 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() немедленно вернёт ошибку, если только именно в этот момент нету ожидающего соединения.

Смотрите также

  • socket_set_block() - Устанавливает блокирующий режим на сокете
  • socket_set_option() - Устанавливает опции для сокета
  • stream_set_blocking() - Устанавливает блокирующий или неблокирующий режим для потока

Добавить

Примечания пользователей 1 note

up
4
kpobococ at gmail dot com
15 years ago
Beware, when using this function within a loop (i.e. a demon with a socket). The socket_accept(), for example, emits a warning each time there is no incoming connection available to be read. My php error log file got huge in a matter of seconds, eventually crashing the server.

Of course, i used the @ before the function to take care of that problem.

[EDITOR: One can (and should) use socket_select to detect a new connection on a socket (it's a "readable" event)]
To Top