Столкнувшись с ошибкой разрешения файла при запуске CakePHP в Ubuntu 10.4


Я установил фреймворк 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/сайты-включено/000-по умолчанию и измените 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/приложение/tmp/кэш/постоянный/недоступен для записи в /var/www/cakephp /lib/Cake/Cache/Engine/FileEngine.php на линии 320
Предупреждение: /var/www/cakephp/приложение/tmp/кэш /модели/ недоступны для записи в /var/www/cakephp/lib/Cake/Cache/Engine/FileEngine.php на линии 320
Предупреждение: /var/www/cakephp/приложение/tmp/кэш/недоступен для записи в /var/www/cakephp/lib/Торт /Cache/Engine/FileEngine.php на линии 320

Author: JJJ, 2012-01-16

5 answers

Команда 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.

 45
Author: mensch, 2012-01-16 12:08:05

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

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

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

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

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

 1
Author: Sam, 2016-03-15 11:33:42

Я столкнулся с очень похожей проблемой с 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
Author: Vaha, 2017-09-04 08:48:16

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

 1
Author: Dhiraj, 2018-07-17 10:30:30

В качестве временного исправления, если вы хотите использовать предоставленный файл .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}"
 0
Author: Ionut Irofte, 2017-12-03 06:56:24