Laravel部署于1&1共享主机首次加载极慢后续正常,如何解决?
Laravel共享主机首次加载慢解决方案
核心原因
该问题本质是共享主机的资源回收机制导致:长时间无访问时,主机会销毁对应站点的PHP进程、OPcache缓存,首次请求需要重新拉起进程、加载解析Laravel所有依赖的PHP文件,叠加共享主机普遍较差的磁盘IO性能,就会出现10s以上的冷启动耗时,后续访问时进程和缓存都处于活跃状态,性能就恢复正常。
优化方案
1. 启用并配置PHP OPcache(优先级最高)
这是投入最低收益最高的优化方式,绝大多数共享主机都支持自定义PHP配置:
- 在主机控制面板的PHP设置页开启以下配置:
opcache.enable = Onopcache.memory_consumption = 128(单位MB,给足缓存空间)opcache.max_accelerated_files = 10000(覆盖Laravel+vendor下的所有文件数量)opcache.revalidate_freq = 300(单位秒,降低缓存校验频率,演示站点可设更高)opcache.save_comments = On(必须开启,Laravel路由、注解功能依赖PHP注释)
配置完成后,就算PHP进程被回收,OPcache内的文件解析缓存仍会保留,冷启动不需要重新读磁盘解析PHP代码,可将启动耗时压缩到1s以内。
2. 优化Laravel自身启动开销
- 执行优化的自动加载映射:在项目根目录运行
composer dump-autoload --optimize,生成所有类的路径映射,减少自动加载时的文件查找开销,冷启动速度可提升30%左右。 - 裁剪不必要的服务提供者:打开
config/app.php,注释掉演示站点用不到的服务提供者(比如队列、广播、Redis、云存储相关的服务),减少启动时需要加载的类数量。 - Laravel 8及以上版本可开启类预加载:在
php.ini中配置opcache.preload指向项目根目录下的预加载脚本,将Laravel核心类提前加载到内存,冷启动时直接读取内存即可。
3. 轻量化保活方案(替代每分钟ping)
如果做完上述优化仍有偶发的冷启动慢问题,可调整保活策略降低开销:
- 将ping频率改为每510分钟一次即可,共享主机的PHP进程默认回收周期普遍在515分钟,不需要每分钟请求。
- 不要ping站点首页(会走完整的Laravel路由逻辑),改为ping静态资源如
/favicon.ico,或者自己写一个空白的PHP文件作为心跳地址,服务器开销极小。
4. 磁盘IO性能排查
如果上述所有操作都无效,可写简单脚本测试主机磁盘IO:读取100个1KB左右的小文件,统计总耗时如果超过1s,说明共享主机的磁盘IO被严重限速,这种情况只能更换更高配置的主机产品。
内容的提问来源于stack exchange,提问作者Arbiz
相关产品推荐
相关产品推荐

