file_put_contents (meta / services.json): falha ao abrir o fluxo: permissão negada

169

Eu sou novo no Laravel. Eu estava tentando abrir http://localhost/test/public/e consegui

Erro no manipulador de exceções.

Eu pesquisei e mudei a permissão do diretório de armazenamento usando chmod -R 777 app/storagemas sem sucesso.

Eu mudei debug=>trueem app.phpe visitou a página e obteve o erro no manipulador de exceção:

Não foi possível abrir o fluxo ou o arquivo "/var/www/html/test/app/storage/logs/laravel.log": falha ao abrir o fluxo: permissão negada em / var / www / html / test / bootstrap / compilado. php: 8423

Alterei as permissões do diretório de armazenamento usando o comando chmod -R 644 app/storagee o erro 'Erro no manipulador de exceções' desapareceu e uma página foi carregada. Mas lá estou eu recebendo isso:

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): falha ao abrir o fluxo: permissão negada

vishnub1626
fonte
2
olhares como questão permition novamente, chmod recursivamente todos os diretórios de aplicativos
Alou
@ alou Eu acho que já fiz isso com chmod -R 777 app / storage. Não foi? E todos os diretórios dentro do aplicativo têm permissão drwxrwxrwx.
Vishnub1626
33
Tente: php artisan cache:clearentão chmod -R 777 app/storagefinalmentephp artisan dump-autoload
vsmoraes
@vsmoraes Funcionou. Será realmente útil se você puder explicar qual era o problema.
Vishnub1626
7
O comentário de vsmoraes estava correto no entanto, em vez de 'php artesão despejo-autoload' em deve ser 'compositor despejo-autoload'
Elliot Robert

Respostas:

320

A sugestão de vsmoraes funcionou para mim:

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

NOTA: NÃO O FAÇA EM QUALQUER SERVIDOR REMOTO (DEV OU PRODUÇÃO)

Quando fiz essa pergunta, havia um problema no meu host local, executando em uma máquina virtual. Por isso, pensei que configurar um 777 fosse seguro o suficiente, no entanto, as pessoas estão certas quando dizem que você deve procurar uma solução diferente. Tente 775 primeiro

ecairol
fonte
8
Deve ser sudo chmod -R 777 app / storage. para evitar erro de permissão.
Olaitan Mayowa
5
Para # Laravel5 as instruções são quase idênticos: php artisan cache:cleare, em seguida chmod -R 777 storage, e depois composer dump-autoload
WNRosenberg
6
Se você estiver usando Laravel 5.1+ você precisa fazer chmod -R 777 storageem vez
James
10
php artisan cache:clearé a resposta correta. Em seguida, sudo chmod -R ug+rw storageconcede as permissões corretas para mim, sem conceder othersprivilégios de leitura / gravação ou, principalmente, de execução.
Zack Morris
43
Essa resposta e discussão é o que destaca por que eu não gosto tanto do Laravel: ensina aos desenvolvedores que você pode fazer o que quiser, quando quiser, o mais rápido que quiser, sem pensar nas consequências (entendo que o 777Laravel não é específico, mas o processo de pensamento para os desenvolvedores do Laravel é: "faça funcionar AGORA, eu não me importo como", assim como 777). Como regra geral, nunca, jamais, defina algo 777para que algo funcione. ENTENDA seu servidor e usuários / funções e defina-os de acordo; não faça isso. Seus clientes confiam em você para fazer isso corretamente.
dKen 31/03
70

Para os googlers que enfrentam esse problema com o Laravel 5.

Esse é um problema de permissão causado por diferentes usuários que tentam gravar no mesmo arquivo de log na storage/logspasta com permissões diferentes.

O que acontece é que a sua configuração do laravel provavelmente está configurada para registrar erros diariamente e, portanto, seu servidor da web (apache / nginx) pode criar esse arquivo com um usuário padrão, dependendo do seu ambiente, pode ser algo como _wwwnos www-datasistemas OSX ou * NIX, e então o problema ocorre quando você pode executar alguns comandos do artesão e obter alguns erros, então o artesão gravará esse arquivo, mas com um usuário diferente, porque o PHP no terminal é executado por um usuário diferente, na verdade o seu usuário de login, você pode verificar executando este comando :

