Face à une erreur de permission de fichier lors de L'exécution de CakePHP dans Ubuntu 10.4
j'ai installé le framwork CakePHP 2.0 en utilisant les étapes ci-dessous:
1. Start the terminal
2. sudo mkdir /var/www/cakephp
3.sudo cp -r ~/cakephp/* /var/www/cakephp
Changer de dossier tmp permisssion
4. sudo chmod -R 777 cakephp/app/tmp
Activer le mod rewrite
5. sudo a2enmod rewrite
Ouvrir le fichier /etc/apache2/sites-enabled/000-default et le changement AllowOverride None
à AllowOverride All
6. sudo vim /etc/apache2/sites-enabled/000-default
Redémarrer Apache
7. sudo /etc/init.d/apache2 restart
j'ai ouvert mon navigateur et tapé l'adresse http://localhost/cakephp/ et je seaw ce message d'erreur:
Avertissement: _cake_core_ cache a été incapable d'écrire "cake_dev_en-nous' de cache de Fichiers dans /var/www /cakephp/lib/Cake/Cache / Cache.php sur la ligne 310
Attention: _cake_core_ cache n'a pas pu Ecrivez 'cake_dev_en-us' à File cache in /var/www/cakephp/lib/Cake/Cache/Cache.php sur la ligne 310
Avertissement: /var/www/cakephp/app/tmp/cache/persistante/ n'est pas accessible en écriture dans le répertoire /var/www/cakephp /lib/Cake/Cache/Moteur/FileEngine.php sur la ligne 320
Attention: / var/www/cakephp / app/tmp / cache /modèles/ n'est pas accessible en écriture dans le répertoire /var/www/cakephp/lib/Cake/Cache/Moteur/FileEngine.php sur la ligne 320
Avertissement: /var/www/cakephp/app/tmp/cache/ n'est pas accessible en écriture dans le répertoire /var/www/cakephp/lib/Cake / Cache / Engine / FileEngine.php sur la ligne 320
5 réponses
la commande sudo chmod -R 777 cakephp/app/tmp
fait seulement tmp
accessible en écriture, vous devez rendre le cache et ses sous-répertoires accessibles en écriture aussi bien, sinon Cake ne peut pas écrire les fichiers cache dans le répertoire cache de tmp.
ainsi, ces répertoires devraient être accessibles en écriture:
cakephp/app/tmp/cache
cakephp/app/tmp/cache/persistent
cakephp/app/tmp/cache/models
assurez-vous que le répertoire log est également accessible en écriture: cakephp/app/tmp/logs
.
j'ai fait face à des problèmes similaires. Voici quelques choses qui m'ont aidé:
si vous ne voulez pas utiliser l'approche "sledgehammer" de chmod 777
(vous pouvez vouloir l'éviter sur la production , par exemple), les instructions d'installation de CakePHP fournissent des détails sur la façon d'utiliser ACL à la place:
- pour gâteau 2: http://book.cakephp.org/2.0/en/installation.html#permissions
- pour Cake 3: http://book.cakephp.org/3.0/en/installation.html#permissions
notez que vous aurez probablement besoin d'utiliser sudo
pour les commandes setfacl
qui y sont données.
cependant, d'après mon expérience (CakePHP 2), ces commandes ne sont pas suffisantes. Ces commandes donnent à votre utilisateur webserver accès au cache, etc, mais tout ce que vous exécutez à partir de la ligne de commande (comme la commande cake
) sera probablement lancé comme votre utilisateur plutôt que l'utilisateur du serveur web.
par conséquent, vous devez exécuter les commandes setfacl
liées à ci-dessus une deuxième fois, en remplaçant ${HTTPDUSER}
par votre nom d'utilisateur. Si vous ne savez pas quel est votre nom d'utilisateur, tapez whoami
pour le trouver.
j'ai rencontré un problème très similaire avec 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]
parce que je suis nouveau dans CakePhp, j'ai débugé le fichier avec problème - CORE/src/Cache/Engine/FileEngine.php . Voici Fonction like next:
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;
}
il vérifie si le répertoire cache est accessible en écriture et obtient des données sur la variable $this->_config['path']
. Cette variable est initialisée par défaut à partir .fichier de configuration (si vous l'utilisez), et il a lignes comme la suivante:
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}"
j'ai changé tout File:
en Null:
, comme le suivant:
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"
et ça aide, mon problème a été résolu. Ce sera probablement utile pour quelqu'un. Profitez-en!
en utilisant chmod-R 777 /var/www/cakephp/app/tmp/ c.-à-d. en rendant le dossier exécutable résoudra ce problème. J'ai même fait face à un problème similaire en testant cron c.-à-d. shell qui existe dans app/Console/Command/ folder. Lorsque nous exécutons plusieurs fois un cron, la permission tmp/ folder est écrasée et une erreur de permission apparaît à ce point, ce qui peut être évité en rendant l'exécutable récursive de tmp / folder.
Comme une solution temporaire, si vous voulez utiliser .fichier de configuration et les autorisations n'a pas résolu votre problème, modifier le .fichier de configuration pour utiliser le chemin absolu qui pointe vers votre répertoire app
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}"