PHP socket_set_blocking Function
last modified April 4, 2025
The PHP socket_set_blocking function controls the blocking mode
of a socket. It determines whether socket operations will wait for completion.
Basic Definition
socket_set_blocking sets a socket to blocking or non-blocking mode.
In blocking mode, operations wait until they can complete.
Syntax: socket_set_blocking(Socket $socket, bool $enable): bool.
Returns true on success, false on failure. Affects all subsequent operations.
Basic Blocking Socket Example
This example demonstrates creating a blocking socket for a simple TCP client.
<?php
declare(strict_types=1);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("Socket creation failed");
}
// Set socket to blocking mode
socket_set_blocking($socket, true);
$connected = socket_connect($socket, 'example.com', 80);
if ($connected === false) {
die("Connection failed");
}
echo "Connected in blocking mode\n";
socket_close($socket);
This creates a TCP socket in blocking mode. The connect operation will wait until it succeeds or fails. Blocking mode is simpler for basic operations.
Non-blocking Socket Example
This shows how to create a non-blocking socket for asynchronous operations.
<?php
declare(strict_types=1);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("Socket creation failed");
}
// Set socket to non-blocking mode
socket_set_blocking($socket, false);
$connected = socket_connect($socket, 'example.com', 80);
if ($connected === false) {
$error = socket_last_error($socket);
if ($error !== SOCKET_EINPROGRESS) {
die("Connection failed");
}
echo "Connection in progress\n";
}
socket_close($socket);
Non-blocking mode returns immediately. The code must handle EINPROGRESS errors. This allows for asynchronous network programming.
Switching Between Modes
This example demonstrates dynamically switching between blocking modes.
<?php
declare(strict_types=1);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'example.com', 80);
// Start in blocking mode for initial data
socket_set_blocking($socket, true);
$data = socket_read($socket, 1024);
// Switch to non-blocking for subsequent reads
socket_set_blocking($socket, false);
while (true) {
$more = socket_read($socket, 1024);
if ($more === false) break;
$data .= $more;
}
echo "Received data: " . strlen($data) . " bytes\n";
socket_close($socket);
This starts in blocking mode for initial data, then switches to non-blocking. The approach combines both modes for flexible network communication.
Timeout Handling with Blocking Sockets
This example shows how to implement timeouts with blocking sockets.
<?php
declare(strict_types=1);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_blocking($socket, true);
// Set timeout options
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, [
"sec" => 5,
"usec" => 0
]);
$connected = socket_connect($socket, 'example.com', 80);
if ($connected === false) {
die("Connection failed");
}
$data = socket_read($socket, 1024);
if ($data === false) {
die("Read timed out after 5 seconds");
}
echo "Received data: $data\n";
socket_close($socket);
Even in blocking mode, timeouts can be set using socket options. This prevents indefinite waits while maintaining blocking simplicity.
Non-blocking Socket Server
This example creates a simple non-blocking socket server.
<?php
declare(strict_types=1);
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
// Set server socket to non-blocking
socket_set_blocking($server, false);
echo "Server running on port 8080 (non-blocking)\n";
while (true) {
$client = socket_accept($server);
if ($client === false) {
usleep(100000); // Sleep to prevent CPU overload
continue;
}
$data = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!";
socket_write($client, $data);
socket_close($client);
}
The non-blocking server checks for connections without waiting. It sleeps briefly when no connections are available to reduce CPU usage.
Best Practices
- Error Handling: Always check socket operation return values
- Resource Management: Close sockets properly when done
- Performance: Use non-blocking for high-concurrency servers
- Simplicity: Prefer blocking mode for simple clients
- Timeouts: Set appropriate timeouts for blocking operations
Source
PHP socket_set_blocking Documentation
This tutorial covered the PHP socket_set_blocking function with
practical examples for different network programming scenarios.