【问题标题】:How can I enable opcache preloading in PHP 7.4?如何在 PHP 7.4 中启用 opcache 预加载?
【发布时间】:2019-12-12 07:58:48
【问题描述】:

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

如果有任何改变,我将使用 Symfony 4

【问题讨论】:

标签: php preloading opcache php-7.4


【解决方案1】:

根据blog post,这似乎是微不足道的。显然 Symfony 从 4.4 开始生成一个预加载脚本,必须在 php.ini 中设置:

opcache.preload=/path/to/project/var/cache/prod/App_KernelProdContainer.preload.php

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

不带 OPcache 的 PHP 7.3(当前)

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)

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

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%。

【讨论】:

  • 我正在尝试在 Symfony 上预加载相当大的应用程序,我收到了无法声明类之类的错误,因为该名称已在使用中。我在预加载文件中使用 require_once 来加载依赖项,这可能与加载的类冲突。
  • @vishal 我也有同样的问题。你最终找到原因了吗?
  • 好的,将 PHP 升级到最新版本。
  • @emix 您可能想要更新您的答案,因为它真的很棒,我几乎放弃了它,因为书面结论认为它不起作用。幸好及时看到了你的评论。
  • 肯定有一天;)
【解决方案2】:

首先你应该添加:

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

致您的php.ini

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2020-05-25
    • 1970-01-01
    • 2015-12-18
    • 2015-05-08
    • 2021-11-11
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多