仅在 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 版本的缓存。
如果无法从命令行清除,请考虑创建一个类似的脚本并通过网络使用curl
或wget
调用它。例如,curl http://example.com/clear_cache.php?secret=abc123
。如果您创建的脚本可通过 Web 访问,请确保它检查密钥,以防止有人通过不断清除缓存来加载您的服务器。
最后,正如其他人所建议的那样,为了使您的构建在测试和部署之间完全可重复,请考虑在测试过程结束时创建一个用于测试的整个代码的 .zip
文件,包括由 composer 拉下的库.而不是在您的服务器上git pull
,只需将文件解压缩到代码根目录。我意识到git pull && composer update
很简单。但是,正如其他人所建议的那样,如果库在测试运行时间和部署时间之间更新,那么您的代码可能不再按预期工作。
【讨论】:
好的,谢谢!关于你的最后一点,这不是问题,因为我不使用composer update
,我使用composer install
(所以测试和产品之间没有区别,composer.lock
是一样的)以上是关于仅在 git push 后重新验证 opcache的主要内容,如果未能解决你的问题,请参考以下文章
GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?
文件修改后git add+git commit提交一次,但是没有push到远程,接着继续修改文件,继续git add+git commit提交,并push到远程仓库。会发现本地仓库两次commit一次