0

0

PHP怎么减少文件夹体积_PHP压缩文件夹节省空间【教程】

雪夜

雪夜

发布时间:2026-02-14 18:07:10

|

757人浏览过

|

来源于php中文网

原创

最可靠方式是用php自带ziparchive类打包目录,需显式添加空目录、处理相对路径、校验压缩包完整性,并优先优化原始文件而非盲目调高压缩级别。

php怎么减少文件夹体积_php压缩文件夹节省空间【教程】

PHP 用 ZipArchive 压缩文件夹最可靠

直接用 PHP 自带的 ZipArchive 类打包整个目录,是减少文件夹体积最稳妥的方式。它不依赖外部命令(如 system('zip')),跨平台兼容性好,且能精细控制是否跳过某些文件或目录。

常见错误是直接递归读取目录后手动拼 ZIP 格式字节——这极易出错,也不支持中文路径、空目录等边界情况。必须用 ZipArchive::addEmptyDir() 显式添加空目录,否则压缩包里会丢失它们。

实操建议:

  • 先调用 $zip->open($filename, ZipArchive::CREATE),检查返回值是否为 0,否则说明写入失败(如权限不足或磁盘满)
  • 遍历目录时用 RecursiveIteratorIterator + RecursiveDirectoryIterator,跳过 ....git 等隐藏目录
  • 对每个 SplFileInfo 对象,用 $zip->addFile($file->getPathname(), $relativePath),其中 $relativePath 需手动去掉源根路径前缀,否则压缩包内路径过深
  • 压缩大目录前建议设置 set_time_limit(0),避免超时中断

压缩率不够高?别硬改 ZipArchive 的 level 参数

ZipArchiveaddFile()addFromString() 不接受压缩级别参数;它的底层 zlib 压缩等级固定为 6(中等)。想提升压缩率,得换方案。

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

更现实的做法是:先用 ZipArchive 打包,再用系统 zip 命令重压。例如 Linux 下执行:exec("zip -r -Z deflate -9 {$filename} {$filename}")。但注意:-Z deflate 是必须的,否则可能变成 ZIP64 或其它不兼容格式;-9 仅对文本类内容有效,对已压缩文件(如 JPG、PNG、MP4)几乎没用,反而拖慢速度。

容易踩的坑:

快剪魔方
快剪魔方

AI漫剧高效制作工具

下载
  • Windows 上 zip 命令默认不存在,需确认安装了 Info-ZIP 或 Git Bash 的工具链
  • exec() 时未检查返回码,导致“看似成功”但实际没重压
  • 误以为提高 level 能压缩图片/视频——其实应先用专用工具(如 jpegoptim)优化原文件,再打包

删除原始文件前务必验证压缩包完整性

压缩完成不等于可用。很多脚本在 $zip->close() 返回 true 后就直接 rrmdir(),结果发现压缩包打不开——因为 close() 只表示写入完成,不校验数据有效性。

安全做法是立即用 ZipArchive::open() 重新打开并尝试读取一个内部文件头:

if ($zip->open($filename) === TRUE) {
    $stat = $zip->statName('index.php'); // 假设知道有个关键文件
    $zip->close();
    if ($stat !== false) {
        // 确认可读,才删原目录
        rrmdir($sourceDir);
    }
}

更严格的场景(如备份系统),应额外计算压缩包的 md5_file() 并与预期比对,或用 zip -T 命令做完整测试。

小文件多的目录,压缩前先合并再压更省空间

成百上千个小 PHP/JS/CSS 文件单独存进 ZIP,元数据开销可能占到总大小的 10%–20%。这时与其强压,不如先合并。

例如把 /assets/js/*.js 合并为 all.js,再压缩。PHP 中可用 file_get_contents() 循环读取+换行分隔,注意保留 SourceMap 注释(//# sourceMappingURL=...)位置,避免破坏调试能力。

但要注意:

  • 合并不能破坏执行顺序(如依赖关系),需按业务逻辑排序,不能只按字母序
  • HTML/PHP 中引用路径要同步更新,否则上线即 404
  • 合并后文件若超过 10MB,某些老旧 ZIP 工具可能无法解压(ZIP32 限制),此时应分卷或放弃合并

真正影响体积的从来不是 ZIP 算法本身,而是原始文件是否冗余、是否已压缩、路径是否合理——压缩只是最后一道工序,别让它承担不该承担的事。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

521

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

371

2023.07.28

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

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

531

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5600

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

488

2023.09.01

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

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

214

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

240

2023.09.14

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

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

296

2023.09.21

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

23

2026.02.13

热门下载

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

精品课程

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

共137课时 | 11.8万人学习

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号