web-dev-qa-db-fra.com

file_put_contents (meta/services.json): impossible d'ouvrir le flux: autorisation refusée

Je suis nouveau à Laravel. J'essayais d'ouvrir http://localhost/test/public/ et je me suis 

Erreur dans le gestionnaire d'exceptions. 

J'ai cherché sur Google et changé l'autorisation du répertoire de stockage en utilisant chmod -R 777 app/storage mais en vain.

J'ai changé debug=>true dans app.php et visité la page et j'ai obtenu une erreur dans le gestionnaire d'exceptions: 

Le flux ou le fichier "/var/www/html/test/app/storage/logs/laravel.log" Impossible d'ouvrir: échec de l'ouverture du flux: autorisation refusée dans /var/www/html/test/bootstrap/compiled.php:8423

Ensuite, j'ai modifié les autorisations du répertoire de stockage à l'aide de la commande chmod -R 644 app/storage. L'erreur «Erreur dans le gestionnaire d'exceptions» a disparu et une page est chargée. Mais là je reçois ceci: 

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): impossible d'ouvrir le flux: autorisation refusée

150
vishnub1626

Suggestion de vsmoraes a travaillé pour moi:

Laravel> = 5.4

php artisan cache:clear 
chmod -R 777 storage/
composer dump-autoload

Laravel <5.4

php artisan cache:clear 
chmod -R 777 app/storage 
composer dump-autoload

REMARQUE: NE LE FAITES PAS SUR UN SERVEUR DISTANT (PRODUCTION DEV OR)

Lorsque j'ai posé cette question, il s'agissait d'un problème sur mon hôte local, qui s'exécutait sur une machine virtuelle. Je pensais donc que l'installation d'un 777 était suffisamment sûre, mais les gens ont raison de dire qu'ils devraient rechercher une solution différente. Essayez d'abord le 775

302
ecairol

Pour les googleurs qui ont été confrontés à ce problème avec Laravel 5. 

Il s'agit d'un problème d'autorisation provoqué par différents utilisateurs essayant d'écrire dans le même fichier journal dans le dossier storage/logs avec des autorisations différentes.

Ce qui se passe, c’est que votre configuration laravel est probablement configurée pour enregistrer les erreurs tous les jours. Par conséquent, votre serveur Web (Apache/nginx) peut créer ce fichier sous un utilisateur par défaut, selon votre environnement. Il peut s’agir de quelque chose comme _www sous OSX ou www-data sur * les systèmes NIX, le problème survient lorsque vous avez peut-être exécuté certaines commandes et obtenu des erreurs. L’artisan écrira donc ce fichier, mais avec un utilisateur différent, car PHP sur le terminal est exécuté par un autre utilisateur. en fait votre utilisateur de connexion, vous pouvez le vérifier en lançant cette commande: 

php -i | grep USER

Si votre utilisateur de connexion a créé ce fichier journal sur votre serveur Web, vous ne pourrez pas y écrire d'erreurs, et inversement, car laravel écrit les fichiers journaux avec les autorisations 655 par défaut, ce qui permet uniquement au propriétaire de l'écrire.

Pour corriger ce problème temporaire, vous devez attribuer manuellement les autorisations pour le groupe 664 à ce fichier afin que votre utilisateur de connexion et votre serveur Web puissent écrire dans ce fichier journal.

Pour éviter ce problème de façon permanente, vous souhaiterez peut-être configurer des autorisations appropriées lors de la création d'un nouveau fichier dans le répertoire storage/logs en héritant des autorisations du répertoire dans lequel cette réponse https://unix.stackexchange.com/a/ 115632 peut vous aider à résoudre ce problème.

64
Adriano Rosa

Pour tous ceux qui utilisent Laravel 5, Homestead et Mac, essayez ceci:

mkdir storage/framework/views
41
Hans P

Vous ne devriez pas donner 777 permissions. C'est un risque pour la sécurité . Pour les utilisateurs Ubuntu, dans Laravel 5, je propose de changer de propriétaire de manière récursive pour le stockage de répertoire

Essayez ce qui suit:

Sudo chown -R www-data:www-data storage

Dans les systèmes basés sur Ubuntu, www-data est un utilisateur Apache.

36
RibeiroSt

quelques fois, SELINUX a causé ce problème; vous pouvez désactiver selinux avec cette commande.

Sudo setenforce 0
29
mahrad

Problème résolu 

php artisan cache:clear
Sudo chmod -R 777 vendor storage

cela active l'autorisation d'écriture sur l'application, la structure et les journaux

18
user3470929

Pour les utilisateurs de vagabonds, la solution est la suivante:

(dans le vagabond) cache artisan php: effacer 

