Laravel 使用 Capistrano 缓存文件进行部署
Laravel deployment with capistrano cache files
我在尝试使用 Capistrano 将 Laravel 应用程序部署到 Ubuntu 服务器时遇到问题。
我的部署目录是/var/www/project_stage。当我将项目部署到该目录时,一切正常。我的项目上线了,每一行代码都正常工作。
但是当我进行更改并部署同一个项目的新版本时,不知何故(我猜)我的文件被缓存并且没有响应最新版本,它们仍然响应旧版本正在被覆盖。
当我将项目部署到另一个文件夹(等:/var/www/project_stage2 而不是 /var/www/project_stage)并更改我的 Nginx 配置以从该文件夹提供服务时,它再次正常工作。但不是在第二次部署到同一目录。所以我可以说我每次都可以部署到不同的目录,但我不能部署到同一个目录两次。它总是在第一次部署时响应。
这是我尝试过的方法:
- 我检查了Capistrano的当前目录是否链接到
正确的文件夹,它有。
- 我检查了我所做的更改是否在新部署中可见,这
他们是。文件在新部署时完全更改。
- 我检查了Nginx是否在寻找正确的发布目录,它
有。
- 我试过运行
php artisan cache:clear
,route:clear
,
view:clear
、config:cache
命令和我 运行 composer
dump-autoload
也是。没有任何效果。
- 我把Nginx的
sendfile
参数改成off
重启了,不行
结果。
- 我在 this 问题上阅读了类似的问题,但它没有用
我的情况。
这是我的 deploy.rb:
#deploy_path inherited from staging.rb
lock "~> 3.10.1"
set :application, "project_stage"
set :repo_url, "MY REPO HERE"
set :keep_releases, 10
set :laravel_dotenv_file, "./.env.staging"
namespace :deploy do
before :updated, :easy do
on roles(:all) do |host|
execute :chmod, "-R 777 #{deploy_path}/shared/storage/logs"
execute :chmod, "-R 777 #{deploy_path}/shared/storage/framework"
end
end
after :finished, :hard do
on roles(:all) do |host|
end
end
desc "Build"
after :updated, :build do
on roles(:web) do
within release_path do
execute :php, "artisan clear-compiled"
execute :php, "artisan cache:clear"
execute :php, "artisan view:clear"
execute :php, "artisan route:cache"
execute :php, "artisan config:cache"
end
end
end
end #end deploy namespace
我正在使用 PHP7.0(带 unix 套接字的 FPM)、Nginx、Laravel5、Capistrano3(带 capsitano/laravel gem)、Ubuntu服务器 16.4。
如果您将 OPcache with opcache.validate_timestamps
设置为零,则可能会出现您描述的问题。 validate_timestamps 设置为零,OPcache 从不检查文件的更新版本。这会略微提高性能,但这意味着您将需要手动刷新缓存。
您可以通过两种方式解决此问题:
- 在您的 php.ini 中将 opcache.validate_timestamps 设置为 1。这将导致性能略有下降。
- ...或在部署期间刷新缓存,在部署新文件后,通过在 PHP 脚本中调用
opcache_reset()
。
请注意,因为您使用的是 php-fpm,您应该能够从 cli 刷新缓存。如果您将 Apache 与 mod_php 一起使用,则需要在 Apache 调用的脚本(通过 HTTP 请求)而不是从 cli 中刷新缓存。必须在您的应用程序运行的上下文中刷新缓存。
我在尝试使用 Capistrano 将 Laravel 应用程序部署到 Ubuntu 服务器时遇到问题。
我的部署目录是/var/www/project_stage。当我将项目部署到该目录时,一切正常。我的项目上线了,每一行代码都正常工作。
但是当我进行更改并部署同一个项目的新版本时,不知何故(我猜)我的文件被缓存并且没有响应最新版本,它们仍然响应旧版本正在被覆盖。
当我将项目部署到另一个文件夹(等:/var/www/project_stage2 而不是 /var/www/project_stage)并更改我的 Nginx 配置以从该文件夹提供服务时,它再次正常工作。但不是在第二次部署到同一目录。所以我可以说我每次都可以部署到不同的目录,但我不能部署到同一个目录两次。它总是在第一次部署时响应。
这是我尝试过的方法:
- 我检查了Capistrano的当前目录是否链接到 正确的文件夹,它有。
- 我检查了我所做的更改是否在新部署中可见,这 他们是。文件在新部署时完全更改。
- 我检查了Nginx是否在寻找正确的发布目录,它 有。
- 我试过运行
php artisan cache:clear
,route:clear
,view:clear
、config:cache
命令和我 运行composer dump-autoload
也是。没有任何效果。 - 我把Nginx的
sendfile
参数改成off
重启了,不行 结果。 - 我在 this 问题上阅读了类似的问题,但它没有用 我的情况。
这是我的 deploy.rb:
#deploy_path inherited from staging.rb lock "~> 3.10.1" set :application, "project_stage" set :repo_url, "MY REPO HERE" set :keep_releases, 10 set :laravel_dotenv_file, "./.env.staging" namespace :deploy do before :updated, :easy do on roles(:all) do |host| execute :chmod, "-R 777 #{deploy_path}/shared/storage/logs" execute :chmod, "-R 777 #{deploy_path}/shared/storage/framework" end end after :finished, :hard do on roles(:all) do |host| end end desc "Build" after :updated, :build do on roles(:web) do within release_path do execute :php, "artisan clear-compiled" execute :php, "artisan cache:clear" execute :php, "artisan view:clear" execute :php, "artisan route:cache" execute :php, "artisan config:cache" end end end end #end deploy namespace
我正在使用 PHP7.0(带 unix 套接字的 FPM)、Nginx、Laravel5、Capistrano3(带 capsitano/laravel gem)、Ubuntu服务器 16.4。
如果您将 OPcache with opcache.validate_timestamps
设置为零,则可能会出现您描述的问题。 validate_timestamps 设置为零,OPcache 从不检查文件的更新版本。这会略微提高性能,但这意味着您将需要手动刷新缓存。
您可以通过两种方式解决此问题:
- 在您的 php.ini 中将 opcache.validate_timestamps 设置为 1。这将导致性能略有下降。
- ...或在部署期间刷新缓存,在部署新文件后,通过在 PHP 脚本中调用
opcache_reset()
。
请注意,因为您使用的是 php-fpm,您应该能够从 cli 刷新缓存。如果您将 Apache 与 mod_php 一起使用,则需要在 Apache 调用的脚本(通过 HTTP 请求)而不是从 cli 中刷新缓存。必须在您的应用程序运行的上下文中刷新缓存。