file_put_contents(meta / services.json):ストリームを開けませんでした:権限が拒否されました


169

Laravelは初めてです。開こうhttp://localhost/test/public/としたのですが

例外ハンドラのエラー。

私はググって、ストレージディレクトリのアクセス許可を変更しましたが、使用chmod -R 777 app/storageできませんでした。

私は変更debug=>trueapp.phpてページにアクセスし、例外ハンドラでエラーを得ました:

ストリームまたはファイル "/var/www/html/test/app/storage/logs/laravel.log"を開けませんでした:ストリームを開けませんでした:/ var / www / html / test / bootstrap / compiledでアクセスが拒否されました。 php:8423

次に、コマンドchmod -R 644 app/storageを使用してストレージディレクトリの権限を変更し、「例外ハンドラーのエラー」エラーがなくなり、ページが読み込まれました。しかし、そこに私はこれを得ています:

file_put_contents(/var/www/html/laravel/app/storage/meta/services.json):ストリームを開けませんでした:権限が拒否されました


2
再び許可の問題のように見えます、すべてのアプリケーションディレクトリを再帰的にchmodします
alou

@alou私はすでにchmod -R 777 app / storageでそれを行っていると思います。私じゃなかったの?そして、アプリ内のすべてのディレクトリにはdrwxrwxrwx権限があります。
vishnub1626 2014年

33
試してみてください:php artisan cache:clearその後、chmod -R 777 app/storage最後にphp artisan dump-autoload
vsmoraes

@vsmoraesうまくいきました。問題が何であったかを説明できれば、非常に役立ちます。
vishnub1626 2014年

7
vsmoraesのコメントは正しかったが、「php artisan dump-autoload」の代わりに「composer dump-autoload」でなければならない
Elliot Robert

回答:


320

vsmoraesからの提案は私のために働きました:

ララヴェル> = 5.4

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

ララヴェル<5.4

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

注:これをリモートサーバー(開発または本番)で行わないでください。

私がこの質問をしたとき、これは仮想マシンで実行されている私のローカルホストの問題でした。ですから、777を設定することで十分安全だと思いましたが、別の解決策を探すべきだと言う人は正しいでしょう。最初に775を試してください


8
これはsudo chmod -R 777 app / storageである必要があります。権限エラーを回避するため。
Olaitan Mayowa 2014年

5
#Laravel5の場合、手順はほぼ同じです:php artisan cache:clear、次に chmod -R 777 storage、その後 composer dump-autoload
WNRosenberg

6
Laravel 5.1以降を使用している場合は、chmod -R 777 storage代わりに使用する必要があります
James

10
php artisan cache:clear正解です。次にsudo chmod -R ug+rw storage読み取り/書き込みまたは特に実行権限を与えるothersことなく
Zack Morris

43
この回答とスレッドは、私がLaravelをそれほど嫌う理由を強調しています。これは、結果を気にせずに、好きなときに好きなだけ好きなだけ速く実行できることを開発者に教えています(私777はLaravel固有ではないことを理解していますが、 Laravel開発者の思考プロセスは、「今すぐ機能させる、どうでもいい」、と同じです777)。原則として、777何かが機能するように設定することは決してありません。サーバーとユーザー/ロールを理解し、それに応じて設定します。ハックしないでください。あなたのクライアントはあなたがこれを正しく行うことを信頼しています。
dKen 2016年

70

Laravel 5でこの問題に直面しているGoogle社員向け。

これは、異なるユーザーがstorage/logs、異なるアクセス許可を持つフォルダー内の同じログファイルに書き込もうとしたために発生するアクセス許可の問題です。

何が起こるのですか?あなたのlaravel設定はおそらくエラーを毎日ログに記録するように設定されているため、Webサーバー(apache / nginx)は_www、OSXやwww-data* NIXシステムなどの環境に応じて、デフォルトのユーザーの下でこのファイルを作成する場合があります。いくつかの職人コマンドを実行してエラーが発生した可能性があるため、職人はこのファイルを書き込みますが、ターミナルのPHPは実際にはログインユーザーである別のユーザーによって実行されるため、このコマンドを実行してチェックアウトできます:

php -i | grep USER

ログインユーザーがそのログファイルをウェブサーバーに作成した場合、エラーを書き込むことはできません。その逆も同様です。laravelは655デフォルトで、所有者のみが書き込むことができる権限でログファイルを書き込むためです。

この一時的な問題を修正するには、664このファイルにグループの権限を手動で付与して 、ログインユーザーとWebサーバーユーザーの両方がそのログファイルに書き込むことができるようにする必要があります。

