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 网络函数。