为什么CodeIgniter 3项目在本地运行缓慢但服务器运行正常
问题成因分析
- 服务器与本地PHP配置差异:线上服务器默认会开启OPcache扩展,会缓存所有PHP脚本的编译结果,后续请求不需要重新读取解析文件;大多数本地开发环境默认关闭OPcache,每次请求都需要重新读取、解析、编译所有加载的PHP文件,当项目存在数百个Model、Library文件时,累计耗时会非常夸张。
- 本地文件系统IO性能不足:线上服务器通常使用Linux原生文件系统(Ext4/XFS),小文件读取性能极强;如果本地使用Windows系统、WSL跨文件系统访问、Docker共享卷挂载,都会导致小文件读取速度下降数倍到数十倍,加载大量CI框架类文件时耗时会成倍增加。
- 调试扩展拖慢执行速度:本地环境如果开启了Xdebug、xhprof等调试扩展,会额外增加每个PHP文件的解析开销,开启调试功能后PHP整体执行速度会下降3-10倍,加载大量文件时的耗时会被进一步放大。
- 项目冗余加载逻辑:老旧项目通常会在公共父控制器中一次性全局加载大量公用Model、Library,线上因为有OPcache缓存所以无感知,本地无缓存时就会暴露加载耗时问题。
解决方案
- 对齐本地与线上的PHP核心配置
确保本地使用与线上一致的PHP 5.6版本,开启OPcache扩展,在php.ini中添加以下配置:
配置完成后重启PHP服务,验证OPcache生效后再测试页面加载速度,90%的同类文件加载慢问题可通过该配置解决。opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.revalidate_freq=30 - 优化本地文件IO性能
- Windows环境下不要把项目存放在网络共享盘,尽量放在本地SSD分区运行;如果使用WSL环境,不要将项目放在Windows挂载分区,迁移到WSL内部的Linux文件系统可提升10倍以上小文件读取速度。
- 如果使用Docker运行环境,将项目挂载卷的模式改为
delegated或cached,减少宿主机与容器的文件同步开销,也可以将缓存目录单独挂载为匿名卷。
- 禁用非必要的调试扩展
测试时暂时关闭Xdebug、xhprof等调试扩展验证速度,如果需要日常使用Xdebug,仅在调试时临时开启,关闭xdebug.remote_autostart、xdebug.coverage_enable等非必要功能项。 - 精简项目加载逻辑
排查公共父控制器的构造函数,将非全局必需的Model、Library改为页面按需加载,减少单次请求需要加载的文件总数。
内容的提问来源于stack exchange,提问作者Talha Meer
相关产品推荐
相关产品推荐