この問題を永久に回避するには、storage/logsディレクトリから権限を継承して新しいファイルがディレクトリ内に作成されたときに適切な権限を設定することができます。この回答https://unix.stackexchange.com/a/115632は、それ。


ファン-friggen-tasticの回答はこちら!Elastic Beanstalkで実行していますが、コマンドラインPHPユーザーは「ec2-user」ですが、アプリケーションは「webapp」として実行されます。
Randy L

1
問題を説明する答え。つまり、適切な答えです。
Craicerjack

これは、Cloudways上のLaravelでファイルキャッシュエラーが発生する理由を理解するのに役立ちました。ファイルの権限をリセットするには、Cloudwaysパネルのボタンを押す必要がありました。ありがとう。
ライアン

44

777アクセス許可を与えるべきではありません。これはセキュリティ上のリスクです。Ubuntuユーザーには、Laravel 5で、ディレクトリストレージの所有者を再帰的に変更することをお勧めします。

以下を試してください:

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

Ubuntuベースのシステムでは、www-dataはapacheユーザーです。


2
これは私にとっては固定で、chmod 777答えよりも正しいと思います。おかげで〜
GavinR

これはLinuxユーザーにとって最も便利な答えだと思います。@GavinRに感謝します。chmod 777完全な悪夢です。
アブダラアルバブ2018年

これは私にとってはうまくいき、chmod -777よりも間違いなく優れたオプションです
Egnaro

問題を解決する新しい方法をありがとう!chmod 777結果を元に戻すために、コマンドの前後に何かをする必要がありますか?
アレクサンダー

41

Laravel 5を使用しているすべての人にとって、HomesteadとMacはこれを試してください:

mkdir storage/framework/views

これは、Laravel 5.2.7を使用してLaravel Forgeで新しいサーバーを作成する場合にも機能します
winkster

2
これでうまくいきました。bootstrap/cache/compiled.phpこのディレクトリに書き込もうとしていたようですが、存在せず、権限エラーが発生しました。ありがとうございました。
マットK

1
どういうわけかこれは私のために働いた。私はlaravel 5.1を使用しています
ヨハネスグルトム

これでうまくいきました。これが再びlaravelによって生成されると考えて、ストレージディレクトリ全体を削除しましたが、そうではありません。
grimmdude

33

SELINUXが原因でこの問題が発生する場合があります。このコマンドでselinuxを無効にできます。

sudo setenforce 0

うわー、私は本当にトリックをうまくやった、誰かがそれがなぜうまくいったのか私に説明できますか?selinuxとは
undefinedman

はい、これは本当にうまくいきました!SELINUXでこれを理解するための第一人者になってください。
私はfedora

1
ありがとう、どうもありがとう。私はネットを検索し、誰もが許可を確認し、ユーザーを確認するなどと私に言います...
Ali ZahediGol

3
これは基本的に、必要なポートをブロックしていたため、ファイアウォール全体をオフにするようなものです。
Teh JoE

聞いたことがない。「Security-Enhanced Linux(SELinux)は、アクセス制御セキュリティポリシーをサポートするためのメカニズムを提供するLinuxカーネルセキュリティモジュールです。」オフにするのは良い考えだと思います。そして、私は賛成者がすべての結果を理解せずに盲目的にこのコマンドを使用しているに違いない。
Ryan

18

問題が解決しました

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

これにより、アプリ、フレームワーク、ログへの書き込み権限が有効になります。


12
決して777 ...それはDEVで働くもののような錯覚を与えるだろうが、彼らは良いアイデアになることはありませんだけでなくとして777ない限りPRODに壊れるようDEVまたはPROD中
カイルバーケット

うわー、あなたはロックです...ベンダーは私が欠けていたものでした
lu1s

ええ、一般に公開されているWeb 777で何かを与えることは悪い考えです
imabug

17

IT権限777を絶対に与えないでください!

ターミナルのlaravelプロジェクトのディレクトリに移動して、次のように記述します。

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

このようにして、ユーザーを所有者にして特権を与えます
。1実行、2書き込み、4読み取り
1 + 2 + 4 = 7は(rwx)を意味します
2 + 4 = 6は
最後に(rw)を意味し、ストレージアクセスについては、ug + rwxは、ユーザーとグループに7を与えることを意味します


1
なぜ多くの開発者が777を使いたがっているのかわかりません...どういうわけか、彼らは自分のシステムを気にしていません
ZeroOne

15

迷惑なユーザーの場合、解決策は次のとおりです。

(浮浪者で)php artisan cache:clear

(浮浪者の外)chmod -R 777 app / storage

(浮浪者で)作曲者ダンプオートロード

