微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以将预加载器用于 cli 脚本而不用于 php-fpm?

如何解决是否可以将预加载器用于 cli 脚本而不用于 php-fpm?

我知道我们可以使用 7.4 中的预加载器将 PHP 代码编译到 OpCache。据我了解,它仅适用于 CGI/FastCGI (PHP-FPM)。是否可以仅对不打算在 HTTP 请求上执行而是控制台运行的 CLI 脚本执行相同的操作?

这里我创建了一个 small repository example

解决方法

技术上预加载适用于 CLI。

不过,我没有得到您的示例来使用它。我不熟悉您使用的 PHP 图像,但这里有一些提示:

  1. 您应该以非 root 用户身份运行容器(或配置用户进行预加载),请参阅 https://www.php.net/manual/de/opcache.preloading.php(“不允许以 root 用户身份运行预加载。”)

    您可以将 user: <someUserId>:<someUsergroupId> 添加到您的服务中。根据 PHP 中用户切换的实现方式,它可能需要 /etc/passwd 中的条目。

  2. CLI 的操作码缓存是可选的,参见 https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.enable-cli

,

a page on Preloading in the manual 明确提到了这种情况:

此外,预加载仅在从一个请求到另一个请求的持续过程中才有用。这意味着如果启用了 opcache,它可以在 CLI 脚本中工作,但它通常毫无意义。

要启用它,您需要在 php.ini 中设置如下内容:

opcache.enable_cli=1
opcache.file_cache=/some/dir/somewhere
opcache.file_cache_only=1
opcache.preload=/path/to/preload.php

如果你配置它并运行一个 CLI 脚本,/path/to/preload.php 中的预加载脚本将被执行,并且任何包含、include_once、require、require_once 或 opcache_compile_file() 的使用都会导致编译的操作码存储在/some/dir/somewhere

当您运行第二个 CLI 脚本时,它将能够使用那些已编译的操作码,但它不会知道预加载已经发生。因此,您在 preload.php 中放置的所有内容都将在每次脚本加载时运行。您需要手动处理此问题,例如通过调用 opcache_is_script_cached

以这种方式使用它的复杂性可能超过大多数用例的收益。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。