在PHP开发中,使用file_get_contents函数请求外部网址时,默认超时时间较短,很容易出现请求失败的情况,需要手动配置超时参数来适配不同的请求场景。

使用stream_context_create配置超时
file_get_contents函数支持传入上下文参数,我们可以通过stream_context_create函数创建包含超时配置的上下文,传递给file_get_contents即可生效。这种方式仅对当前请求生效,不会影响其他请求的配置。
具体的实现代码如下:
<?php
// 定义超时配置参数,单位是秒
$context_options = array(
'http' => array(
'timeout' => 10, // 设置HTTP请求超时时间为10秒
'method' => 'GET', // 请求方式
'header' => "User-Agent: Mozilla/5.0rn" // 可选,设置请求头
),
'ssl' => array(
'verify_peer' => false, // 如果是HTTPS请求,可选关闭证书验证
'verify_peer_name' => false
)
);
// 创建上下文
$context = stream_context_create($context_options);
// 发起请求,传入上下文参数
$url = 'http://ipipp.com/test.html';
$result = file_get_contents($url, false, $context);
if ($result === false) {
echo '请求失败,请检查网址或超时配置';
} else {
echo '请求成功,返回内容:' . $result;
}
?>
参数说明
- timeout:设置请求的超时时间,单位为秒,可根据目标网址的响应速度调整,建议设置在5到30秒之间。
- method:指定请求方式,支持GET、POST等常见HTTP方法。
- header:可选参数,用于设置自定义请求头,比如模拟浏览器请求时添加User-Agent。
修改php.ini的default_socket_timeout配置
除了通过上下文临时配置超时,还可以修改PHP的全局配置文件php.ini中的default_socket_timeout参数,该配置会影响所有socket相关的操作,包括file_get_contents的默认超时时间。
修改步骤如下:
- 找到PHP的php.ini配置文件,不同环境的路径可能不同,比如Linux环境通常在/etc/php/版本号/cli/php.ini或者/etc/php/版本号/fpm/php.ini。
- 打开文件搜索default_socket_timeout,默认值是60秒,可根据需求修改,比如设置为30秒:
default_socket_timeout = 30
两种配置方式的区别
| 配置方式 | 作用范围 | 灵活性 | 适用场景 |
|---|---|---|---|
| stream_context_create | 仅当前file_get_contents请求 | 高,可针对不同请求设置不同超时 | 不同请求需要不同超时时间的场景 |
| default_socket_timeout | 所有socket相关操作 | 低,全局统一配置 | 所有请求超时要求一致的场景 |
超时异常处理
即使设置了超时时间,也可能出现请求失败的情况,建议添加异常处理逻辑,避免程序直接报错终止。可以通过判断file_get_contents的返回值来处理:
<?php
$context = stream_context_create(array(
'http' => array('timeout' => 10)
));
$url = 'http://ipipp.com/api/data';
$result = @file_get_contents($url, false, $context); // 使用@抑制错误输出
if ($result === false) {
// 记录错误日志
error_log('请求' . $url . '超时或失败,时间:' . date('Y-m-d H:i:s'));
// 返回默认数据或者重试逻辑
$result = '默认数据';
}
echo $result;
?>
注意:file_get_contents函数在请求失败时会返回false,同时可能产生警告信息,使用@符号可以临时抑制警告,但更推荐通过自定义错误处理函数来管理错误信息。
file_get_contentsstream_context_createPHP超时设置default_socket_timeout修改时间:2026-07-04 17:24:24