php -i | grep USER

Se o seu usuário de login criou esse arquivo de log no seu servidor da Web, você não poderá gravar erros nele e vice-versa, porque o laravel grava arquivos de log com 655permissões por padrão, o que permite apenas que o proprietário escreva nele.

Para corrigir esse problema temporário, você deve conceder manualmente permissões para o grupo 664neste arquivo, para que tanto o usuário de logon como o servidor do servidor da Web possam gravar nesse arquivo de log.

Para evitar esse problema permanentemente, convém configurar as permissões apropriadas quando um novo arquivo for criado no storage/logsdiretório, herdando as permissões do diretório. Esta resposta https://unix.stackexchange.com/a/115632 pode ajudá-lo a lidar com aquele.

Adriano Rosa
fonte
resposta fan-friggen-tastic aqui! Estou executando no Elastic Beanstalk e meu usuário PHP de linha de comando é "ec2-user", mas meu aplicativo é executado como "webapp".
Randy G
1
Uma resposta que explica o problema. ou seja, uma resposta adequada.
precisa saber é o seguinte
Isso me ajudou a entender por que estava recebendo um erro de cache de arquivo no Laravel on Cloudways. Eu precisava pressionar o botão no painel Cloudways para redefinir as permissões de arquivo. Obrigado.
21717 Ryan
44

Você não deve conceder 777 permissões. É um risco de segurança. Para usuários do Ubuntu, no Laravel 5, sugiro alterar o proprietário para armazenamento de diretório recursivamente:

Tente o seguinte:

sudo chown -R www-data:www-data storage

Nos sistemas baseados no Ubuntu, o www-data é um usuário apache.

RibeiroSt
fonte
2
Isso foi corrigido para mim e é mais correto (eu acho) do que as chmod 777respostas. Obrigado ~
GavinR
Eu acho que é a resposta mais conveniente para os usuários do Linux. Obrigado @GavinR. chmod 777é um pesadelo completo.
Abdalla Arbab
Isso funcionou para mim e é definitivamente uma opção melhor do que chmod -777
Egnaro
Obrigado por uma nova maneira de resolver o problema! Precisamos fazer algo antes / depois do Seu comando para reverter as chmod 777consequências?
Aleksandar
41

Para todos que usam o Laravel 5, Homestead e Mac, tente o seguinte:

mkdir storage/framework/views
Hans P
fonte
Isso também funciona com fazer um novo servidor com Laravel Forge com Laravel 5.2.7
winkster
2
Isso fez por mim. Parece que bootstrap/cache/compiled.phpestava tentando gravar neste diretório, mas ele não existia e acabou gerando um erro de permissão. Obrigado.
Matt K
1
De alguma forma, isso funcionou para mim. Estou usando o laravel 5.1 btw
Yohanes Gultom
Isso fez por mim, obrigado. Eu removi meu diretório de armazenamento inteiro pensando que isso seria gerado pelo laravel novamente, acho que não.
grimmdude
33

algumas vezes o SELINUX causou esse problema; você pode desativar o selinux com este comando.

sudo setenforce 0
mahrad
fonte
uau, eu realmente fiz o truque e funciona, alguém pode me explicar por que funcionou? o que é selinux?
undefinedman
sim, isso realmente funcionou! ajude-nos a entender isso no SELINUX? Estou usando o fedora 24 btw
loki9 /
1
Obrigado, muito obrigado. Eu
pesquiso
3
Isso é basicamente como desligar o firewall inteiro porque estava bloqueando uma porta que você precisava abrir.
Teh JoE
Eu nunca tinha ouvido falar disso. "O Security-Enhanced Linux (SELinux) é um módulo de segurança do kernel do Linux que fornece um mecanismo para suportar políticas de segurança de controle de acesso." Duvido que seja uma boa ideia desligá-lo. E aposto que os promotores estão usando cegamente esse comando sem entender todas as consequências.
26917 Ryan
18

