在 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 递归地遍历子目录吗? 确实如此,我完全忽略了递归标志。不过,仍然很好奇 persistentmodels 是否拥有正确的权限。 您好,感谢您的快速回复。我做了权限。现在我在启动 apache2 时遇到错误:无效的命令“订单”,可能拼写错误或由服务器配置操作“启动”中未包含的模块定义。操作“启动”失败。 Apache 错误日志可能包含更多信息。 您的 Apache 配置文件中似乎有问题。确保 Apache 模块 mod_authz_host 已加载,并且您的配置文件中 Order, allow, deny 指令(mod_authz_host 的一部分)的语法是否正确。 大家好,我遇到了一个问题——在蛋糕的未知条件下,某些东西以某种方式改变了 /tmp 的权限,所以我必须再次将它们改回来。有谁知道为什么会发生这种情况/如何追踪问题?谢谢【参考方案2】:

我也遇到过类似的问题。以下是对我有帮助的几件事:

如果您不想使用chmod 777 的“大锤”方法(例如,您可能想要avoid it on production),CakePHP 安装说明提供了有关如何使用 ACL 的详细信息:

蛋糕2:http://book.cakephp.org/2.0/en/installation.html#permissions 对于蛋糕 3:http://book.cakephp.org/3.0/en/installation.html#permissions

请注意,您可能需要将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 时遇到文件权限错误的主要内容,如果未能解决你的问题,请参考以下文章

更新 ubuntu 10.4 后无法将 errno.h 与 gcc/g++ 一起使用

如何在Ubuntu 10.4上手OpenCV的2.4.2

cakephp 在 Ubuntu 上无法进行 url 重写

ORM如何在CakePHP3中运行

linux mint现在不能安装卸载和升级了

cakephp 3 中的控制器未运行