(à l'extérieur du vagabond) chmod -R 777 app/storage 

(in vagrant) composer dump-autoload

Assurez-vous que vous chmod dans votre environnement local et non pas dans vagabond est important ici!

15
Brendan

NE JAMAIS DONNER LA PERMISSION 777!

allez dans le répertoire du projet laravel sur votre terminal et écrivez:

Sudo chown -R your-user:www-data /path/to/your/laravel/project/
Sudo find /same/path/ -type f -exec chmod 664 {} \;
Sudo find /same/path/ -type d -exec chmod 775 {} \;
Sudo chgrp -R www-data storage bootstrap/cache
Sudo chmod -R ug+rwx storage bootstrap/cache

De cette façon, vous faites de votre utilisateur le propriétaire et lui donnez des privilèges:
1 Execute, 2 Write, 4 Read
1 + 2 + 4 = 7 signifie (rwx)
2 + 4 = 6 signifie (rw)
Enfin, pour l'accès au stockage, ug + rwx signifie que vous donnez à l'utilisateur et au groupe une

11
Ibrahim W.

Réessayez avec chmod -R 755 /var/www/html/test/app/storage. Utilisez avec Sudo pour Operation not permitted dans chmod. Utilisez Vérifier l'autorisation du propriétaire si l'erreur persiste.

10
Khay

Conformément à Laravel 5.4 qui est le dernier en date, j’écris ceci. Si vous rencontrez un problème de ce type, vous devez modifier l’autorisation. N'ECOUTEZ personne qui vous ait demandé de définir 777 pour un répertoire. Il y a un problème de sécurité. Modifier l'autorisation du dossier de stockage comme ceci

Sudo chmod -R 775 storage

Changer l'autorisation du dossier d'amorçage comme ceci

Sudo chmod -R 775 bootstrap/cache

Maintenant, assurez-vous d’exécuter les deux commandes à partir de votre répertoire d’application. Vous ne rencontrerez plus de problèmes de permission à l'avenir. Le 775 ne compromet aucune sécurité de votre machine. 

8
Koushik Das

Suggérez la permission correcte, si pour Apache,

Sudo chown -R Apache:apache apppath/app/storage
6
Sean

Si vous avez Laravel 5 et si vous cherchez une solution permanente, utilisez à la fois la ligne de commande php artisan et le serveur Apache comme suit:

Sudo chmod -R 777 vendor storage
echo "umask 000" | Sudo tee -a /etc/resolv.conf
Sudo service Apache2 restart

Voir explication détaillée ici .

6
ademin

POUR TOUTE PERSONNE QUI FONCTIONNE AVEC UN SE SOUS SELINUX: Voici comment autoriser httpd à écrire dans le dossier de stockage laravel:

Sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'

Ensuite, pour appliquer les modifications immédiatement:

Sudo restorecon -F -r '/path/to/www/storage'

SELinux peut être pénible à gérer, mais si elle est présente, je vous conseille vivement de l’apprendre plutôt que de la contourner entièrement. 

6
Heather Gaye

Xampp pour utilisation:

cd /Applications/XAMPP/htdocs  
chmod -R 775 test/app/storage
3
cristianojeda
rm storage/logs/laravel.log  

résolu ceci pour moi 

2
aad1992

Si vous utilisez laradock, essayez chown -R laradock:www-data ./storage dans votre conteneur d'espace de travail.

2
Rob L

Chaque fois que je change d'app.php, je reçois une permission refusée d'écrire sur bootstrap/cache/services.json. J'ai donc corrigé cela:

chmod -R 777 bootstrap/cache/
2
malhal

Dans mon cas, la solution consistait à modifier les autorisations en répertoires app/storage/framework/views et app/storage/logs.

1
Den

J'ai eu les mêmes erreurs dans mon projet ...
Mais j'ai découvert que j'avais oublié de mettre enctype dans mon formulaire.

<form method="#" action="#" enctype="multipart/form-data">

J'espère que ça aide quelque part quelque part ...

0
Vpa

Si quelqu'un d'autre rencontre un problème similaire avec une erreur d'autorisations de fichier fopen, mais qu'il est sage de ne pas aveuglément chmod 777, voici ma suggestion.

Vérifiez la commande que vous utilisez pour les autorisations nécessaires à Apache:

fopen('filepath/filename.pdf', 'r');

Le 'r' signifie ouvert en lecture seule, et si vous ne modifiez pas le fichier, vous devez le définir comme. Cela signifie qu'Apache/www-data nécessite au moins une autorisation de lecture sur ce fichier. Si le fichier est créé via laravel, il sera déjà doté d'une autorisation de lecture.

Si pour une raison quelconque vous devez écrire dans le fichier:

fopen('filepath/filename.pdf', 'r+');

Assurez-vous ensuite qu'Apache dispose également des autorisations nécessaires pour écrire dans le fichier.

http://php.net/manual/en/function.fopen.php

0
Kyle Burkett

J'avais un problème similaire. (Autorisation refusée alors que les autorisations étaient correctement configurées) avec Laravel 5.2 et 5.5

Le problème était que SELinux était activé, ce qui empêchait Apache d'écrire des fichiers, même avec le mode 777. Voir Résoudre la réponse 500 Laravel (Uncaught UnexpectedValueException: Laravel.log) pour la question et la réponse.

Peut-être que cela résout le problème pour vous également. 

0
RoDo

Alors que je travaillais sur Windows 10 avec Laragon et Laravel 4, il me semblait impossible de modifier les autorisations manuellement, car l’exécution des commandes chmod- dans le terminal Laragon n’avait aucun effet.

Cependant, il était possible dans ce terminal d’aller dans le dossier de stockage et d’ajouter manuellement les dossiers désirés comme ceci:

cd app/storage
mkdir cache
mkdir meta
mkdir views
mkdir sessions

La commande cd- du terminal vous amène au dossier (vous devrez peut-être ajuster ce chemin en fonction de la structure de votre fichier). La commande mkdir- créera le répertoire avec le nom donné.

Je n'ai pas eu l'occasion de tester cette approche dans Laravel 5, mais je m'attends à ce qu'une approche similaire fonctionne.

Bien sûr, il pourrait y avoir une meilleure solution, mais au moins, cette solution était raisonnable pour mon cas (correction de l'erreur: file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream).

0
Virginia

Il suffit de démarrer votre serveur en utilisant artisian

php artisian serve

Accédez ensuite à votre projet à partir de l'URL spécifiée:

 enter image description here

0
wajih

Après beaucoup d'essais et d'erreurs avec les permissions de répertoire, je me suis retrouvé avec une épiphanie ... il ne restait plus d'espace sur la partition du disque. Je voulais juste partager pour nous assurer que personne d’autre n’est assez stupide pour continuer à chercher la solution dans le mauvais sens.

Sous Linux, vous pouvez utiliser df -h pour vérifier la taille de votre disque et votre espace libre.

0
Frank

Fixer l’autorisation à 777 est une très mauvaise idée!

... mais

Si vous obtenez une erreur d'autorisation liée au dossier "stockage" c'est ce qui a fonctionné pour moi:

1) Définissez "stockage" et ses sous-dossiers avec la permission de 777 avec 

Sudo chmod -R 777 storage/

2) Dans le navigateur, allez à la page d'accueil de laravel laravel/public/(laravel créera les fichiers de stockage initiaux nécessaires)

