W3docs

PHP socket_set_blocking() Function: Everything You Need to Know

As a PHP developer, you may need to control whether a socket is blocking or non-blocking to optimize performance and resource usage. The socket_set_blocking()

When you write network code in PHP, you often need to control whether an I/O call waits for data (blocking) or returns immediately (non-blocking). The socket_set_blocking() function was the historical alias for setting this mode. It was deprecated in PHP 8.1, and you should not use it in new code.

The catch is that the right replacement depends on which kind of connection you have, and this is where many guides get it wrong:

  • If you used the Sockets extension (socket_create(), which returns a Socket object), use socket_set_nonblock() and socket_set_block().
  • If you used a stream (fsockopen() or stream_socket_client(), which return a stream resource), use stream_set_blocking().

socket_set_blocking() was actually an alias of stream_set_blocking(), so it only ever worked on stream resources — never on Socket objects. That distinction is the key to avoiding a TypeError at runtime.

Blocking vs. Non-Blocking Mode

In blocking mode (the default), a read or write call pauses script execution until the operation can complete. A socket_read() on an empty socket simply waits there until bytes arrive.

In non-blocking mode, the same call returns right away. If no data is ready, it returns an empty result (or false) instead of waiting. This lets a single script juggle many connections or stay responsive — at the cost of you having to poll and check whether data actually arrived.

Use blocking when…Use non-blocking when…
You handle one connection at a timeYou serve many clients in one loop
Simplicity matters more than throughputThe script must stay responsive
A short, predictable request/responseYou implement your own polling/event loop

Setting the Mode on a Socket Object

If you created the connection with the Sockets extension, use socket_set_nonblock() and socket_set_block():

socket_set_nonblock(Socket $socket): bool
socket_set_block(Socket $socket): bool

Both return true on success and false on failure. A complete, runnable example with error handling and cleanup:

<?php

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

// Switch to non-blocking mode
if (!socket_set_nonblock($socket)) {
    die("Failed to set non-blocking mode\n");
}
echo "Socket is now non-blocking.\n";

// ... perform non-blocking socket operations ...

// Switch back to blocking mode if needed
socket_set_block($socket);
echo "Socket is now blocking again.\n";

socket_close($socket);

Do not call stream_set_blocking($socket, false) on a Socket object — socket_create() returns a Socket instance, and stream_set_blocking() only accepts a stream resource. Passing a Socket throws a TypeError.

Setting the Mode on a Stream

If you opened the connection with fsockopen() or stream_socket_client(), you have a stream resource and should use stream_set_blocking():

stream_set_blocking(resource $stream, bool $enable): bool
  • $stream: the stream resource to configure.
  • $enable: true for blocking mode, false for non-blocking mode.
<?php

$stream = stream_socket_client('tcp://example.com:80', $errno, $errstr, 5);
if ($stream === false) {
    die("Connect failed: $errstr ($errno)\n");
}

// Switch the stream to non-blocking mode
if (!stream_set_blocking($stream, false)) {
    die("Failed to set non-blocking mode\n");
}
echo "Stream is now non-blocking.\n";

fclose($stream);

A Non-Blocking Read Loop

Non-blocking mode is only useful if you poll. A typical pattern sends a request, then repeatedly checks for a reply without freezing the script:

<?php

$stream = stream_socket_client('tcp://example.com:80', $errno, $errstr, 5);
if ($stream === false) {
    die("Connect failed: $errstr ($errno)\n");
}

stream_set_blocking($stream, false);
fwrite($stream, "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n");

$response = '';
$start = time();
while (!feof($stream) && time() - $start < 5) {
    $chunk = fread($stream, 8192);
    if ($chunk === '' || $chunk === false) {
        // No data yet — do other work or wait briefly
        usleep(50000); // 50 ms
        continue;
    }
    $response .= $chunk;
}

echo substr($response, 0, 15), "\n"; // e.g. "HTTP/1.1 200 OK"
fclose($stream);

The usleep() call prevents a tight busy-loop from pinning the CPU. In production you would usually replace this manual polling with stream_select() to wait efficiently on multiple streams at once.

Version Notes

  • PHP 8.1: socket_set_blocking() is deprecated. Calling it emits a deprecation notice.
  • The function was an alias of stream_set_blocking(), so it never accepted Socket objects.
  • For Socket objects, socket_set_nonblock() / socket_set_block() have always been the correct calls and remain supported.
  • socket_get_status() — inspect the state of a socket, including whether it is blocked.
  • socket_set_timeout() — control how long a blocking operation waits before giving up.
  • PHP Streams — the wider streams API that stream_set_blocking() belongs to.

Conclusion

Controlling the blocking mode of a connection is essential for building responsive PHP network applications. The key is matching the function to the connection type: use socket_set_nonblock() / socket_set_block() for Socket objects, and stream_set_blocking() for stream resources. Avoid the deprecated socket_set_blocking() in new code, and remember that non-blocking mode only pays off when you pair it with a polling loop.

Practice

Practice
In PHP, what does the socket_set_blocking() function do?
In PHP, what does the socket_set_blocking() function do?
Was this page helpful?