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