3) Renvoyer l'autorisation 775 sécurisée au stockage et à ses sous-dossiers

Sudo chmod -R 775 storage/
0
Nika Tsogiaidze

Ce problème est en fait causé par différents utilisateurs qui veulent write/read fichier mais qui ont été refusés parce qu'ils sont propriétaires différents. Peut-être que vous en tant que "root" avez installé Laravel avant de vous connecter à votre site en tant qu'utilisateur "laravel", où "laravel" est le propriétaire par défaut. Ainsi, lorsque l'utilisateur 'laravel' souhaite lire/écrire tous les fichiers du disque par défaut, ce fichier est la propriété de 'root'.

Pour résoudre ce problème, vous pouvez suivre comme suit:

Sudo chown -hR your-user-name /root /nameforlder

ou dans mon cas

Sudo chown -hR igmcoid /root /sublaravel

Note de bas de page:

  1. root comme nom premier propriétaire qui a installé avant
  2. your-user-name en tant que propriétaire par défaut qui écrit/lit dans le site.
  3. namefolder comme nom de dossier pour lequel vous souhaitez modifier la propriété.
0
Bliss Jaspis

J'ai le même problème lorsque je cours vagabond sur mac. a résolu le problème en modifiant l'utilisateur du serveur Apache dans le fichier https.conf:

# check user for php
[vagrant] ubuntu ~ $ php -i | grep USER
USER => ubuntu
$_SERVER['USER'] => ubuntu
[vagrant] ubuntu ~ $ 

Exécutez Apache sous l'utilisateur php au lieu du démon utilisateur pour résoudre le problème d'accès aux fichiers avec php

# change default Apache user from daemon to php user
Sudo sed -i 's/User daemon/User ubuntu/g' /opt/lampp/etc/httpd.conf
Sudo sed -i 's/Group daemon/Group ubuntu/g' /opt/lampp/etc/httpd.conf

maintenant, le fichier de cache créé par PHP peut être lu et édité par Apache sans afficher d'erreur d'erreur d'autorisation d'accès.

0
nigam214