如何解决是否可以将预加载器用于 cli 脚本而不用于 php-fpm?
我知道我们可以使用 7.4 中的预加载器将 PHP 代码编译到 OpCache。据我了解,它仅适用于 CGI/FastCGI (PHP-FPM)。是否可以仅对不打算在 HTTP 请求上执行而是控制台运行的 CLI 脚本执行相同的操作?
这里我创建了一个 small repository example。
解决方法
技术上预加载适用于 CLI。
不过,我没有得到您的示例来使用它。我不熟悉您使用的 PHP 图像,但这里有一些提示:
-
您应该以非 root 用户身份运行容器(或配置用户进行预加载),请参阅 https://www.php.net/manual/de/opcache.preloading.php(“不允许以 root 用户身份运行预加载。”)
您可以将
user: <someUserId>:<someUsergroupId>
添加到您的服务中。根据 PHP 中用户切换的实现方式,它可能需要/etc/passwd
中的条目。 -
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 举报,一经查实,本站将立刻删除。