Перейти к содержимому

Функция PHP socket_set_blocking(): всё, что нужно знать

Как PHP-разработчику, вам может потребоваться управлять режимом блокировки сокета (блокирующий или неблокирующий) для оптимизации производительности и использования ресурсов. Исторически для этих целей использовалась функция socket_set_blocking(), но она была помечена как устаревшая в PHP 8.1 и удалена в PHP 8.2. Современной альтернативой является stream_set_blocking(). В этой статье мы рассмотрим, как установить режим блокировки сокета с помощью текущего стандарта.

Что такое stream_set_blocking()?

stream_set_blocking() — это современная функция PHP, предназначенная для установки режима блокировки потока или сокета. Она заменяет устаревшую функцию socket_set_blocking(). Когда поток находится в режиме блокировки, операции ввода-вывода, такие как socket_read() или socket_write(), приостанавливают выполнение до тех пор, пока данные не станут доступны или операция не завершится. В неблокирующем режиме эти операции возвращают управление немедленно, что позволяет скрипту выполнять другие задачи или реализовывать опрос (polling).

Как использовать stream_set_blocking()

Использование stream_set_blocking() достаточно просто. Ниже приведён синтаксис функции:

PHP-синтаксис stream_set_blocking()

php
stream_set_blocking(resource|Socket $stream, bool $mode): bool

Функция принимает два параметра:

  • $stream: Ресурс или объект сокета/потока, который необходимо настроить. Обратите внимание, что в современных версиях PHP вместо устаревших ресурсов используются объекты Socket.
  • $mode: true для режима блокировки, false для неблокирующего режима.

Ниже приведён пример использования stream_set_blocking() с корректной обработкой ошибок и очисткой ресурсов:

Как использовать stream_set_blocking()?

php
<?php

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("Socket creation failed: " . socket_strerror(socket_last_error()));
}

// Set to non-blocking mode
if (!stream_set_blocking($socket, false)) {
    die("Failed to set blocking mode");
}

// ... perform socket operations ...

socket_close($socket);

В этом примере мы используем socket_create() для создания нового сокета, применяем stream_set_blocking() для его настройки и гарантируем корректное закрытие сокета в конце.

Заключение

Управление режимом блокировки сокета необходимо для оптимизации производительности и использования ресурсов в сетевых приложениях на PHP. Используя stream_set_blocking(), вы можете легко настроить сокеты на приостановку при операциях ввода-вывода или немедленное возвращение управления в зависимости от потребностей вашего приложения. Надеемся, это руководство поможет вам реализовать эффективную работу с сокетами в ваших проектах.

Практика

Что делает функция socket_set_blocking() в PHP?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.