Saltar al contenido

Función socket_set_blocking() de PHP: Todo lo que necesitas saber

Como desarrollador de PHP, es posible que necesites controlar si un socket es de bloqueo o no bloqueo para optimizar el rendimiento y el uso de recursos. La función socket_set_blocking() se utilizaba históricamente para este propósito, pero fue marcada como obsoleta en PHP 8.1 y eliminada en PHP 8.2. La alternativa moderna es stream_set_blocking(). En este artículo, veremos cómo establecer el modo de bloqueo de un socket utilizando el estándar actual.

¿Qué es stream_set_blocking()?

stream_set_blocking() es la función moderna de PHP utilizada para establecer el modo de bloqueo de un flujo o socket. Reemplaza a la función obsoleta socket_set_blocking(). Cuando un flujo está en modo de bloqueo, las operaciones de E/S como socket_read() o socket_write() pausarán la ejecución hasta que haya datos disponibles o la operación se complete. En modo de no bloqueo, estas operaciones devuelven el control inmediatamente, lo que permite que tu script maneje otras tareas o implemente sondeo (polling).

Cómo usar stream_set_blocking()

El uso de stream_set_blocking() es sencillo. A continuación se muestra la sintaxis de la función:

Sintaxis de PHP de stream_set_blocking()

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

La función acepta dos parámetros:

  • $stream: El recurso/objeto de socket o flujo que se va a configurar. Ten en cuenta que PHP moderno utiliza objetos Socket en lugar de recursos heredados.
  • $mode: true para modo de bloqueo, false para modo de no bloqueo.

A continuación se muestra un ejemplo de cómo usar stream_set_blocking() con un manejo de errores adecuado y limpieza de recursos:

¿Cómo usar 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);

En este ejemplo, usamos socket_create() para crear un nuevo socket, aplicamos stream_set_blocking() para configurarlo y nos aseguramos de que el socket se cierre correctamente después.

Conclusión

Controlar el modo de bloqueo de un socket es esencial para optimizar el rendimiento y el uso de recursos en aplicaciones de red PHP. Al utilizar stream_set_blocking(), puedes configurar fácilmente los sockets para que se detengan en las operaciones de E/S o devuelvan el control inmediatamente, según las necesidades de tu aplicación. Esperamos que esta guía te ayude a implementar un manejo eficiente de sockets en tus proyectos.

Práctica

En PHP, ¿qué hace la función socket_set_blocking()?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.