仅在 git push 后重新验证 opcache

Posted

技术标签:

【中文标题】仅在 git push 后重新验证 opcache【英文标题】:Revalidate opcache only after git push 【发布时间】:2015-03-16 19:33:30 【问题描述】:

我将 php 与 OPcache 一起使用。我只 git-push 掌握在生产中部署我的网站(不是真的,它只是在单元测试之后,但没关系)。在php.ini 文件中,OPcache 设置是关于“时间”和“频率”的。但我只想在我的服务器上 git pull 后重置缓存。

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

我没有读过任何关于这种方式的信息,所以我怀疑:我不知道这是否是一个好习惯。我错过了什么?有风险还是可以?

非常感谢!

附: : 我正在使用 PHP 框架和作曲家(composer install 在 git-pull 之后运行)

【问题讨论】:

可能会很有趣:codeascraft.com/2013/07/01/atomic-deploys-at-etsy @halfer 是的,有趣的阅读,谢谢:)!它没有回答我的问题,但我会记住这一点。 你不应该运行composer update,因为这会抓取你的测试没有运行的软件。使用自动化脚本时始终运行 composer install @Sven 我运行composer install,但我在我的问题中写了composer update:/ 谢谢,我会编辑我的帖子! 【参考方案1】:

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

然而,有几个“陷阱”:

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

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

<?php

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

并在每次拉取代码时执行该文件。根据 PHP 的版本及其运行方式,可能只清除命令行的缓存,而不会清除您正在运行的 Web 版本的缓存。

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

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

【讨论】:

好的,谢谢!关于你的最后一点,这不是问题,因为我不使用composer update,我使用composer install(所以测试和产品之间没有区别,composer.lock 是一样的)

以上是关于仅在 git push 后重新验证 opcache的主要内容,如果未能解决你的问题,请参考以下文章

git push每次都要身份验证,如何解决?

git可以add,pull, 不可以push的问题解决

启用 Opcache 不起作用

git-push 需要输入用户名和密码,原因分析及解决

GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?

文件修改后git add+git commit提交一次,但是没有push到远程,接着继续修改文件,继续git add+git commit提交,并push到远程仓库。会发现本地仓库两次commit一次