file_put_contents (meta / services.json): échec de l'ouverture du flux: autorisation refusée

169

Je suis nouveau à Laravel. J'essayais d'ouvrir http://localhost/test/public/et j'ai obtenu

Erreur dans le gestionnaire d'exceptions.

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

J'ai changé debug=>truedans app.phpet visité la page et a reçu l' erreur dans le gestionnaire d'exception:

Le flux ou le fichier "/var/www/html/test/app/storage/logs/laravel.log" n'a pas pu être ouvert: échec de l'ouverture du flux: autorisation refusée dans / var / www / html / test / bootstrap / compiled. php: 8423

Ensuite, j'ai changé les autorisations du répertoire de stockage à l'aide de la commande chmod -R 644 app/storageet l'erreur `` Erreur dans le gestionnaire d'exceptions '' a disparu et une page est chargée. Mais là-dedans, j'obtiens ceci:

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): échec de l'ouverture du flux: autorisation refusée

vishnub1626
la source
2
ressemble à nouveau à un problème de permition, chmod récursivement tous les répertoires d'application
alou
@alou Je pense que j'ai déjà fait ça avec l'application / stockage chmod -R 777. N'est-ce pas? Et tous les répertoires à l'intérieur de l'application ont l'autorisation drwxrwxrwx.
vishnub1626
33
Essayez: php artisan cache:clearpuis chmod -R 777 app/storageenfinphp artisan dump-autoload
vsmoraes
@vsmoraes Cela a fonctionné. Ce sera vraiment utile si vous pouvez expliquer quel était le problème.
vishnub1626
7
Le commentaire de vsmoraes était correct, mais au lieu de 'php artisan dump-autoload', il devrait être 'composer dump-autoload'
Elliot Robert

Réponses:

320

La suggestion de vsmoraes a fonctionné 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 FAITES PAS CELA SUR UN SERVEUR À DISTANCE (DEV OU PRODUCTION)

Quand j'ai posé cette question, c'était un problème sur mon hôte local, fonctionnant dans une machine virtuelle. J'ai donc pensé que la configuration d'un 777 était suffisamment sûre, mais les gens ont raison quand ils disent que vous devriez chercher une solution différente. Essayez d'abord 775

écairol
la source
8
Cela devrait être sudo chmod -R 777 app / storage. pour éviter les erreurs d'autorisation.
Olaitan Mayowa
5
Pour # Laravel5, les instructions sont presque identiques:, php artisan cache:clearpuis chmod -R 777 storage, et puis composer dump-autoload
WNRosenberg
6
Si vous utilisez Laravel 5.1+, vous devrez le faire à la chmod -R 777 storageplace
James
10
php artisan cache:clearest la bonne réponse. Puis sudo chmod -R ug+rw storagedonne les permissions correctes pour moi, sans donner deothers
Zack Morris
43
Cette réponse et ce fil sont ce qui met en évidence pourquoi je n'aime pas tant Laravel: cela apprend aux développeurs que vous pouvez faire tout ce que vous voulez, quand vous le voulez, aussi vite que vous le souhaitez, sans penser aux conséquences (je comprends que ce 777n'est pas spécifique à Laravel, mais le processus de réflexion pour les développeurs Laravel est: "faites que ça marche MAINTENANT, je m'en fiche de savoir comment", juste comme 777). En règle générale, ne définissez jamais, jamais quoi que ce soit 777pour que quelque chose fonctionne. COMPRENEZ votre serveur et vos utilisateurs / rôles et définissez-les en conséquence; ne le piratez pas. Vos clients vous font confiance pour bien faire cela.
dKen
70

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

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

Ce qui se passe, c'est que votre configuration laravel est probablement configurée pour consigner les erreurs quotidiennement et que votre serveur Web (apache / nginx) peut donc créer ce fichier sous un utilisateur par défaut en fonction de votre environnement, cela peut être quelque chose comme _wwwsur OSX ou www-datasur les systèmes * NIX, puis le problème vient quand vous avez peut-être exécuté des commandes artisanales et obtenu des erreurs, donc l'artisan écrira ce fichier mais avec un utilisateur différent car PHP sur le terminal est exécuté par un utilisateur différent en fait votre utilisateur de connexion, vous pouvez le vérifier en exécutant 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 vice-versa car laravel écrit des fichiers journaux avec des 655autorisations par défaut qui permettent uniquement au propriétaire d'y écrire.

Pour corriger ce problème temporaire, vous devez attribuer manuellement des autorisations au groupe 664sur ce fichier afin que votre utilisateur de connexion et l'utilisateur du serveur Web puissent écrire dans ce fichier journal.

