symfony2:无法写入缓存目录

时间:2012-11-03 17:48:33

标签: symfony

我不得不使用

app/console cache:clear  command

在生成实体时解决问题。

我现在无法加载我的主页:

  http://localhost/projet_etienne/web/app_dev.php

它说:

  

RuntimeException:无法写入缓存文件“/var/www/projet_etienne/app/cache/dev/classes.php”。

我对这个缓存业务了解不多!

在我的app/cache文件夹中,我有一个dev,一个dev_new,一个dev_old文件夹。这是正常的吗?

app/console cache:clear

以a:

的方式生成
  

[ErrorException]   警告:重命名(/ var / www / projet_etienne / app / cache / dev,/ var / www / projet_etien
        ne / app / cache / dev_old):/ var / www / projet_etienne / vendo中的目录不为空        R / symfony中/ symfony中/ src目录/ Symfony的/包/ FrameworkBundle /命令/ CacheClearComm
       and.php第77行

请帮忙!

10 个答案:

答案 0 :(得分:92)

对于GOOD和明确的解决方案,请参阅Setting up Permissions部分中的Installing and Configuring Symfony部分:

  

设置权限

     

安装Symfony时的一个常见问题是app / cache和   app / logs目录必须可由Web服务器和   命令行用户。在UNIX系统上,如果您的Web服务器用户是   与命令行用户不同,您可以尝试其中一个   以下解决方案。

     
      
  1. 对CLI和Web服务器使用相同的用户
  2.         

    在开发环境中,通常的做法是使用相同的方法   CLI和Web服务器的UNIX用户,因为它避免了任何   设置新项目时会出现这些权限问题。这可以   通过编辑您的Web服务器配置来完成(例如,通常   用于Apache的httpd.conf或apache2.conf并将其用户设置为   与CLI用户相同(例如,对于Apache,更新用户和组   值)。

         
        
    1. 在支持chmod + a
    2. 的系统上使用ACL         

      许多系统允许您使用chmod + a命令。先试一下,   如果您收到错误 - 请尝试下一个方法。这使用命令   尝试确定您的Web服务器用户并将其设置为HTTPDUSER:

      $ rm -rf app/cache/*
      $ rm -rf app/logs/*
      
      $ HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`
      $ sudo chmod +a "$HTTPDUSER allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
      $ sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
      
           
          
      1. 在不支持chmod + a
      2. 的系统上使用ACL         

        某些系统不支持chmod + a,但支持其他实用程序   叫做setfacl。您可能需要在分区上启用ACL支持   并在使用之前安装setfacl(与Ubuntu一样)。这个   使用命令尝试确定您的Web服务器用户并将其设置为   HTTPDUSER:

        $ HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`
        $ sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs
        $ sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs
        
             

        对于Symfony 3,它将是:

        $ HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`
        $ sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX var/cache var/logs
        $ sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX var/cache var/logs
        
             

        如果这样   不起作用,尝试添加-n选项。

             
            
        1. 不使用ACL
        2.         

          如果以上方法都不适合您,请更改umask   缓存和日志目录将是可写组或全局可写的   (取决于Web服务器用户和命令行用户是否在   同一组与否)。为此,请将以下行放在   app / console,web / app.php和web / app_dev.php文件的开头:

          umask(0002); // This will let the permissions be 0775
          
          // or
          
          umask(0000); // This will let the permissions be 0777
          
               

          请注意,当您在服务器上访问ACL时,建议使用ACL   因为更改umask不是线程安全的。

http://symfony.com/doc/current/book/installation.html#checking-symfony-application-configuration-and-setup

来源: Failed to write cache file "/var/www/myapp/app/cache/dev/classes.php" when clearing the cache

答案 1 :(得分:22)

很可能意味着目录和/或子目录不可写。许多人忘记了子目录。

Symfony 2

chmod -R 777 app/cache app/logs

Symfony 3目录结构

chmod -R 777 var/cache var/logs

其他资源

Permissions solution by Symfony(之前提到过)。

Permissions solution by KPN University - 另外还包括安装时的屏幕播放。

注意:如果您正在使用Symfony 3目录结构,请将app/cacheapp/logs替换为var/cachevar/logs

答案 2 :(得分:17)

如果文件夹已经可写,那就不是问题了。

您也可以导航到/www/projet_etienne/app/cache/并手动删除其中的文件夹(dev,dev_new,dev_old)。

如果这不能解决问题,请务必在某个地方保存这些文件夹的副本

我知道这不是它应该做的方式,但现在它对我有用了几次。

答案 3 :(得分:11)

您可能已中途清除了一个clearcache,现在您已经拥有了app / cache / dev_old。

尝试这个(在项目的根目录中,假设您使用的是OS X或Linux等Unixy环境):

rm -rf app/cache/dev*

答案 4 :(得分:8)

也许您忘了更改app / cache app / log

的权限

我正在使用Ubuntu

sudo chmod -R 777 app/cache
sudo chmod -R 777 app/logs
sudo setfacl -dR -m u::rwX app/cache app/logs

希望有所帮助......

答案 5 :(得分:1)

我将整个目录从我的Windows安装移动到unix生产服务器,我得到了同样的错误。为了解决这个问题,我只是在unix中运行了这两行,一切都运行良好

rm -rf app/cache/*
rm -rf app/logs/*

答案 6 :(得分:1)

我执行了:

ps aux | grep apache

得到类似的东西:

root     28147  0.0  5.4 326336 27024 ?        Ss   20:06   0:00 /usr/sbin/apache2 -k start
www-data 28150  0.0  1.3 326368  6852 ?        S    20:06   0:00 /usr/sbin/apache2 -k start
www-data 28151  0.0  4.4 329016 22124 ?        S    20:06   0:00 /usr/sbin/apache2 -k start
www-data 28152  0.1  6.0 331252 30092 ?        S    20:06   0:00 /usr/sbin/apache2 -k start
www-data 28153  0.0  1.3 326368  6852 ?        S    20:06   0:00 /usr/sbin/apache2 -k start
www-data 28154  0.0  1.3 326368  6852 ?        S    20:06   0:00 /usr/sbin/apache2 -k start
www-data 28157  0.0  1.3 326368  6852 ?        S    20:06   0:00 /usr/sbin/apache2 -k start
user     28297  0.0  0.1  15736   924 pts/4    S+   20:12   0:00 grep --color=auto apache

所以我没有访问权限的用户被证明是www-data因此我执行了命令:

sudo chown -R www-data app/cache
sudo chown -R www-data app/logs

它解决了访问错误。

  

永远不要使用不安全的777来解决特定的访问问题:

sudo chmod -R 777 app/cache
sudo chmod -R 777 app/logs

答案 7 :(得分:0)

如果symfony版本小于2.8



.text1 :
{
    *\libc.a:*(.text .text.*)     // libc.a.text still resides in rom
    *\libc.a:*(.rodata .rodata.*) // libc.a.rodata still resides in rom
} > rom1

.data1 :
{
    *\libc.a:*(.data .data.*)    // libc.a.data still resides in ram
} > ram1 AT > rom1

.bss1 (NOLOAD) :
{
    *\libc.a:*(.bss .bss.*)      // libc.a.bss still resides in ram
} > ram1




如果symfony版本大于或等于3.0



sudo chmod -R 777 app/cache/*




答案 8 :(得分:0)

仅使用此acl cmd,下次在var中创建文件时,它将对www-data用户具有r / w / x权限。

cd var 
rm -rf *
cd ..
setfacl -d -m u:www-data:rwx var

Cmd说明:

setfacl -> Set acl command    
-d -> default behavior    
-m -> modify 
u:www-data: -> for user 
rwx -> adding permissions  
var -> on the folder

答案 9 :(得分:0)

如果在使用docker(我的Symfony版本5.1)启动Symfony项目时遇到此错误。或类似这样的错误:

未捕获的异常:读取上游时无法写入文件“ /var/www/html/mysite.com.local/var/cache/dev/App_KernelDevDebugContainer.xml”

未捕获的警告:file_put_contents(/var/www/html/mysite.com.local/var/cache/dev/App_KernelDevDebugContainerDeprecations.log):无法打开流:读取上游时权限被拒绝

下面的修复帮助了我。

在nginx容器的Dockerfile中添加行:

RUN usermod -u 1000 www-data

在用于php-fpm容器的Dockerfile中添加行:

RUN usermod -u 1000 www-data

然后删除目录“ / var / cache”,“ / var / log”中的所有内容并重建docker的容器。