ここでは、浮浪者の内部ではなく、ローカル環境でchmodを実行することが重要です。


6
777は開きすぎていませんか?
simo

3
つまり、生産に関しては、確かです。しかし、これはローカル開発環境です。777は元のポスターが使用していたものであり、他の回答です。775または755は動作する場合があります。
ブレンダン

12

で再試行してくださいchmod -R 755 /var/www/html/test/app/storageOperation not permittedchmodのsudoで使用します。それでもエラーが発生する場合は、所有者のチェック権限を使用してください。


機能していません。アプリ内のすべてのディレクトリに権限drwxrwxrwx
vishnub1626

@tavテストフォルダの所有者権限を確認してください。
カイ

同じdrwxrwxrwx。@vsmoraesの提案(コメントを参照)を使用して問題を解決しました
vishnub1626

4
chmod 777はセキュリティリスクです
Yogesh Kamat

9

私がこれを書いている最新のLaravel 5.4に従って、このような問題が発生した場合は、権限を変更する必要があります。 ディレクトリに777を設定するように指示する人には聞いてはいけません。 セキュリティ上の問題があります。このように保存フォルダの権限を変更します

sudo chmod -R 775 storage

このようにブートストラップフォルダーのアクセス許可を変更する

sudo chmod -R 775 bootstrap/cache

ここで、アプリケーションディレクトリから両方のコマンドを実行していることを確認してください。今後、許可に関して問題が発生することはありません。775はマシンのセキュリティを危険にさらしません。


7

Apacheの場合は、正しい権限を提案します。

sudo chown -R apache:apache apppath/app/storage

Laravel Forgeの使用:sudo chown -R forge:forge〜/ project / storage / sudo chown -R forge:forge〜/ project / bootstrap / cache /
Flappy

6

あなたが持っている場合はLaravel 5と恒久的な解決策を探して、該当する両方のphp artisanコマンドラインの使用方法とApacheサーバを、これを使用します。

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

詳しくはこちらをご覧ください。


8
777を使用するのは悪い考えのようです
Randy L

usolv 000 in resolv.conf?!この人々はどこでこの情報を入手していますか?これは、resolv.confの無効な行です。これとそこにあるすべての777の「解決策」を無視してください
higuita '18

URLを確認し、resolv.confでumaskオプションを見つけないlinux.die.net/man/5/resolv.conf
higuita

6

OSをSELINUXで実行しているすべてのユーザー向け:httpdがlaravelストレージフォルダーに書き込むことを許可する正しい方法は次のとおりです。

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

次に、変更をすぐに適用するには:

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

SELinuxは扱いにくいかもしれませんが、それが存在する場合は、完全にバイパスするのではなく、それを学ぶことを強くお勧めします。


新鮮なCentos 7での私の正確な問題は同様でした。それは書く許可がないと言っていましたが、テストのためにすべて777でした。だから、この投稿は実際にすべての一般的なチェックの後に私の時間を節約しました。
HumaN 2016

1
これは正しい解決策ですが、正しいSELinuxタイプはhttpd_sys_rw_content_tである必要があると思います sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug

4

同じ問題があり、以下の手順で問題を解決できました。

  1. Apacheユーザーを見つけます-コードを使用してパブリックフォルダーにtest.phpファイルを作成します

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

そして、Webブラウザーからファイルを実行します。それはApacheユーザーを与えるでしょう。私の場合、/ etc / cron.d /にインストールされているcronjobでawsを使用していたので、ec2-userです。他のユーザーとは異なるユーザーである可能性があります。

  1. コマンドラインで以下のコマンドを実行します。

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

ここで正しい「ユーザー」と「ユーザーグループ」を識別して使用する必要があります。


4

LinuxまたはMacを使用している場合は、でも実行できますssh terminal。このコマンドを実行するためにターミナルを使用できます、

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

Windowsを使用している場合は、を使用して実行できますgit bash

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

git form https://git-scm.com/downloadsをダウンロードできます。



2

app.phpを変更するたびに、bootstrap / cache / services.jsonの書き込みが拒否されるため、これを修正するためにこれを行いました。

chmod -R 777 bootstrap/cache/

8
chmod 777はセキュリティ上のリスクです
Yogesh Kamat

2
rm storage/logs/laravel.log  

私のためにこれを解決しました


2

許可を777に設定するのは間違いなく恐ろしい考えです!

... だが

「ストレージ」フォルダに接続されている権限エラーが発生している場合は、それが私にとってはうまくいきました:

1)「ストレージ」とそのサブフォルダの権限を777に設定します

sudo chmod -R 777 storage/

