讲师中心 微信公众号
AI工具推荐 视频效率加速

PHP用stream_set_timeout设流超时会吗_PHP流超时法【流控】

酷雪吖_7551

酷雪吖_7551

发布时间:2026-02-09 10:11:25

|

1012人浏览过

|

来源于php中文网

原创

能,但只对已连接后的读写阻塞有效,不控制DNS解析、TCP连接和SSL握手等前置阶段;需配合stream_context_create设置连接超时才能实现端到端可控。

php用stream_set_timeout设流超时会吗_php流超时法【流控】

stream_set_timeout 能控制 PHP 流的超时吗

能,但只对部分流有效,且行为和直觉有偏差。它不控制 DNS 解析、TCP 连接建立、SSL 握手这些前置阶段的耗时,只作用于「已连接后」的读/写阻塞等待——也就是 fread()、fgets()、fwrite() 等函数在数据未就绪时的挂起时间。

为什么 fopen() 后调用 stream_set_timeout 有时没效果

常见于 HTTP 请求场景:你用 fopen('https://api.example.com', 'r'),然后立刻 stream_set_timeout($fp, 5),但整个请求卡住 30 秒才报错。这是因为:

  • stream_set_timeout 不影响 fopen() 自身的连接过程(包括 DNS 查询、TCP SYN、TLS 握手),这些阶段由底层 socket 默认超时或系统配置决定
  • 如果连接本身失败(如服务器无响应),fopen() 就会阻塞到系统级超时(Linux 默认约 1 分钟),此时流资源 $fp 根本没创建成功,自然无法设置超时
  • PHP 的 default_socket_timeout ini 配置(默认 60 秒)会覆盖 stream 层面的 timeout 对连接阶段的影响

真正可控的超时组合方案

要实现端到端可控超时,必须分层设限:

  • 连接前:用 stream_context_create() 显式配置 timeout(单位秒)和 bindto(可选绑定本地端口/地址)
  • 连接后:对返回的流资源调用 stream_set_timeout($fp, $sec, $usec) 控制后续 I/O
  • 注意:timeout 上下文选项对 https:// 有效,但对 http:// 可能被忽略(取决于 PHP 版本和 curl 封装逻辑);更稳妥的是直接用 cURL 并设 CURLOPT_TIMEOUT

示例:

Adblock Dns
Adblock Dns

在你的机器上运行DNS服务器,使用Pi-hole黑名单阻止189,000+个广告、追踪器和恶意软件域名,实现全网拦截。

下载

立即学习“PHP免费学习笔记(深入)”;

$ctx = stream_context_create([
    'http' => ['timeout' => 5.0],
    'ssl'  => ['verify_peer' => false]
]);
$fp = fopen('https://api.example.com', 'r', false, $ctx);
if ($fp) {
    stream_set_timeout($fp, 5); // 仅作用于 fread/fgets 等
    $data = fgets($fp); // 此处最多等 5 秒
}

stream_set_timeout 的陷阱与兼容性

这个函数在不同 PHP 版本和流类型上表现不一致:

  • 对 php://memory、php://temp 等内存流,调用后无实际效果(无 I/O 阻塞)
  • PHP 7.4+ 中,对加密流(如 tls://)的 stream_set_timeout 行为更稳定;旧版本可能在 SSL 握手后才生效
  • 超时触发后,stream_get_meta_data($fp)['timed_out'] 会为 true,但流不会自动关闭,需手动 fclose($fp)
  • Windows 下 socket 超时精度较差,实际等待可能比设定值长 1–2 秒

真正在意流控的场景,别只靠 stream_set_timeout —— 它只是拼图的一角,漏掉连接阶段的控制,整个超时策略就形同虚设。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
fclose函数的用法
fclose函数的用法

fclose是一个C语言和C++中的标准库函数,用于关闭一个已经打开的文件,是文件操作中非常重要的一个函数,用于将文件流与底层文件系统分离,释放相关的资源。更多关于fclose函数的相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

822

2023.11.30

fgets在c语言中的用法
fgets在c语言中的用法

本专题整合了c语言中fgets用法介绍,阅读专题下面的文章了解更多详细内容。

153

2025.08.27

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

3703

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

855

2023.10.30

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3279

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2858

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1508

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2619

2023.08.02

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn