在 Ubuntu 10.4 中运行 CakePHP 时遇到文件权限错误
Posted
技术标签:
【中文标题】在 Ubuntu 10.4 中运行 CakePHP 时遇到文件权限错误【英文标题】:Facing a file permission error while running CakePHP in Ubuntu 10.4 【发布时间】:2012-02-11 08:53:59 【问题描述】:我已经使用以下步骤安装了 Cakephp 2.0 框架:
1. Start the terminal
2. sudo mkdir /var/www/cakephp
3.sudo cp -r ~/cakephp/* /var/www/cakephp
更改 tmp 文件夹权限
4. sudo chmod -R 777 cakephp/app/tmp
启用模组重写
5. sudo a2enmod rewrite
打开文件 /etc/apache2/sites-enabled/000-default 并将 AllowOverride None
更改为 AllowOverride All
6. sudo vim /etc/apache2/sites-enabled/000-default
重启 Apache
7. sudo /etc/init.d/apache2 restart
我打开浏览器并输入地址 http://localhost/cakephp/ 并看到以下错误消息:
警告:_cake_core_ 缓存无法将“cake_dev_en-us”写入 /var/www 中的文件缓存 /cakephp/lib/Cake/Cache/Cache.php 在第 310 行 警告:_cake_core_ 缓存无法 在第 310 行的 /var/www/cakephp/lib/Cake/Cache/Cache.php 中将“cake_dev_en-us”写入文件缓存 警告:/var/www/cakephp/app/tmp/cache/persistent/ 在 /var/www/cakephp 中不可写 /lib/Cake/Cache/Engine/FileEngine.php 在第 320 行 警告:/var/www/cakephp/app/tmp/cache /models/ 在第 320 行的 /var/www/cakephp/lib/Cake/Cache/Engine/FileEngine.php 中不可写 警告:/var/www/cakephp/app/tmp/cache/ 在 /var/www/cakephp/lib/Cake 中不可写 /Cache/Engine/FileEngine.php 在第 320 行
【问题讨论】:
你确定第四步做了什么吗?当你发出命令时,你在 /var/www/ 吗?试试sudo chmod -R 777 /var/www/cakephp/app/tmp
。
可能重复? ***.com/questions/12718331/…
【参考方案1】:
命令sudo chmod -R 777 cakephp/app/tmp
只让tmp
可写,你应该让cache和它的子目录也可写,否则Cake无法将缓存文件写入tmp中的cache目录。
所以,这些目录应该是可写的:
cakephp/app/tmp/cache
cakephp/app/tmp/cache/persistent
cakephp/app/tmp/cache/models
确保日志目录也是可写的:cakephp/app/tmp/logs
。
【讨论】:
-R
开关不是让 chmod 递归地遍历子目录吗?
确实如此,我完全忽略了递归标志。不过,仍然很好奇 persistent
和 models
是否拥有正确的权限。
您好,感谢您的快速回复。我做了权限。现在我在启动 apache2 时遇到错误:无效的命令“订单”,可能拼写错误或由服务器配置操作“启动”中未包含的模块定义。操作“启动”失败。 Apache 错误日志可能包含更多信息。
您的 Apache 配置文件中似乎有问题。确保 Apache 模块 mod_authz_host
已加载,并且您的配置文件中 Order, allow, deny
指令(mod_authz_host
的一部分)的语法是否正确。
大家好,我遇到了一个问题——在蛋糕的未知条件下,某些东西以某种方式改变了 /tmp 的权限,所以我必须再次将它们改回来。有谁知道为什么会发生这种情况/如何追踪问题?谢谢【参考方案2】:
我也遇到过类似的问题。以下是对我有帮助的几件事:
如果您不想使用chmod 777
的“大锤”方法(例如,您可能想要avoid it on production),CakePHP 安装说明提供了有关如何使用 ACL 的详细信息:
请注意,您可能需要将sudo
用于此处给出的setfacl
命令。
但是,根据我的经验(CakePHP 2),这些命令还不够。这些命令使您的 webserver 用户 可以访问缓存等,但是您从命令行运行的任何内容(如 cake
命令)都可能以 your 用户身份运行比网络服务器用户。
因此,您应该再次运行上面链接的setfacl
命令,将$HTTPDUSER
替换为您的用户名。如果您不确定自己的用户名是什么,请输入 whoami
来查找。
【讨论】:
【参考方案3】:我遇到了一个与 cachePhp 3 非常相似的问题。
Warning (512): /cache/persistent/ is not writable [CORE/src/Cache/Engine/FileEngine.php, line 439]
Warning (512): Cache engine Cake\Cache\Engine\FileEngine is not properly configured. [CORE/src/Cache/Cache.php, line 177]
因为我是 CakePhp 的新手,所以我调试了有问题的文件 - CORE/src/Cache/Engine/FileEngine.php。 下面是类似下一个的函数:
protected function _active()
$dir = new SplFileInfo($this->_config['path']);
$path = $dir->getPathname();
$success = true;
if (!is_dir($path))
//@codingStandardsIgnoreStart
$success = @mkdir($path, 0775, true);
//@codingStandardsIgnoreEnd
$isWritableDir = ($dir->isDir() && $dir->isWritable());
if (!$success || ($this->_init && !$isWritableDir))
$this->_init = false;
trigger_error(sprintf(
'%s is not writable',
$this->_config['path']
), E_USER_WARNING);
return $success;
它检查缓存目录是否可写并获取有关路径形式$this->_config['path']
变量的数据。这个变量默认从 .env 文件初始化(如果你使用它的话),它有如下几行:
export CACHE_DEFAULT_URL="File://tmp/cache/?prefix=$APP_NAME_default&duration=$CACHE_DURATION"
export CACHE_CAKECORE_URL="File://tmp/cache/persistent?prefix=$APP_NAME_cake_core&serialize=true&duration=$CACHE_DURATION"
export CACHE_CAKEMODEL_URL="File://tmp/cache/models?prefix=$APP_NAME_cake_model&serialize=true&duration=$CACHE_DURATION"
我已将所有File:
更改为Null:
,如下所示:
export CACHE_DEFAULT_URL="Null://tmp/cache/?prefix=$APP_NAME_default&duration=$CACHE_DURATION"
export CACHE_CAKECORE_URL="Null://tmp/cache/persistent?prefix=$APP_NAME_cake_core&serialize=true&duration=$CACHE_DURATION"
export CACHE_CAKEMODEL_URL="Null://tmp/cache/models?prefix=$APP_NAME_cake_model&serialize=true&duration=$CACHE_DURATION"
export CACHE_DRV_DEFLT = "Null"
export CACHE_DRV_MODEL = "Null"
export CACHE_DRV_CORE = "Null"
这很有帮助,我的问题得到了解决。可能对某人有帮助。享受吧!
【讨论】:
【参考方案4】:使用 chmod -R 777 /var/www/cakephp/app/tmp/ 即使文件夹可执行将解决此问题。 我什至在测试 cron 时遇到了类似的问题,即存在于 app/Console/Command/ 文件夹中的 shell。当我们多次执行 cron 时,tmp/ 文件夹权限被覆盖,此时会出现权限错误,这可以通过递归执行 tmp/ 文件夹来避免。
【讨论】:
【参考方案5】:作为临时修复,如果您想使用提供的 .env 文件并且权限未解决您的问题,请修改 .env 文件以使用指向您的应用目录的绝对路径
export CACHE_FOLDER="/var/www/absolute_path_to_my_cakephp_app/"
export CACHE_DURATION="+2 minutes"
export CACHE_DEFAULT_URL="file://$CACHE_FOLDERtmp/cache/?prefix=$APP_NAME_default&duration=$CACHE_DURATION"
export CACHE_CAKECORE_URL="file://$CACHE_FOLDERtmp/cache/persistent?prefix=$APP_NAME_cake_core&serialize=true&duration=$CACHE_DURATION"
export CACHE_CAKEMODEL_URL="file://$CACHE_FOLDERtmp/cache/models?prefix=$APP_NAME_cake_model&serialize=true&duration=$CACHE_DURATION"
【讨论】:
【参考方案6】:“chmod -R 777 tmp/cache
”如果 tmp 文件夹不存在,则使用 mkdir tmp 和 mkdir tmp/cache 创建 tmp 文件
chmod -R 777 logs
chmod -R 777 tmp/sessions
chmod -R 777 tmp/tests
chcon -R -t httpd_sys_content_rw_t 'tmp'
chcon -R -t httpd_sys_content_rw_t 'logs'
【讨论】:
以上是关于在 Ubuntu 10.4 中运行 CakePHP 时遇到文件权限错误的主要内容,如果未能解决你的问题,请参考以下文章