我正在使用带有OPcache的PHP。我只 git-push 到 master 以在生产环境中部署我的网站(不是真的,它只是在单元测试之后,但没关系)。php.ini
文件中,OPcache 设置与"时间"和"频率"有关。但我只想在我的服务器上进行 git 拉取后重置缓存。
所以我想我只需要在我的生产服务器上的 git-pull 后调用opcache_reset
并将opcache.validate_timestamps
设置为 0
(永远不要重置缓存)
我没有读过任何关于这种方式的内容,所以我怀疑:我不知道这是否是一种好的做法。我错过了什么吗?是否有任何风险或可以?
多谢!
PS:我正在使用PHP框架和作曲家(composer install
在git-pull之后运行)
为了从 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
通过 Web 调用它。例如,curl http://example.com/clear_cache.php?secret=abc123
.如果将脚本创建为 Web 可访问,请确保它检查密钥,以防止有人通过不断清除缓存来加载您的服务器。
最后,正如其他人所建议的那样,为了使您的构建在测试和部署之间完全可重复,请考虑让测试过程结束时创建一个用于测试的整个代码的.zip
文件,包括由 composer 拉下的库。与其git pull
服务器上,不如将文件解压缩到代码根目录上。我意识到git pull && composer update
很容易。但是,正如其他人所建议的那样,如果在运行测试的时间和部署时间之间更新库,则代码可能不再按预期工作。