Pour éviter ce problème de manière permanente, vous souhaiterez peut-être configurer des autorisations appropriées lorsqu'un nouveau fichier est créé dans storage/logsle répertoire en héritant des autorisations du répertoire. Cette réponse https://unix.stackexchange.com/a/115632 peut vous aider à résoudre le problème. cette.

Adriano Rosa
la source
réponse fan-friggen-tastic ici! je cours sur Elastic Beanstalk et mon utilisateur PHP en ligne de commande est "ec2-user" mais mon application fonctionne en tant que "webapp".
Randy L
1
Une réponse qui explique le problème. c'est à dire une bonne réponse.
Craicerjack
Cela m'a aidé à comprendre pourquoi j'obtenais une erreur de cache de fichiers dans Laravel sur Cloudways. J'avais besoin d'appuyer sur le bouton dans le panneau Cloudways pour réinitialiser les autorisations de fichier. Merci.
Ryan
44

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

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.

RibeiroSt
la source
2
Cela a résolu pour moi, et est plus correct (je pense) que les chmod 777réponses. Merci ~
GavinR
Je pense que c'est la réponse la plus pratique pour les utilisateurs de Linux. Merci @GavinR. chmod 777est un cauchemar complet.
Abdalla Arbab
Cela a fonctionné pour moi et est certainement une meilleure option que chmod
-777
Merci pour une nouvelle façon de résoudre le problème! Avons-nous besoin de faire quelque chose avant / après votre commande pour inverser les chmod 777conséquences?
Aleksandar
41

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

mkdir storage/framework/views
Hans P
la source
Cela fonctionne également avec la création d'un nouveau serveur avec Laravel Forge avec Laravel 5.2.7
winkster
2
Cela l'a fait pour moi. Il semble que bootstrap/cache/compiled.phpj'essayais d'écrire dans ce répertoire, mais il n'existait pas et a fini par générer une erreur d'autorisations. Je vous remercie.
Matt K
1
D'une manière ou d'une autre, cela a fonctionné pour moi. J'utilise laravel 5.1 btw
Yohanes Gultom
Cela l'a fait pour moi, merci. J'avais supprimé tout mon répertoire de stockage en pensant que cela serait à nouveau généré par laravel, je suppose que non.
grimmdude
33

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

sudo setenforce 0
Mahrad
la source
wow, j'ai vraiment fait le truc et ça marche, quelqu'un peut-il m'expliquer pourquoi ça a marché? qu'est-ce que selinux?
undefinedman
oui cela a vraiment fonctionné! Aidez-nous gourou à comprendre cela sur SELINUX? im using fedora 24 btw
loki9
1
Merci, merci beaucoup. Je recherche sur le net, et tout le monde me dit de vérifier l'autorisation, de vérifier l'utilisateur et ainsi de suite ...
Ali ZahediGol
3
C'est fondamentalement comme éteindre tout le pare-feu parce qu'il bloquait un port dont vous aviez besoin.
Teh JoE
Je n'avais jamais entendu parler de cela. "Security-Enhanced Linux (SELinux) est un module de sécurité du noyau Linux qui fournit un mécanisme pour prendre en charge les politiques de sécurité de contrôle d'accès." Je doute que ce soit une bonne idée de le désactiver. Et je parie que les votants utilisent aveuglément cette commande sans en comprendre toutes les conséquences.
Ryan
18

Problème résolu

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

cela active l'autorisation d'écriture sur l'application, le framework, les journaux J'espère que cela aidera

utilisateur3470929
la source
12
jamais 777 ... en dev ou prod car cela donnera l'illusion de choses qui fonctionnent en dev mais ils casseront en prod à moins que 777 aussi, ce qui n'est jamais une bonne idée
Kyle Burkett
wooha you rock ... le vendeur était celui qui me manquait
lu1s
ouais, donner quoi que ce soit sur un web public 777 est une mauvaise idée
imabug
17

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 rendez votre utilisateur propriétaire et donnez des privilèges:
1 Exécuter, 2 Ecrire, 4 Lire
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 un 7

Ibrahim W.
la source
1
Je ne sais pas pourquoi beaucoup de développeurs aiment utiliser 777 ... d'une manière ou d'une autre, ils ne se soucient pas de leur système ..
ZeroOne
15

Pour les utilisateurs vagabonds, la solution est:

(in vagrant) php artisan cache: clear

(hors vagabond) chmod -R 777 app / stockage

(in vagrant) compositeur dump-autoload

Assurez-vous de vous installer dans votre environnement local et non dans un vagabond est important ici!

