使用Capifony部署我的Symfony2应用程序已经开始打破实时发布的缓存

时间:2012-12-18 13:32:44

标签: php deployment symfony capifony

这可能是一个小问题,但我希望有人可以提供帮助。直到昨天我试图将一些更改推向生产时,这总是工作正常,但从那时起,最后3次部署都暂时破坏了实时网站。这是日志中的例外之一:

[2012-12-18 12:12:16] request.CRITICAL: Exception thrown when handling an exception (InvalidArgumentException: The directory "/path/to/app/releases/20121217134758/app/cache/prod/jms_diextra/metadata" is not writable.) [] []
[2012-12-18 12:12:18] request.CRITICAL: InvalidArgumentException: The directory "/path/to/app/releases/20121217134758/app/cache/prod/jms_diextra/metadata" is not writable. (uncaught exception) at /path/to/app/releases/20121217134758/vendor/jms/metadata/src/Metadata/Cache/FileCache.php line 17 [] []

我不明白为什么以前版本的缓存目录(部署前的当前)应该受到影响!这是我在部署中发生的地方:

--> Updating code base with remote_cache strategy
--> Creating cache directory...........................✔
--> Creating symlinks for shared directories...........✔
--> Creating symlinks for shared files.................✔
--> Normalizing asset timestamps.......................✔
Do you want to copy last release vendor dir then do composer install ?: (y/N)
y
--> Copying vendors from previous release..............✔
--> Downloading Composer...............................✔
--> Updating Composer dependencies..................... BREAK HAPPENS HERE OR SOON BEFORE

如您所见,我的缓存目录甚至不能在部署之间共享:

# in deploy.rb

set :shared_files,      ["app/config/parameters.yml"]
set :shared_children, [app_path + "/logs", web_path + "/uploads", web_path + "/videos", app_path + "/spool"]

值得庆幸的是,我第一次做好准备并且有一个ssh控制台,其中sudo chmod -R 0777 app/cache/ app/logs/准备好被解雇,但这并不是一个永久的解决方案。

注意:我目前正在将缓存/日志目录的权限作为自定义的部署后挂钩处理:

# in deploy.rb

after "deploy:finalize_update" do
  # Ensure htaccess points to app.php and not app_dev.php
  run "sed -i 's/app_dev/app/' #{latest_release}/#{web_path}/.htaccess"

  # Use a unique APC prefix to guarantee there are no clashes
  run "sed -i 's/_VERSION/_#{release_name}/' #{latest_release}/#{web_path}/app.php"

  # Set permissions of all 'writable_dirs' using sudo
  pretty_print "--> Setting permissions"
  dirs = []
  writable_dirs.each do |link|
    if shared_children && shared_children.include?(link)
      absolute_link = shared_path + "/" + link
    else
      absolute_link = latest_release + "/" + link
    end
    dirs << absolute_link
  end
  sudo sprintf("chmod -R 0777 %s", dirs.join(' '))
end

更新

在我最近的部署期间,我注意到异常在稍后发生,所以它与依赖关系无关。我怀疑这可能是因为执行一个调用当前版本控制台的cron然后显然会影响缓存。这很有道理,因为我最近只设置了cron。

但我不知道如何解决这个问题。查看文档中的Setting up permissions部分,似乎可能有两个选项。我对setfacl一无所知,所以我担心会破坏某些东西。使用umask选项是个好主意吗?

1 个答案:

答案 0 :(得分:1)

我最终选择umask选项,就像我在更新中提到的那样。虽然,我认为这是由控制台引起的问题,但我只取消注释了umask(1000);中的app/console行 - 而不是web/app.phpweb/app_dev.php。自从进行此更改以来我所做的少数部署没有出现这个问题所以我想这就完成了。