Problema resolvido

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

isso permite a permissão de gravação para o aplicativo, estrutura, logs Espero que isso ajude

user3470929
fonte
12
Nunca 777 ... em dev ou prod como ele vai dar a ilusão de coisas que trabalham em dev mas eles vão quebrar em prod menos que 777 assim que nunca é uma boa idéia
Kyle Burkett
wooha você rock ... fornecedor foi o que eu estava faltando
lu1s
sim, dar qualquer coisa em um público voltado para web 777 é uma má idéia
imabug
17

NUNCA DÊ A PERMISSÃO 777!

vá para o diretório do projeto laravel no seu terminal e escreva:

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

Dessa forma, você está tornando seu usuário o proprietário e concedendo privilégios:
1 Execute, 2 Write, 4 Read
1 + 2 + 4 = 7 significa (rwx)
2 + 4 = 6 significa (rw)
finalmente, para o acesso ao armazenamento, ug + rwx significa que você está dando ao usuário e ao grupo 7

Ibrahim W.
fonte
1
Eu não sei porque um monte de dev como usar 777 ... de alguma forma eles não se preocupam com o seu sistema ..
ZeroOne
15

Para usuários vagantes, a solução é:

(vagrant) cache de artesãos php: limpar

(fora do vagrant) chmod -R 777 app / storage

(em vagrantes) compositor dump-autoload

Certificar-se de que você chmod em seu ambiente local e não dentro de vagabundos é importante aqui!

Brendan
fonte
6
777 não está muito aberto?
simo
3
Quero dizer, para produção, com certeza. Mas este é um ambiente de desenvolvimento local. 777 era o que o pôster original estava usando e outras respostas.775 ou 755 podem funcionar dependendo.
Brendan
12

Tente novamente com chmod -R 755 /var/www/html/test/app/storage. Use com sudo for Operation not permittedno chmod. Use Verificar permissão do proprietário se ainda tiver o erro.

Khay
fonte
Não está funcionando. Todos os diretórios dentro de aplicativo tem permissão drwxrwxrwx
vishnub1626
@tav, verifique sua permissão de proprietário para a sua pasta de teste?
Khay
O mesmo drwxrwxrwx. Resolveu o problema usando @ sugestões das vsmoraes (ver os comentários)
vishnub1626
4
chmod 777 é um risco de segurança
Yogesh Kamat
9

De acordo com o Laravel 5.4, que é o mais recente que eu estou escrevendo, se você tiver qualquer problema como esse, precisará alterar a permissão. NÃO OUÇA NINGUÉM QUE DIZ QUE VOCÊ AJUSTE 777 PARA QUALQUER DIRETÓRIO. Tem um problema de segurança. Mude a permissão da pasta de armazenamento como esta

sudo chmod -R 775 storage

Alterar a permissão da pasta de inicialização como esta

sudo chmod -R 775 bootstrap/cache

Agora, verifique se você está executando os dois comandos no diretório do aplicativo. Você não enfrentará problemas no futuro em relação à permissão. O 775 não compromete nenhuma segurança da sua máquina.

Koushik Das
fonte
7

Sugira a permissão correta, se for para o Apache,

sudo chown -R apache:apache apppath/app/storage
Sean
fonte
Uso Laravel Forge: sudo chown -R forja: forja ~ / projecto / storage / sudo chown -R forja: forja ~ / projecto / inicialização / cache /
Flappy
6

Se você possui o Laravel 5 e procura uma solução permanente, o php artisanuso da linha de comando e o servidor Apache aplicáveis usam o seguinte:

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

Veja a explicação detalhada aqui .

