ZetCode

PHP socket_set_timeout 函数

最后修改于 2025 年 4 月 4 日

PHP 的 socket_set_timeout 函数为 socket 操作设置超时值。这对于网络编程防止挂起至关重要。

基本定义

socket_set_timeout 配置套接字流的超时值。它会影响读取、写入和连接等操作。

语法:socket_set_timeout(resource $socket, int $seconds, int $microseconds = 0): bool。成功返回 true,失败返回 false。适用于流式套接字。

设置基本的 Socket 超时

此示例演示了为套接字操作设置简单的超时。

basic_timeout.php
<?php

declare(strict_types=1);

$socket = fsockopen("example.com", 80);
if ($socket === false) {
    die("Connection failed");
}

// Set 5 second timeout
socket_set_timeout($socket, 5);

// Perform socket operations...

fclose($socket);

这为套接字上的所有操作设置了 5 秒的超时。在此期间后,如果操作未完成,将超时。防止无限期阻塞。

带微秒的精确超时

这展示了如何设置具有微秒精度的超时以进行精确计时。

microsecond_timeout.php
<?php

declare(strict_types=1);

$socket = fsockopen("example.com", 80);
if ($socket === false) {
    die("Connection failed");
}

// Set 2.5 second timeout (2 seconds + 500000 microseconds)
socket_set_timeout($socket, 2, 500000);

// Read operation with precise timeout
$data = fread($socket, 1024);

fclose($socket);

通过组合秒和微秒,此设置了 2.5 秒的超时。当您需要更精确地控制超时时长时很有用。

检查超时条件

此示例演示了如何在操作期间检查是否发生了超时。

check_timeout.php
<?php

declare(strict_types=1);

$socket = fsockopen("example.com", 80);
if ($socket === false) {
    die("Connection failed");
}

socket_set_timeout($socket, 3);

$data = fread($socket, 1024);

$info = stream_get_meta_data($socket);
if ($info['timed_out']) {
    echo "Socket operation timed out";
} else {
    echo "Operation completed successfully";
}

fclose($socket);

在套接字操作之后,我们检查流元数据以获取超时状态。这有助于识别操作是否因超时条件而失败。

读取/写入的不同超时

这展示了如何为读取和写入操作设置不同的超时值。

rw_timeouts.php
<?php

declare(strict_types=1);

$socket = fsockopen("example.com", 80);
if ($socket === false) {
    die("Connection failed");
}

// Set read timeout (5 seconds)
socket_set_timeout($socket, 5);

// Perform read operations...

// Set write timeout (2 seconds)
socket_set_timeout($socket, 2);

// Perform write operations...

fclose($socket);

不同的操作可能需要不同的超时值。此示例展示了如何在读取和写入操作之间调整超时。

处理慢速连接

这演示了使用超时来处理慢速或不可靠的连接。

slow_connection.php
<?php

declare(strict_types=1);

function fetchWithRetry($host, $port, $retries = 3) {
    $timeout = 2; // Start with 2 second timeout
    
    for ($i = 0; $i < $retries; $i++) {
        $socket = fsockopen($host, $port);
        if ($socket === false) continue;
        
        socket_set_timeout($socket, $timeout);
        
        $data = fread($socket, 1024);
        $info = stream_get_meta_data($socket);
        
        if (!$info['timed_out']) {
            fclose($socket);
            return $data;
        }
        
        fclose($socket);
        $timeout *= 2; // Double timeout for next retry
    }
    
    return false;
}

$data = fetchWithRetry("example.com", 80);

这实现了带有递增超时的重试机制。适用于处理临时网络问题或慢速连接。

最佳实践

来源

PHP socket_set_timeout 文档

本教程通过网络编程和超时管理的实际示例,介绍了 PHP socket_set_timeout 函数。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 PHP 网络函数