0

0

PHP如何优化文件夹访问速度_PHP加速文件夹读取【技巧】

看不見的法師

看不見的法師

发布时间:2026-02-09 13:28:31

|

351人浏览过

|

来源于php中文网

原创

scandir() 比 glob() 快因直接调用系统 readdir(),而 glob() 需启动 shell 模式匹配并遍历所有文件比对,CPU 和系统调用开销大,数千文件时可慢 3–5 倍。

php如何优化文件夹访问速度_php加速文件夹读取【技巧】

为什么 scandir()glob() 快得多

PHP 默认用 scandir() 读取目录内容,它直接调用系统 readdir(),开销极小;而 glob() 会启动 shell 模式匹配引擎,哪怕只是 glob("*.php"),也会遍历所有文件再逐个比对后缀,CPU 和系统调用成本明显更高。尤其在含数千文件的目录中,glob() 可能慢 3–5 倍。

实操建议:

  • 纯列举文件名(无通配需求):强制用 scandir($path),之后用 array_filter() 手动筛选,比 glob() 更可控
  • 必须用通配时:优先用 DirectoryIterator + RegexIterator,避免重复构建正则或隐式类型转换
  • 注意 scandir() 默认包含 ".""..",记得用 array_diff($files, [".", ".."]) 过滤

PHP 8.1+ 的 StreamWrapper 缓存目录列表是否靠谱

有人尝试用自定义 StreamWrapperopendir() 后缓存 readdir() 结果,但实际效果有限——因为 PHP 不会自动复用同一路径的句柄,每次 opendir() 都是新调用;且缓存有效期难界定(文件可能被外部进程增删),容易返回脏数据。

更稳妥的做法是业务层主动缓存:

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

蚂蚁PPT
蚂蚁PPT

AI在线智能生成PPT

下载
  • apcu_fetch()md5_file($path . "/.listing_cache") 或基于 filemtime() 的键,比如 "dirlist_" . md5($path) . "_" . filemtime($path)
  • 避免缓存整个文件数组(内存膨胀),只缓存文件名列表,需要详细信息(如大小、时间)时再按需 stat()
  • 若目录极少变动(如静态资源目录),可生成 JSON 文件缓存,比 APCu 更持久

大量小文件场景下,RecursiveDirectoryIterator 的性能陷阱

RecursiveDirectoryIterator 看似方便,但它在每一层子目录都触发完整迭代器初始化和异常捕获逻辑,遇到权限不足或符号链接环时还会额外消耗。当目录深度 >3 或总文件数 >10k,它比手写递归 scandir() 慢 40% 以上。

替代方案:

  • exec("find " . escapeshellarg($path) . " -maxdepth 2 -type f -printf '%P\0') (Linux)配合 explode("\0", $output),速度提升显著,但失去跨平台性
  • 若必须用原生 PHP:改用 new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::LEAVES_ONLY),并设置 FilesystemIterator::SKIP_DOTS 减少无效项
  • 禁用 RecursiveDirectoryIteratorFilesystemIterator::KEY_AS_PATHNAME(默认开启),改用 KEY_AS_FILENAME,减少字符串拼接开销

Windows 下 opendir() 卡顿的常见原因

在 Windows 上,opendir() 偶尔卡住几秒,大概率不是 PHP 问题,而是 SMB 共享、OneDrive 同步或杀毒软件实时扫描导致。PHP 层面无法绕过这些系统级阻塞,但可以规避:

  • clearstatcache(true, $path) 清除该路径的 stat 缓存,防止后续 is_file() 调用重复触发 NTFS 查询
  • 避免在循环中反复调用 file_exists()is_dir(),先用 scandir() 拿到全量名称,再批量 stat() 一次获取全部元信息
  • 如果目录位于网络驱动器(如 Z:\),改用 UNC 路径(\\server\share\path)通常更稳定
真实瓶颈往往不在 PHP 函数选型,而在没意识到文件系统层的同步等待或缓存失效。特别是混合使用 opendir()stat()filemtime() 时,每个调用都可能触发独立的 NTFS 或 ext4 查询——把它们合并成单次 scandir() + 批量 stat(),收益远大于换函数。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

434

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

543

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

315

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

76

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

291

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

444

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

122

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号