web-dev-qa-db-fra.com

SplFileInfo :: openFile (/ app/tmp/cache/persistent/cake_core_cake_console _): échec de l'ouverture du flux: autorisation refusée dans /lib/.../FileEngine.php, ligne 293

Je travaille sur un projet CakePHP 2. Il a initialement démarré dans la version 2.0.x, puis a récemment migré vers la version 2.1.0. Tout au long du processus de développement, j'ai reçu le message d'erreur ci-dessous.

Il apparaît de façon imprévisible en haut de la page. Cela peut se produire lorsque je ne regarde que différentes pages, ou même après avoir ajouté un enregistrement à la base de données (l'enregistrement est néanmoins enregistré correctement).

Warning:
SplFileInfo::openFile(/var/www/cake_prj/app/tmp/cache/persistent/cake_core_cake_console_): 
failed to open stream: 
Permission denied in 
     /var/www/cake_prj/lib/Cake/Cache/Engine/FileEngine.php on line 293

J'ai récursivement défini le propriétaire et le groupe du dossier tmp sur Apache et j'ai quand même reçu le message. En outre, je définis ensuite de manière récursive les autorisations pour lire, écrire et exécuter pour tous (chmod 777). Le message d'erreur apparaît toujours.

Même après avoir modifié le propriétaire, le groupe et les autorisations, le fichier en question:

cake_prj/app/tmp/cache/persistent/cake_core_cake_console_

son propriétaire et son groupe seront redéfinis sur root et leurs autorisations par défaut.

Qu'est-ce qui pourrait causer ce problème? Existe-t-il un moyen de s'assurer que chaque fois que ce fichier est généré, il aura toujours Apache: apache avec des autorisations de lecture/écriture/exécution?

20
penguin egg

Il y avait un rapport de bogue à cet endroit http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 mais il a été considéré comme n'étant pas un bogue.

Ce que j'ai personnellement remarqué, c'est que certains propriétaires de fichiers peuvent être modifiés lorsque vous utilisez le script cake dans la console (par exemple, pour créer un bake). Les fichiers modifiés appartiennent alors à l'utilisateur que vous utilisez dans la console. 

Cela signifie-t-il que vous appelez cake tout en étant root? Ou avez-vous un travail root cron qui appelle un script Cake Shell?

Personnellement, j’ai maintenant l’habitude de remettre chmod tout le contenu du dossier tmp à l’utilisateur Apache après avoir utilisé le script cake et cela semble empêcher l’avertissement de s’afficher.

15
nIcO

Vous pouvez résoudre ce problème en ajoutant un masque à votre configuration dans core.php

Cache::config('default', array(
    'engine' => 'File',
    'mask' => 0666,
));
24
rtconner

Au lieu de définir un accès en lecture/écriture à tout le monde sur le répertoire tmp/cache, je l’ai fait:

chgrp -R www-data app/tmp
chmod -R g+rw app/tmp 
find app/tmp -type d -exec chmod g+s {} \;

Définir le groupe de répertoires sur l'utilisateur Apache, puis le bit setgid vous permettra de vous assurer que les fichiers créés dans ce répertoire obtiennent les autorisations de groupe appropriées, quel que soit l'utilisateur exécutant le script Shell. Cela vous permet également d'exclure les autorisations de lecture/écriture sur les "autres" utilisateurs.

7
Code Commander

Je pense que la raison du problème est déjà expliquée, car le cron fonctionne sous l'utilisateur root et les fichiers créés dans tmp ne sont pas accessibles par l'internaute. Les autres solutions ne fonctionnaient pas pour moi et je ne voulais pas définir d'autorisations tmp sur 777. J'ai fini par configurer un travail cron pour l'utilisateur Web. Dans Debian en particulier, ce serait 

crontab -u www-data -e

Tiré de cette réponse Comment spécifier dans crontab par quel utilisateur exécuter le script?

2
dav

Si vous rencontrez l'erreur SplFileInfo dans CakePHP2 et que vous êtes absolument certain que vos autorisations de fichiers/répertoires sont configurées correctement, vous devez également vérifier votre version PHP. Cake2 nécessite PHP 5.2.8 ou supérieur et bien que vous soyez généralement alerté sur la page par défaut si vous utilisez la mauvaise version, vous ne le serez pas si vous aviez développé votre application sur un serveur et ensuite déplacé à un autre.

J'ai rencontré cette erreur après avoir développé une application Cake2 sur un serveur PHP 5.3 et l'avoir déplacée sur un serveur PHP 5.1. Le passage à la version 5.2.17 (supérieure à 5.2.8) a résolu le problème.

0
Joseph

Utilisez ceci ..

cd cakephp/app/tmp/cache/persistent 

Sudo chmod 666 myapp*

cd ..

cd models

Sudo chmod 666 myapp*
0
Ashish

Vous devez rendre le répertoire app/tmp accessible en écriture au serveur Web. Découvrez sous quel utilisateur votre serveur Web est exécuté (dans mon cas _www) et remplacez le propriétaire du répertoire app/tmp par cet utilisateur: $ chown -R _www app/tmp

0
andres_v

Une autre solution. Un conflit d'autorisations s'est produit car plusieurs utilisateurs partagent les mêmes fichiers. Ainsi, si nous divisons le répertoire de cache en plusieurs sous-répertoires, il n’ya pas de conflit ni de permission par défaut de changer de répertoire et de fichier requis.

Comme suit, chaque répertoire de cache est défini par le type de gestionnaire d’API php:

define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS);
  • Lorsque vous naviguez sur le site Web, l'utilisateur actif est Apache. Et le sous-répertoire Est cache/Apache2handler .
  • Lorsqu’un lot est exécuté, l’utilisateur actif est l’utilisateur racine ou un utilisateur connecté. Et le sous-répertoire est cache/cli .

De l’autre côté, le compte utilisateur actuel peut être utilisé pour nommer un sous-répertoire. Vérifiez à Comment vérifier quel utilisateur php est exécuté?

0
Nguyen Van Vinh