使用 capistrano 缓存文件部署 Laravel

标签 laravel caching nginx deployment capistrano

我在尝试使用 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 从 staging.rb 继承

    锁定“~> 3.10.1”

    设置:应用程序,“project_stage”
    设置:repo_url,“我的 repo 在这里”
    设置:keep_releases, 10

    设置 :laravel_dotenv_file, "./.env.staging"

    命名空间:部署做

    之前 :updated, :easy do
    在角色(:all) 上做 |host|

    执行 :chmod, "-R 777 #{deploy_path}/shared/storage/logs"
    执行 :chmod, "-R 777 #{deploy_path}/shared/storage/framework"

    结尾
    结尾



    在 :finished, :hard do 之后
    在角色(:all) 上做 |host|

    结尾
    结尾

    描述“构建”
    在 :updated, :build 之后
    在角色(:web)上做
    在 release_path 内做
    执行:php,“工匠清晰编译”
    执行:php,“工匠缓存:清除”
    执行:php,“工匠 View :清除”
    执行:php,“工匠路线:缓存”
    执行:php,“工匠配置:缓存”
    结尾
    结尾
    结尾

    end #end 部署命名空间


    我正在使用 PHP7.0(带有 unix 套接字的 FPM)、Nginx、Laravel5、Capistrano3(带有 capsitano/laravel gem)、Ubuntu Server 16.4。

    最佳答案

    如果您使用 OPcache,可能会出现您所描述的问题。与 opcache.validate_timestamps 设置为零。当 validate_timestamps 设置为零时,OPcache 从不检查文件的更新版本。这会稍微提高性能,但这意味着您需要手动刷新缓存。

    您可以做两件事来解决问题:

  • 在 php.ini 中将 opcache.validate_timestamps 设置为 1。这将导致小的性能下降。
  • ...或在部署期间刷新缓存,在部署新文件后,调用 opcache_reset() 在 PHP 脚本中。

  • 请注意,因为您使用的是 php-fpm,所以您应该能够从 cli 刷新缓存。如果您将 Apache 与 mod_php 一起使用,则需要在由 Apache(通过 HTTP 请求)而不是从 cli 调用的脚本中刷新缓存。缓存必须在应用程序运行的上下文中刷新。

    关于使用 capistrano 缓存文件部署 Laravel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48369324/

    相关文章:

    laravel - 为什么Laravel 4 CSRF token 不起作用?

    reactjs - 带有水果蛋糕的 Laravel CORS

    php - Laravel 5 中自定义验证规则的自定义占位符

    java - hibernate的hibernate.cache.use_structed_entries能做什么?

    c++ - 为什么添加填充可以让你的循环更快?

    asp.net - 清除表单字段的缓存

    django - 使用 nginx 反向代理 + docker 设置避免 Google oauth 在从公共(public)服务器调用时重定向到本地主机

    nginx - Derby 安Linux : Start Nginx at rebooting machine

    Nginx:如何防止在代理上缓存ajax请求?

    php - Laravel 总是返回带有碳的日期列