63

I have had to use the

app/console cache:clear  command

to solve a problem when generating an entity.

I am now unable to load my homepage on :

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

it says :

RuntimeException: Failed to write cache file "/var/www/projet_etienne/app/cache/dev/classes.php".

I don't understand much about this cache business!

In my app/cache folder, I got a dev, a dev_new, a dev_old folder. Is that normal?

the

app/console cache:clear

generates by the way a :

[ErrorException] Warning: rename(/var/www/projet_etienne/app/cache/dev,/var/www/projet_etien
ne/app/cache/dev_old): Directory not empty in /var/www/projet_etienne/vendo
r/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearComm
and.php line 77

please help!

4

10 回答 10

102

有关良好且明确的解决方案,请参阅第 1Setting up Permissions节中的 Installing and Configuring Symfony部分:

设置权限

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

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

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

  1. 在支持 chmod +a 的系统上使用 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 的系统上使用 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

如果前面的方法都不适合您,请更改 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

来源: 清除缓存时无法写入缓存文件“/var/www/myapp/app/cache/dev/classes.php”

于 2013-02-25T15:17:36.797 回答
26

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

Symfony 2

chmod -R 777 app/cache app/logs

Symfony 3 目录结构

chmod -R 777 var/cache var/logs

其他资源

Symfony 的权限解决方案(前面提到过)。

KPN 大学的权限解决方案- 还包括安装屏幕。

注意:如果你使用 Symfony 3 目录结构,用app/cacheandapp/logs替换var/cacheand var/logs

于 2014-06-17T19:20:34.373 回答
16

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

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

如果这不能解决问题,请确保在某处保存这些文件夹的副本以放回

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

于 2012-11-03T20:59:42.647 回答
13

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

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

rm -rf app/cache/dev*

于 2012-11-14T10:29:12.477 回答
9

可能你忘了改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

希望能帮助到你..

于 2014-08-03T07:32:29.477 回答
2

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

rm -rf app/cache/*
rm -rf app/logs/*
于 2014-02-10T19:53:14.863 回答
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
于 2017-01-25T17:20:35.743 回答
1

如果 symfony 版本低于 2.8

sudo chmod -R 777 app/cache/*

如果 symfony 版本大于或等于 3.0

sudo chmod -R 777 var/cache/*

于 2018-06-05T14:15:30.867 回答
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):无法打开流:权限被拒绝”同时读取上游

下面的修复帮助了我。

在 Dockerfile for nginx 容器中添加行:

RUN usermod -u 1000 www-data

在 Dockerfile for php-fpm 容器中添加行:

RUN usermod -u 1000 www-data

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

于 2020-10-19T15:22:26.183 回答
0

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

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

命令解释:

setfacl -> Set acl command    
-d -> default behavior    
-m -> modify 
u:www-data: -> for user 
rwx -> adding permissions  
var -> on the folder
于 2019-08-08T10:52:23.350 回答