仅在 git 推送后重新验证 opcache

Revalidate opcache only after git push

我正在使用 PHP 和 OPcache。我只是 git-push to master 以在生产中部署我的网站(不是真的,它只是在单元测试之后,但没关系)。在php.ini 文件中,OPcache 设置约为"time" 和"frequency"。但我只想在 git 拉入我的服务器后重置缓存。

所以我想我只需要在 git 之后调用 opcache_reset - 拉入我的生产服务器并将 opcache.validate_timestamps 设置为 0(从不重置缓存)

我没有读过任何关于这种方式的文章,所以我怀疑:我不知道这是否是一种好的做法。我错过了什么?有没有风险或者可以吗?

非常感谢!

P.S。 : 我正在使用 PHP 框架和作曲家(composer install 是 运行 就在 git-pull 之后)

为了从 OPCache 中获得最大的好处,您应该禁用 opcache.validate_timestamps。如果您随后每次将代码部署到服务器时都从脚本调用 opcache_reset(),那么您的 OPCache 会为每组新文件清除一次,并且系统不会浪费资源不断检查文件。

有几个 "gotchas",但是:

首先,确保对 opcache_reset() 的调用发生,否则您将 运行 使用旧代码。如果你有一个脚本来执行你的部署,如果这个步骤没有执行,请确保它大声失败。

其次,具体取决于 PHP 是如何 运行ning(mod_php vs php-fpm),您可能需要执行 opcache_reset()通过对浏览器的请求而不是通过命令行来运行。例如,清除缓存最明显的解决方案是有一个简单的 PHP 文件,如下所示

<?php

if (php_sapi() != "cli") die("Not accessible from web");
opcache_clear();

并在每次拉取代码时执行该文件。根据 PHP 的版本以及 运行 的情况, 可能 只会清除命令行的缓存,而不是您的 运行ning 网络版本.

如果从命令行清除不起作用,请考虑创建一个类似的脚本并使用 curlwget 通过 Web 调用它。例如,curl http://example.com/clear_cache.php?secret=abc123。如果您创建可通过网络访问的脚本,请确保它检查密钥以防止有人通过不断清除您的缓存来加载您的服务器。

最后,正如其他人所建议的那样,要使您的构建在测试和部署之间完全可重复,请考虑在测试过程结束时创建一个 .zip 文件,其中包含用于测试的全部代码,包括库被作曲家拉下。而不是 git pull 在您的服务器上,只需将文件解压缩到代码根目录即可。我意识到 git pull && composer update 很简单。但是,正如其他人所建议的那样,如果库在测试时间 运行 和部署时间之间得到更新,那么您的代码可能不再按预期工作。