Столкнувшись с ошибкой разрешения файла при запуске 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
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
.
Я сталкивался с подобными проблемами. Вот пара вещей, которые мне помогли:
Если вы не хотите использовать подход "кувалды" chmod 777
(например, вы можете захотеть избежать его при производстве ), инструкции по установке 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), этих команд недостаточно. Эти команды предоставляют вашему пользователю веб-сервера доступ к кэшу и т. Д., Но все, что вы запускаете из командной строки (например, команда cake
), Вероятно, будет выполняться как ваш пользователь, а не веб-сервер пользователь.
Поэтому вы должны выполнить команды setfacl
, связанные с выше, во второй раз, заменив ${HTTPDUSER}
своим именем пользователя. Если вы не уверены, какое у вас имя пользователя, введите whoami
, чтобы найти его.
Я столкнулся с очень похожей проблемой с 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"
И это помогает, моя проблема была решена. Возможно, кому-то это будет полезно. Наслаждайтесь!
Использование chmod-R 777/var/www/cakephp/app/tmp/, т. е. выполнение папки, решит эту проблему. Я даже столкнулся с подобной проблемой при тестировании cron, т. Е. оболочки, которая существует в приложении/Консоли/команде/папке. Когда мы выполняем cron несколько раз, разрешение tmp/folder перезаписывается, и на этом этапе появится ошибка разрешения, которой можно избежать, сделав tmp/folder исполняемым рекурсивно.
В качестве временного исправления, если вы хотите использовать предоставленный файл .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}"