Brendan
la source
6
777 n'est-il pas trop ouvert?
simo
3
Je veux dire, pour la production, bien sûr. Mais c'est un environnement de développement local. 777 était ce que l'affiche originale utilisait, et d'autres réponses, 775 ou 755 peuvent fonctionner selon.
Brendan
12

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

Khay
la source
Ca ne fonctionne pas. Tous les répertoires à l'intérieur de l'application ont la permission drwxrwxrwx
vishnub1626
@tav pouvez-vous s'il vous plaît vérifier votre autorisation de propriétaire pour votre dossier de test?
Khay
Même drwxrwxrwx. Résolution du problème en utilisant les suggestions de @ vsmoraes (voir les commentaires)
vishnub1626
4
chmod 777 est un risque pour la sécurité
Yogesh Kamat
9

Selon Laravel 5.4, qui est le dernier au moment où j'écris ceci, si vous rencontrez un problème comme celui-ci, vous devez changer l'autorisation. N'ÉCOUTEZ PERSONNE QUI VOUS INDIQUE DE RÉGLER 777 POUR TOUT RÉPERTOIRE. Il a un problème de sécurité. Modifiez l'autorisation du dossier de stockage comme ceci

sudo chmod -R 775 storage

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

sudo chmod -R 775 bootstrap/cache

Assurez-vous maintenant que vous exécutez les deux commandes à partir du répertoire de votre application. Vous ne rencontrerez pas de problèmes à l'avenir concernant l'autorisation. 775 ne compromet aucune sécurité de votre machine.

Koushik Das
la source
7

Suggérer l'autorisation correcte, si pour Apache,

sudo chown -R apache:apache apppath/app/storage
Sean
la source
Laravel Forge utilise: sudo chown -R forge: forge ~ / project / storage / sudo chown -R forge: forge ~ / project / bootstrap / cache /
Flappy
6

Si vous avez Laravel 5 et recherchez une solution permanente, php artisanutilisez à la fois l' utilisation de la ligne de commande et le serveur Apache:

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

Voir l'explication détaillée ici .

alexeydemin
la source
8
cela semble être une mauvaise idée d'utiliser 777
Randy L
umask 000 dans resolv.conf?! où ces personnes obtiennent-elles ces informations? c'est une ligne non valide dans resolv.conf. Veuillez ignorer ceci et toutes les 777 «solutions» là
higuita
vérifiez l'url et ne trouvez aucune option umask dans resolv.conf linux.die.net/man/5/resolv.conf
higuita
6

POUR TOUTE PERSONNE EXÉCUTER UN OS AVEC SELINUX: La manière correcte d'autoriser httpd à écrire dans le dossier de stockage laravel est:

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 difficile à gérer, mais s'il est présent, je vous conseille vivement de l'apprendre plutôt que de le contourner complètement.

Heather Gaye
la source
mon problème exact dans les centos frais 7 était similaire. il ne disait aucune permission d'écrire mais tous étaient 777 à tester. Donc, cet article m'a fait gagner du temps après toute vérification générale.
HumaN
1
C'est la bonne solution, même si je pense que le type SELinux correct devrait être httpd_sys_rw_content_t sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug
4

J'ai eu le même problème et les étapes ci-dessous m'ont aidé à résoudre le problème.

  1. Découvrez l'utilisateur Apache - a créé un fichier test.php dans le dossier public avec le code

<?php echo exec('whoami'); ?>

Et exécutez le fichier à partir du navigateur Web. Cela donnerait à l'utilisateur Apache. Dans mon cas, c'est ec2-user car j'utilisais le aws avec cronjob installé dans /etc/cron.d/. Cela pourrait être un utilisateur différent pour les autres.

  1. Exécutez la commande ci-dessous sur la ligne de commande.

sudo chown -R ec2-user:<usergroup> /app-path/public

Vous devez identifier et utiliser ici le bon "utilisateur" et le "groupe d'utilisateurs".

KiranD
la source
4

Si vous utilisez Linux ou Mac, vous pouvez même exécuter ssh terminal. Vous pouvez utiliser le terminal pour exécuter cette commande,

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

Si vous utilisez Windows, vous pouvez exécuter en utilisant git bash.

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

Vous pouvez télécharger le formulaire git https://git-scm.com/downloads .

Rasheduzzaman
la source
3

Xampp à utiliser:

cd /Applications/XAMPP/htdocs  
chmod -R 775 test/app/storage
Cristianojeda
la source
1
pouvez-vous diviser cela un peu plus?
Aaron Hall
J'utilise cet article et j'étais: Configuration de Laravel 4.x sur Mac OSX 10.8+ avec XAMPP
cristianojeda
3
chmod 777 est un risque pour la sécurité
Yogesh Kamat
1
Vous pouvez également utiliser ce chmod 775
cristianojeda
2

