在Ubuntu 10.4中运行CakePHP时遇到文件权限错误

时间:2012-01-16 11:52:15

标签: cakephp ubuntu-10.04

我已经使用以下步骤安装了CakePHP 2.0框架:

1. Start the terminal
2. sudo mkdir /var/www/cakephp
3.sudo cp -r ~/cakephp/* /var/www/cakephp

更改tmp文件夹permisssion

4. sudo chmod -R 777 cakephp/app/tmp

启用mod-rewrite

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_ cache无法将“cake_dev_en-us”写入/ var / www中的文件缓存       第310行的/cakephp/lib/Cake/Cache/Cache.php
  警告:_ cake_core_ cache无法执行       在第310行的/var/www/cakephp/lib/Cake/Cache/Cache.php中将'cake_dev_en-us'写入文件缓存中
  警告:/ var / www / cakephp / app / tmp / cache / persistent /在/ var / www / cakephp中不可写       第320行的/lib/Cake/Cache/Engine/FileEngine.php
  警告:/ var / www / cakephp / app / tmp / cache       / models /在第320行的/var/www/cakephp/lib/Cake/Cache/Engine/FileEngine.php中不可写   警告:在/ var / www / cakephp / lib / Cake中,/ var / www / cakephp / app / tmp / cache /不可写       第320行的/Cache/Engine/FileEngine.php

6 个答案:

答案 0 :(得分:45)

命令sudo chmod -R 777 cakephp/app/tmp只使tmp可写,你应该创建缓存,它的子目录也可写,否则Cake无法将缓存文件写入tmp中的缓存目录。

因此,这些目录应该是可写的:

cakephp/app/tmp/cache
cakephp/app/tmp/cache/persistent
cakephp/app/tmp/cache/models

确保日志目录也可写:cakephp/app/tmp/logs

答案 1 :(得分:1)

我遇到过类似的问题。以下是帮助我的一些事情:

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

请注意,您可能需要sudo使用setfacl命令。

但是,根据我的经验(CakePHP 2),这些命令还不够。这些命令使您的 webserver用户可以访问缓存等,但是您从命令行运行的任何内容(如cake命令)都可能以您的运行用户而不是网络服务器用户。

因此,您应该再次运行上面链接到的setfacl命令,将${HTTPDUSER}替换为您的用户名。如果您不确定自己的用户名是什么,请输入whoami进行查找。

答案 2 :(得分:1)

我遇到了与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"

它有帮助,我的问题得到解决。可能对某人有帮助。享受!

答案 3 :(得分:1)

使用 chmod -R 777 / var / www / cakephp / app / tmp / ,即使文件夹可执行将解决此问题。 我在测试cron(即app / Console / Command /文件夹中的shell)时甚至遇到了类似的问题。当我们多次执行cron时,tmp /文件夹权限将被覆盖,并且此时会出现权限错误,这可以通过递归使tmp /文件夹可执行来避免。

答案 4 :(得分:0)

作为临时修复,如果您要使用提供的.env文件并且权限无法解决您的问题,请修改.env文件以使用指向您的应用程序目录的绝对路径

export CACHE_FOLDER="/var/www/absolute_path_to_my_cakephp_app/"
export CACHE_DURATION="+2 minutes"
export CACHE_DEFAULT_URL="file://${CACHE_FOLDER}tmp/cache/?prefix=${APP_NAME}_default&duration=${CACHE_DURATION}"
export CACHE_CAKECORE_URL="file://${CACHE_FOLDER}tmp/cache/persistent?prefix=${APP_NAME}_cake_core&serialize=true&duration=${CACHE_DURATION}"
export CACHE_CAKEMODEL_URL="file://${CACHE_FOLDER}tmp/cache/models?prefix=${APP_NAME}_cake_model&serialize=true&duration=${CACHE_DURATION}"

答案 5 :(得分:0)

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'