2)ブラウザで、laravelのホームページlaravel / public /に移動します(laravelは必要な初期ストレージファイルを作成します)

3)安全な775権限をストレージとそのサブフォルダーに返す

sudo chmod -R 775 storage/

2

laradockを使用している場合chown -R laradock:www-data ./storageは、ワークスペースコンテナーで試してください


1

私の場合、解決策はapp/storage/framework/viewsapp/storage/logsディレクトリへのアクセス許可を変更することでした。


0

他の誰かがfopenファイルのアクセス許可エラーで同様の問題に遭遇したが、盲目的にchmod 777を実行しないのが賢明な場合は、私の提案です。

使用しているコマンドで、Apacheに必要な権限を確認します。

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

「r」は読み取り専用で開くことを意味し、ファイルを編集していない場合は、これを設定する必要があります。これは、apache / www-dataには少なくともそのファイルに対する読み取り権限が必要であることを意味します。ファイルがlaravelを介して作成されている場合、そのファイルにはすでに読み取り権限があります。

何らかの理由でファイルに書き込む必要がある場合:

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

次に、apacheにもファイルへの書き込み権限があることを確認します。

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


0

使用してサーバーを起動するだけです artisian

php artisian serve

次に、指定したURLからプロジェクトにアクセスします。

ここに画像の説明を入力してください


0

MacでVagrantを実行すると、同じ問題が発生します。https.confファイルでApacheサーバーのユーザーを変更することで問題を解決しました:

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

ユーザーデーモンではなくphpユーザーでapacheを実行して、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

これで、phpで作成されたキャッシュファイルは、アクセス許可エラーを表示せずに、Apacheで読み取りおよび編集できます。


0

ディレクトリのアクセス許可に関する多くの試行錯誤の末、私はひらめきに終わりました...ディスクのパーティションにスペースが残っていませんでした。他の人が間違った方向にソリューションを探し続けるほど愚かであることを確認するために共有したかっただけです。

Linuxでは、を使用df -hしてディスクサイズと空き領域を確認できます。


0

この問題は実際には、write/readファイルしたいが拒否されたさまざまなユーザーによって引き起こされ、異なる所有権を引き起こします。多分あなたは「ルート」としてlaravelをインストールしてから「laravel」ユーザーとしてサイトにログインし、「laravel」がデフォルトの所有権を持っているので、これが実際の問題です。したがって、ユーザー「laravel」がデフォルトでディスク内のすべてのファイルを読み書きしたい場合、拒否するには、そのファイルが「root」による所有権を持つようにします。

この問題を解決するには、次のようにします。

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

または私の場合

sudo chown -hR igmcoid /root /sublaravel

脚注:

  1. root 以前にインストールした名前の最初の所有者として
  2. your-user-name サイトで実際に書き込み/読み取りを行うデフォルトの所有権として。
  3. namefolder 所有権を変更したい名前のフォルダとして。

0

プロジェクトで同じエラーが発生し
ました... しかしenctype、フォームに入力するのを忘れていることがわかりました。

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

それがどこかで何らかの形で役立つことを願っています...


0

LaragonとLaravel 4を使用してWindows 10で作業しているときchmodに、Laragon-in-built-terminalで-commandsを実行しても効果がないため、権限を手動で変更する方法はないと思われました。

ただし、このターミナルでは、ストレージフォルダーに移動して、次のように目的のフォルダーを手動で追加することができました。

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

cdターミナルの-コマンドを使用すると、フォルダーに移動します(ファイル構造に合わせてこのパスを調整する必要がある場合があります)。のmkdir-commandは、指定された名前のディレクトリを作成します。

私はこのアプローチをLaravel 5でテストする機会がありませんでしたが、同様のアプローチが機能することを期待しています。

もちろんもっと良い方法があるかもしれませんが、少なくともこれは私の状況に対する妥当な回避策でした(エラーの修正:)file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream


-1
  1. まず、ストレージフォルダを削除してから、もう一度ストレージフォルダを作成します。
  2. ストレージフォルダ内に、フレームワークとして新しいフォルダ名を作成します。
  3. フレームワークフォルダー内に、キャッシュ、セッション、ビューの3つのフォルダー名を作成します。

これで問題を解決しました。


-4

777ストレージフォルダへのアクセスを許可しようとしましたが、それは私のために働いています

1)laravelルートディレクトリに移動し(/var/www/html私にとって)、次のコマンドを実行します

chmod 777 -R storage

2
権限を777に設定しないでください。これにより、dirを表示できるすべてのユーザーがdirを表示および編集できるようになります。これはお勧めできません!
CodeNinja 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.