Chaque fois que je change app.php, je reçois une autorisation refusée d'écrire bootstrap / cache / services.json, alors j'ai fait ceci pour le réparer:

chmod -R 777 bootstrap/cache/
malhal
la source
8
chmod 777 est un risque pour la sécurité
Yogesh Kamat
2
rm storage/logs/laravel.log  

résolu ça pour moi

aad1992
la source
2

Définir l'autorisation sur 777 est définitivement une idée terrible!

... mais

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

1) Définissez l'autorisation «stockage» et ses sous-dossiers sur 777 avec

sudo chmod -R 777 storage/

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

3) Renvoyez l'autorisation du coffre-fort 775 au stockage et à ses sous-dossiers

sudo chmod -R 775 storage/
Nika Tsogiaidze
la source
2

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

Rob L
la source
1

Dans mon cas, la solution consistait à modifier les autorisations app/storage/framework/viewset les app/storage/logsrépertoires.

Tanière
la source
0

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

Vérifiez la commande que vous utilisez pour les autorisations dont Apache a besoin:

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

Le «r» signifie ouvert en lecture seule, et si vous n'éditez pas le fichier, c'est comme cela que vous devriez le définir. Cela signifie qu'apache / www-data a besoin d'au moins une autorisation de lecture sur ce fichier, qui si le fichier est créé via laravel, il aura déjà l'autorisation de lecture.

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

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

Ensuite, assurez-vous qu'apache dispose également des autorisations d'écrire dans le fichier.

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

Kyle Burkett
la source
0

Démarrez simplement votre serveur en utilisant artisian

php artisian serve

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

entrez la description de l'image ici

wajih
la source
0

J'ai le même problème lors de l'exécution de vagrant sur mac. a résolu le problème en changeant 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 aucune erreur d'autorisation d'accès.

nigam214
la source
0

Après de nombreux essais et erreurs avec les autorisations de répertoire, je me suis retrouvé avec une révélation ... il n'y avait plus d'espace sur la partition du disque. Je voulais juste partager pour s'assurer que personne d'autre n'est assez stupide pour continuer à chercher la solution dans la mauvaise direction.

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

Franc
la source
0

Ce problème est en fait causé par différents utilisateurs qui souhaitent write/read déposer un fichier mais qui le refusent entraînent une propriété différente. peut-être que vous avez installé laravel en tant que 'root' avant de vous connecter à votre site en tant qu'utilisateur 'laravel' où 'laravel' est la propriété par défaut, c'est donc le vrai problème ici. Ainsi, lorsque l'utilisateur 'laravel' veut lire / écrire tous les fichiers du disque par défaut, pour être refusé, car ce fichier a la propriété de 'root'.

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

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 du premier propriétaire qui a installé avant
  2. your-user-name comme propriété par défaut qui écrit / lit réellement sur le site.
  3. namefolder en tant que dossier de noms que vous souhaitez modifier la propriété.
Bliss Jaspis
la source
0

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

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

Espère que cela aide quelque part ...

Vpa
la source
0

En travaillant sur Windows 10 avec Laragon et Laravel 4, il me semblait qu'il n'y avait aucun moyen de modifier les autorisations manuellement, car l'exécution de chmodcommandes dans le terminal intégré 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 souhaités comme ceci:

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

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

Je n'ai pas eu l'occasion de tester cette approche dans Laravel 5, mais j'espère qu'une approche similaire devrait fonctionner.

Bien sûr, il pourrait y avoir un meilleur moyen, mais au moins c'était une solution de contournement raisonnable pour ma situation (corriger l'erreur :) file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream.

Virginie
la source
-1
  1. Tout d'abord, supprimez le dossier de stockage, puis créez à nouveau le dossier de stockage.
  2. Dans le dossier de stockage, créez un nouveau nom de dossier en tant que cadre.
  3. Le dossier du cadre interne crée trois noms de dossiers comme cache, sessions et vues.

J'ai résolu mon problème en faisant cela.

Md Juyel Rana
la source
-4

J'ai essayé de donner l' 777accès au dossier de stockage et cela fonctionne pour moi

1) allez dans votre répertoire racine laravel, ( /var/www/htmlpour moi) et exécutez la commande suivante

chmod 777 -R storage
Yur Gasparyan
la source
2
Ne définissez pas les autorisations sur 777 car cela rend le répertoire visible et modifiable pour tous ceux qui peuvent voir le répertoire. Ce n'est pas recommandé!
CodeNinja