alexeydemin
fonte
8
parece uma péssima idéia usar o 777
Randy L
umask 000 no resolv.conf ?! onde essas pessoas estão obtendo essas informações? essa é uma linha inválida no resolv.conf. Por favor, ignore esta e todas as 777 "soluções" disponíveis lá fora
higuita
verifique o url e não encontre nenhuma opção umask no resolv.conf linux.die.net/man/5/resolv.conf #
higuita
6

PARA QUALQUER UM EXECUTANDO UM SO COM SELINUX: A maneira correta de permitir que o httpd grave na pasta de armazenamento laravel é:

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

Em seguida, aplique as alterações imediatamente:

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

O SELinux pode ser um problema, mas se estiver presente, recomendo que você aprenda mais do que ignorá-lo completamente.

Heather Gaye
fonte
meu problema exato em centos frescos 7 foi semelhante. estava dizendo que não havia permissão para escrever, mas todos eram 777 para testes. Portanto, este post realmente economizou meu tempo depois de toda verificação geral.
Humanos
1
Esta é a solução correta, embora eu acho que o tipo SELinux correto deve ser httpd_sys_rw_content_t sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug
4

Eu tive o mesmo problema e as etapas abaixo me ajudaram a corrigir o problema.

  1. Descubra o usuário apache - criou um arquivo test.php na pasta pública com o código

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

E execute o arquivo no navegador da web. Isso daria ao usuário apache. No meu caso, é ec2-user, pois eu estava usando o aws com o cronjob instalado no /etc/cron.d/. Pode ser um usuário diferente para os outros.

  1. Execute o comando abaixo na linha de comando.

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

Você precisa identificar e usar o "usuário" e o "grupo de usuários" certos aqui.

KiranD
fonte
4

Se você usa Linux ou Mac, também pode executar o ssh terminal. Você pode usar o terminal para executar este comando,

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

Se você estiver usando o Windows, poderá executar usando git bash.

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

Você pode fazer o download do formulário git https://git-scm.com/downloads .

Rasheduzzaman
fonte
3

Xampp para uso:

cd /Applications/XAMPP/htdocs  
chmod -R 775 test/app/storage
cristianojeda
fonte
1
você pode explicar isso um pouco mais?
Aaron Hall
Eu uso este artigo, e eu estava: Configurando Laravel 4.x no Mac OSX 10.8+ com XAMPP
cristianojeda
3
chmod 777 é um risco de segurança
Yogesh Kamat
1
Você também pode usar este chmod 775
cristianojeda
2

Sempre que altero o app.php, recebo uma permissão negada para gravar o bootstrap / cache / services.json, então fiz isso para corrigi-lo:

chmod -R 777 bootstrap/cache/
malhal
fonte
8
chmod 777 é um risco de segurança
Yogesh Kamat
2
rm storage/logs/laravel.log  

resolveu isso para mim

aad1992
fonte
2

Definir a permissão para 777 é definitivamente uma péssima ideia!

... mas

Se você está recebendo um erro de permissão conectado à pasta "storage", foi o que funcionou para mim:

1) Defina a permissão "storage" e suas subpastas para 777 com

sudo chmod -R 777 storage/

2) No navegador, vá para a página inicial do laravel laravel / public / (o laravel criará os arquivos de armazenamento inicial necessários)

3) Devolva a permissão 775 segura para armazenamento e suas subpastas

sudo chmod -R 775 storage/
Nika Tsogiaidze
fonte
2

Se estiver usando laradock, tente chown -R laradock:www-data ./storageno contêiner da área de trabalho

Rob L
fonte
1

No meu caso, a solução foi alterar a permissão app/storage/framework/viewse os app/storage/logsdiretórios.

Den
fonte
0

Se alguém mais tiver um problema semelhante com o erro de permissão de arquivo fopen, mas for sábio o suficiente para não chmod 777 às cegas, aqui está minha sugestão.

Verifique o comando que você está usando para obter as permissões que o apache precisa:

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

O 'r' significa aberto apenas para leitura e, se você não estiver editando o arquivo, é como deve defini-lo. Isso significa que o apache / www-data precisa de pelo menos permissão de leitura nesse arquivo, que se o arquivo for criado através do laravel, ele já terá permissão de leitura.

