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

14

1
不确定https://www.reddit.com/r/PHP/comments/e8pgzi/weve_found_some_fundamental_design_problems_in/会对使用它的任何计划产生多大影响。 - Nigel Ren
2
Symfony on preloading - jibsteroos
1
请查看这篇文章。同时阅读Nigel发布的那个bug,因为它似乎在目前情况下非常关键。 - Jeto
2个回答

10
根据 博客文章,这似乎很简单。显然,自 Symfony 4.4 以来,会生成一个预加载脚本,必须在 php.ini 中设置:
opcache.preload=/path/to/project/var/cache/prod/App_KernelProdContainer.preload.php

我在本地Docker环境中进行了一些测试,以下是测试结果: PHP 7.3没有使用OPcache(当前版本)
Requests per second:    8.75 [#/sec] (mean)
Time per request:       114.402 [ms] (mean)

没有OPcache的PHP 7.4

Requests per second:    11.44 [#/sec] (mean)
Time per request:       87.417 [ms] (mean)

使用Apache + modphp的PHP 7.4版本,带有OPcache但不带预加载功能。

Requests per second:    30.25 [#/sec] (mean)
Time per request:       33.053 [ms]

使用带有OPcache的PHP 7.4,不使用预加载(nginx + php fpm)

Requests per second:    40.00 [#/sec] (mean)

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

double free or corruption (!prev)
child pid 17 exit signal Aborted (6), possible coredump (…)

不过,这个功能看起来像是一个WIP。当我能够使用这个预加载功能时,我会重新验证这个答案。总体而言,我印象深刻,仅通过从PHP 7.3 升级到 7.4,性能提高了30%。


2
我正在尝试在Symfony中预加载一个相当大的应用程序,但是我遇到了错误,例如“无法声明类,因为名称已在使用中”。我在预加载文件中使用require_once来加载依赖项,这可能与已加载的类发生冲突。 - vishal
@vishal 我也遇到了同样的问题。你最终找到原因了吗? - rugolinifr
当然,将PHP升级到最新版本。 - Mike Doe
@emix 你可能想要更新你的答案,因为它真的很棒,我差点因为结论写得不行而错过了它。幸运的是我及时看到了你的评论。 - SeparateReality
一定有一天的 ;) - Mike Doe

8

首先,您应该添加:

opcache.preload=/path/to/project/preload.php

打开你的php.ini文件

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接