Обнаружена ошибка разрешения файла при запуске CakePHP в Ubuntu 10.4 - PullRequest
18 голосов
/ 16 января 2012

Я установил фреймворк 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_ не смог записать «cake_dev_en-us» в кэш файла в /var/www/cakephp/lib/Cake/Cache/Cache.php в строке 310
Предупреждение:/ var / www / cakephp / app / tmp / cache / persistent / недоступна для записи в / var / www / cakephp /lib/Cake/Cache/Engine/FileEngine.php в строке 320
Предупреждение: / var / www /cakephp / app / tmp / cache / models / недоступен для записи в /var/www/cakephp/lib/Cake/Cache/Engine/FileEngine.php в строке 320
Предупреждение: / var / www / cakephp / app/ tmp / cache / недоступен для записи в / var / www / cakephp / lib / Cake /Cache/Engine/FileEngine.php в строке 320

Ответы [ 5 ]

45 голосов
/ 16 января 2012

Команда 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 голос
/ 17 июля 2018

Использование chmod -R 777 / var / www / cakephp / app / tmp / , т.е. создание исполняемой папки, решит эту проблему. Я даже сталкивался с подобной проблемой при тестировании оболочки cron, то есть в папке app / Console / Command /. Когда мы выполняем cron несколько раз, разрешение tmp / folder перезаписывается, и на этом этапе появляется ошибка разрешения, которой можно избежать, если сделать tmp / folder рекурсивно исполняемым.

1 голос
/ 04 сентября 2017

Я столкнулся с очень похожей проблемой с 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"

И это помогает, моя проблема была исправлена.Возможно, это будет полезно для кого-то.Наслаждайтесь!

1 голос
/ 15 марта 2016

Я столкнулся с похожими проблемами. Вот пара вещей, которые мне помогли:

Если вы не хотите использовать метод «кувалды» chmod 777 (например, вы можете избегать его при производстве ), инструкции по установке CakePHP содержат подробные сведения о том, как использовать ACL вместо:

Обратите внимание, что вам, вероятно, потребуется использовать sudo для команд setfacl, приведенных там.

Однако, по моему опыту (CakePHP 2), этих команд недостаточно. Эти команды предоставляют вашему пользователю веб-сервера доступ к кешу и т. Д., Но все, что вы запускаете из командной строки (например, команда cake), вероятно, будет работать как ваш пользователь, а не как пользователь пользователь веб-сервера.

Таким образом, вы должны выполнить команды setfacl, связанные с вышеуказанным, во второй раз, заменив ${HTTPDUSER} вашим именем пользователя. Если вы не уверены, какое у вас имя пользователя, введите whoami, чтобы найти его.

0 голосов
/ 03 декабря 2017

В качестве временного исправления, если вы хотите использовать предоставленный файл .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}"
...