Se, por algum motivo, você precisar gravar no arquivo:

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

Em seguida, verifique se o apache também tem permissões para gravar no arquivo.

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

Kyle Burkett
fonte
0

Basta iniciar seu servidor usando artisian

php artisian serve

Em seguida, acesse seu projeto a partir do URL especificado:

insira a descrição da imagem aqui

wajih
fonte
0

Eu tenho o mesmo problema ao rodar vagrant no mac. resolveu o problema alterando o usuário do servidor Apache no arquivo https.conf:

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

Execute o apache no usuário php em vez do daemon do usuário para resolver o problema de acesso ao arquivo com 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

agora, o arquivo de cache criado pelo php pode ser lido e editado pelo apache sem mostrar nenhum erro de permissão de acesso.

nigam214
fonte
0

Depois de muitas tentativas e erros com permissões de diretório, acabei com uma epifania ... não havia mais espaço na partição do disco. Só queria compartilhar para garantir que ninguém mais seja estúpido o suficiente para continuar procurando a solução na direção errada.

No Linux, você pode usar df -hpara verificar o tamanho do disco e o espaço livre.

Frank
fonte
0

Esse problema, na verdade, é causado por usuários diferentes que desejam write/readarquivar, mas que foram negados, causam propriedade diferente. talvez você como 'root' tenha instalado o laravel antes de fazer o login no seu site como usuário 'laravel' onde 'laravel' é a propriedade padrão, portanto, esse é o problema realmente real aqui. Portanto, quando o usuário 'laravel' quiser ler / gravar todos os arquivos no disco como padrão, a ser negado, faça com que o arquivo seja propriedade de 'root'.

Para resolver esse problema, você pode seguir assim:

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

ou no meu caso

sudo chown -hR igmcoid /root /sublaravel

Nota de rodapé:

  1. root como nome de primeira propriedade que instalou antes
  2. your-user-name como a propriedade padrão que realmente escreve / lê no site.
  3. namefolder como pasta de nome que deseja alterar a propriedade.
Bliss Jaspis
fonte
0

Eu tenho os mesmos erros no meu projeto ...
Mas descobri que esqueci de colocar enctypeno meu formulário.

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

Espero que ajude em algum lugar de alguma forma ...

Vpa
fonte
0

Enquanto trabalhava no Windows 10 com o Laragon e o Laravel 4, parecia-me que não havia maneira de alterar as permissões manualmente, pois a execução de chmodcomandos no terminal Laragon embutido não tinha efeito.

No entanto, era possível neste terminal ir para a pasta de armazenamento e adicionar manualmente as pastas desejadas como esta:

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

O cdcomando-no terminal leva você para a pasta (pode ser necessário ajustar esse caminho para se adequar à sua estrutura de arquivos). O mkdircomando-criará o diretório com o nome fornecido.

Não tive a oportunidade de testar essa abordagem no Laravel 5, mas espero que uma abordagem semelhante funcione.

Claro que pode haver uma maneira melhor, mas pelo menos essa foi uma solução razoável para a minha situação (corrigindo o erro file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream:).

Virgínia
fonte
-1
  1. Primeiro, exclua a pasta de armazenamento e crie novamente a pasta de armazenamento.
  2. A pasta de armazenamento interno cria um novo nome de pasta como estrutura.
  3. A pasta de estrutura interna cria um nome de três pastas como cache, sessões e visualizações.

Eu resolvi meu problema fazendo isso.

Md Juyel Rana
fonte
-4

Eu tentei dar 777acesso à pasta de armazenamento e ela tem trabalho para mim

1) vá para o diretório raiz do laravel ( /var/www/htmlpara mim) e execute o seguinte comando

chmod 777 -R storage
Yur Gasparyan
fonte
2
Não defina permissões para 777, pois isso torna o diretório visível e editável para todos que podem vê-lo. Isto não é recomendado!
CodeNinja 4/17