如何在 PHP 7.4 中启用 opcache 预加载?

emi*_*mix 11 php preloading opcache php-7.4

我想在 PHP 7.4 的生产服务器上启用opcache 预加载( RFC )。

如果它改变了任何东西,我正在使用Symfony 4

emi*_*mix 7

根据博客文章,这似乎微不足道。显然,Symfony 从 4.4 开始生成一个预加载脚本,必须在以下位置设置php.ini

opcache.preload=/path/to/project/var/cache/prod/App_KernelProdContainer.preload.php
Run Code Online (Sandbox Code Playgroud)

我在本地 Docker 环境中做了一些测试,结果如下:

没有 OPcache 的 PHP 7.3(当前)

Requests per second:    8.75 [#/sec] (mean)
Time per request:       114.402 [ms] (mean)
Run Code Online (Sandbox Code Playgroud)

没有 OPcache 的 PHP 7.4

Requests per second:    11.44 [#/sec] (mean)
Time per request:       87.417 [ms] (mean)
Run Code Online (Sandbox Code Playgroud)

PHP 7.4 带 OPcache,无预加载 (Apache + modphp)

Requests per second:    30.25 [#/sec] (mean)
Time per request:       33.053 [ms]
Run Code Online (Sandbox Code Playgroud)

PHP 7.4 带 OPcache,无预加载(nginx + php fpm)

Requests per second:    40.00 [#/sec] (mean)
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法启用预加载 :( 我遇到了以下错误(在 Apache+Mod 和 Nginx+FPM 中):

double free or corruption (!prev)
child pid 17 exit signal Aborted (6), possible coredump (…)
Run Code Online (Sandbox Code Playgroud)

不过,此功能看起来像WIP。当我能够使用这个预加载的东西时,我将重新验证这个答案。总的来说,我印象非常深刻,仅仅从 PHP 升级7.37.4.

  • 我正在尝试在 Symfony 上预加载相当大的应用程序,但收到诸如“无法声明类”之类的错误,因为该名称已在使用中。我在预加载文件中使用 require_once 也能够加载依赖项,这可能与加载的类冲突。 (2认同)

Mor*_*arm 6

首先你应该添加:

opcache.preload=/path/to/project/preload.php
Run Code Online (Sandbox Code Playgroud)

给你的 php.ini

然后在您的 PHP 脚本中,您应该传入opcache_compile_file($file);要预加载的每个文件。