Перед ошибкой разрешения файла при запуске 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
Включить mod-rewrite
5. sudo a2enmod rewrite
Откройте файл /etc/apache 2/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 on line 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
Ответы
Ответ 1
Команда 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
.
Ответ 2
У меня возникли аналогичные проблемы. Вот несколько вещей, которые помогли мне:
Если вы не хотите использовать подход "кувалда" chmod 777
(вы можете избегать его при производстве, для экземпляр), инструкции по установке CakePHP содержат информацию о том, как использовать ACL:
Обратите внимание, что вам, вероятно, потребуется использовать sudo
для команд setfacl
, указанных там.
Однако, по моему опыту (CakePHP 2), этих команд недостаточно. Эти команды дают пользователю вашего веб-сервера доступ к кешу и т.д., Но все, что вы запускаете из командной строки (например, команда cake
), вероятно, будет работать как ваш пользователь, а не пользователь веб-сервера.
Следовательно, вы должны запустить команды 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
Как временное исправление, если вы хотите использовать предоставленный файл .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}"