深入PHPOPcache预加载提升Laravel启动速度【调优】

浅宇吖_8758

浅宇吖_8758

2026-07-10

437人浏览

原创

opcache预加载仅提升php-fpm首个请求的类加载速度,需php 7.4+、重启fpm生效,cli完全不支持;应使用opcache_compile_file()安全编译核心类,避开runtime依赖文件。

深入phpopcache预加载提升laravel启动速度【调优】

OPcache 预加载对 Laravel 启动速度有显著提升,但仅适用于 PHP 7.4+ 的 Web(FPM)环境,CLI(如 php artisan、队列 worker)完全不支持——这点必须先确认清楚,否则所有配置都白忙。

预加载只在 PHP-FPM 启动时生效,不是每次请求都重载

预加载脚本(opcache.preload 指向的 PHP 文件)会在 PHP-FPM 进程启动时执行一次,所有类被加载并常驻共享内存。这意味着:

  • 修改预加载脚本或被预加载的类后,必须重启 PHP-FPM(systemctl restart php*-fpm 或宝塔面板中“重载服务”),opcache_reset() 或 php artisan opcache:clear 完全无效
  • 预加载不解决「服务提供者注册」「配置解析」等运行时开销,只跳过「类文件读取 + 编译」环节
  • Laravel 核心类(Illuminate\Support\ServiceProvider 等)适合预加载;但含 env()、config() 调用的业务类会因环境未初始化而报错,需排除

如何写一个安全的 preload.php 文件

直接 require 所有类会触发自动加载冲突或未定义常量错误。推荐用 opcache_compile_file() 显式编译,跳过执行逻辑:

laravel-specialist
laravel-specialist

精通 Laravel 10+,遵循现代 PHP 实践的 Laravel 专家。擅长优雅语法、Eloquent ORM、队列系统及企业级特性...

下载
// preload.php
$files = [
    __DIR__ . '/vendor/autoload.php',
    __DIR__ . '/bootstrap/app.php',
    __DIR__ . '/app/Providers/AppServiceProvider.php',
    // 注意:不要 include routes/web.php 等含 runtime 逻辑的文件
];

foreach ($files as $file) {
    if (file_exists($file)) {
        opcache_compile_file($file);
    }
}
  • 避免 require 或 include,改用 opcache_compile_file() 只编译不执行
  • 不要预加载 routes/、config/、resources/ 下的文件——它们依赖运行时上下文
  • 用 composer dump-autoload --classmap-authoritative 后,可考虑预加载 classmap 中高频类(如 App\Models\User),但需验证是否真被 FPM 进程首次加载到

宝塔面板下启用预加载的实操要点

宝塔默认不暴露 opcache.preload 配置项,需手动编辑 FPM 的 php.ini(非 CLI):

  • 路径通常是 /www/server/php/*/etc/php.ini,确认是 FPM 对应版本(不是 cli/php.ini)
  • 在 [opcache] 段落下添加:
    opcache.preload=/www/wwwroot/your-site/preload.php
    opcache.preload_user=www(宝塔默认运行用户为 www)
  • 必须设置 opcache.memory_consumption ≥ 256M(预加载本身吃内存),否则启动时报 Failed to prepare preloaded file
  • 检查是否生效:php -r "var_dump(opcache_get_status()['preload']);" —— 返回数组且 scripts 不为空才表示成功

为什么预加载后 php artisan 还很慢?

因为 CLI SAPI 完全忽略 opcache.preload,且 opcache.enable_cli=1 仅启用字节码缓存,不支持预加载。所以:

  • php artisan config:cache 等命令仍需完整加载框架——预加载对此零影响
  • 队列 worker(php artisan queue:work)性能瓶颈主要在服务容器绑定和配置加载,不是字节码编译,强行给 CLI 开 OPcache 收益极低
  • 若想统一加速 CLI 场景,应优先用 config:cache、route:cache、view:cache,而非纠结预加载

预加载真正起作用的地方只有一个:PHP-FPM 子进程冷启动后的首个请求。它省掉的是磁盘 I/O 和编译时间,而不是 Laravel 自身的启动流程。别把它当成万能药。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

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

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

下载

相关标签:

laravel php

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

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10944

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6381

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2155

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4028

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4754

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3731

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5337

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4182

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12102

4

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 208人学习

Composer手册
Composer手册

共0课时 | 0人学习