file_put_contents権限が拒否されました


97

デバッグのためにファイルにクエリを書き込もうとしています。ファイルはにありdatabase/execute.phpます。書き込みたいファイルはdatabase/queries.phpです。

使用しようとしています file_put_contents('queries.txt', $query)

しかし、私は得ています

file_put_contents(queries.txt)[function.file-put-contents]:ストリームを開けませんでした:権限が拒否されました

queries.txtファイルを777にchmodしたのですが、問題は何でしょうか?


php.iniファイルへのアクセスを拒否する可能性のあるものがないか、ファイルを調べましたか?
Hello71、2011

2
また、ディレクトリが正しくchmodされていることを確認してください
Crayon Violent

1
また、絶対ファイル名を使用してみてください。現在のフォルダーの解釈がPHPの解釈と異なる可能性があります
ラーハー

1
そのchmodステータスを再確認できますか?
ジョナ

1
この種の問題のトラブルシューティングのチェックリストがあります:stackoverflow.com/questions/36577020/...
ヴィックSeedoubleyew

回答:


72

ディレクトリの権限を調整してみてください。

ターミナルから実行chmod 777 database(データベースフォルダーを含むディレクトリから)

正しくchmoddされている場合、apacheおよび誰もこのディレクトリにアクセスできません。

もう1つのことは、「getcwd()」をエコーすることです。これにより、現在のディレクトリが表示されます。これが「/something.../database/」でない場合は、「query.txt」をサーバーの完全パスに変更する必要があります。


104
777はセキュリティリスクではありませんか?
hitautodestruct 2013年

12
ターゲットアカウントがサーバーアカウントによって書き込み可能である必要があるだけでなく、ターゲットディレクトリのすべての親ディレクトリがサーバーアカウントがそこに移動できるようにする必要があると私は強く思います。これは、権限の+ xになると思います。
Erhannis 2013

2
新しいLAMPスタックでErhannisの理論を実験しましたが、理論は正しいです。
thotheolh 2013年

4
@MajidFouladpour chmod +x /parent/directory、ターゲットのすべての親ディレクトリについて。 chmod +x /parent/directorychmod +x /parentなど
エルハニス2014

1
この種の問題のトラブルシューティングのチェックリストが用意されました:stackoverflow.com/questions/36577020/...
ヴィックSeedoubleyew

18

他のオプション

Apache (www-data)フォルダの所有者を作成できることです

sudo chown -R www-data:www-data /var/www

これでfile_put_contentsうまくいくはずです。ただし、セキュリティを高めるには、以下のように権限を設定することをお勧めします

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • /var/wwwphpファイルのルートフォルダーに変更します。

7

これはかなり古いものですが、このようなファイルにクエリを手動で書き込む必要はありません。MySQLにはロギングサポートが組み込まれているため、開発環境内で有効にする必要があります。

「一般クエリログ」のドキュメントをご覧ください。

http://dev.mysql.com/doc/refman/5.1/en/query-log.html


3

みんな私はこの問題を1か月間抱えていて、すべてを行いましたが、それを修正することはできませんでしたが、今では解決策を知っています。

共有Linuxホスティングを使用していますが、管理者がPHPを5.3に変更すると、「file_put_contents」コードで多くのエラーが発生しました。私の計画をテストしてみてください:

ホストでmytest.phpのようなファイルを作成し、このコードを配置して保存します。

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

URL「www.your-domain.com/mytest.php」を1回開き、メールを確認します。mytest.phpに入力した情報をホストからメールで送信する必要があります。送信者名を確認してください。からからのものである場合、何かが定義されていないため「Permission Denied」について問題があり、送信者名が私のIDのようなものである場合:iietj8qy@hostname5.netly.net

私の管理者がサーバーを変更し、ホストを再インストールしました。問題は解決しました。私が言ったことをホスト管理者に伝えてください。おそらく彼らは答えを見つけます。

お役に立てば幸いです。


完全に迷ってしまいました!! 何を言おうとしているのですか?Apacheユーザーがサーバー上のホスト名(共有またはその他)を取得できなかったと言っている場合は、ホスティングサービスの選択を再検討する必要があります。
Fr0zenFyr 2016年

3

私はそれが非常に古い質問であることを知っていますが、私はいくつかの詳細な説明とともに良い解決策を追加したいと思いました。システムのようなUbuntuで2つのステートメントを実行する必要があります。

Linuxの権限は3桁で表すことができます。最初の数字は、ファイルの所有者の許可を定義します。2桁目は、特定のユーザーグループの権限です。3桁目は、グループの所有者でもメンバーでもないすべてのユーザーの権限を定義します。

Webサーバーは、グループのメンバーであるIDで実行されることになっています。ウェブサーバーは、ファイルとディレクトリの所有者と同じIDで実行しないでください。Ubuntuでは、www-dataというIDでApacheを実行します。そのIDは、権限が指定されているグループのメンバーである必要があります。

ファイルの内容を変更するディレクトリに適切な権限を与えるには、次のステートメントを実行します。

find %DIR% -type d -exec chmod 770 {} \;

これは、OPの質問で、ディレクトリ%ROOT%/ databaseの権限を適宜変更する必要があることを意味します。そのため、変更したり削除したりしてはならないファイルをそのディレクトリ内に置かないことが重要です。そのため、コンテンツを変更する必要のあるファイル用に別のディレクトリを作成することをお勧めします。

ディレクトリの読み取り権限(4)は、ディレクトリ内のメタデータとともにすべてのファイルとディレクトリを収集できることを意味します。書き込み許可(2)は、ディレクトリーの内容を変更する許可を与えます。ファイルの追加と削除、権限の変更などを意味します。実行権限(1)は、そのディレクトリに移動する権限があることを意味します。後者がないと、ディレクトリをさらに深く調べることはできません。ファイルの内容を変更する必要がある場合、ウェブサーバーには読み取り、書き込み、実行の権限が必要です。そのため、グループには数字7が必要です。

2番目のステートメントはOPの問題です。

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

文書を読み書きできることが必要ですが、ファイルを実行する必要はありません。7はファイルの所有者に与えられ、6はグループに与えられます。Webサーバーは、ファイルの内容を変更するためにファイルを実行する権限を持っている必要はありません。これらの書き込み権限は、そのディレクトリ内のファイルにのみ付与する必要があります。

他のすべてのユーザーには権限を与えないでください。

ファイルを変更する必要のないディレクトリの場合は、グループ権限5で十分です。権限に関するドキュメントといくつかの例:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/


3

このリンクから情報を収集するstackoverflow-image saveがchmod 777で機能しないおよびユーザーazerafatiとLoek Bergmanから

/ etc / apache / envvarsファイルの下を調べると、次のようになります。

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apacheはユーザー名「www-data」で実行されています

「0755」は、ファイルの所有者は読み取り/書き込み/実行はできるが、グループおよび他のユーザーは書き込みできないことを意味します。urターミナルで、「images」フォルダーを含むフォルダーにcdします。次に、次のように入力します。

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

所有者を変更する前に、まず権限を変更する必要があります。プロンプトが表示されたらパスワードを入力します。これにより、画像フォルダの「www-data」オーナーが作成されます。

これでアップロードが機能するはずです。


1

Ubuntuを使用していて、ページをローカルにロードしているときにこのエラーを受け取ったが、Webホスティングサービスではない場合、

nautilus(sudo nautilus)を開いて、開こうとしているファイルを右クリックし、[プロパティ]> [設定]をクリックして、「他の全員」に読み取り書き込みを許可することで、これを修正しました


0

同じ問題がありました。私の問題は、selinuxがenforcingに設定されていることでした。

777にchmodし、すべての親フォルダにapacheユーザーの実行権限があることを確認した後でも、「ストリームを開くことができませんでした:権限が拒否されました」エラーが発生し続けました。私の問題は、selinuxがenforcingに設定されている(私はcentos7を使用している)ことでした。これはdevboxなので、オフにしました。


0

これは、次の手順で解決できます。

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

それが役に立てば幸い


0

gitからローカルからサーバーにプルしている場合は、アップロードされるビューファイルや他のキャッシュされたファイルのために、キャッシュをクリアする必要がある場合があります。

php artisan cache:clear

git pullの前にアプリケーションが機能していた場合、時としてそれはトリックに過ぎないかもしれません



-2

この問題を解決するには2つの方法があります
1.を使用しますchmod 777 path-to-your-directory
それが機能しない場合は、
2 query.txt. ファイルの完全なパスを指定するだけです。


2
これは恐ろしく安全ではなく、非常に悪い習慣です。また、カスタムアプリケーションの開発時に検出および修正するのが難しく、見落とされがちです。実際に適切な権限を見つけてください。
ftrotter 2017

-3

ここでのソリューション。URLからimgをコピーします。このURL:http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

目的のパスを作成し、名前を .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)

-11

また、に言ったようfile_put_contents man pagephp.net、問題に名前を付けるには注意してください。

file_put_contents($dir."/file.txt", "hello");

(構文上は正しいにもかかわらず)機能しない可能性がありますが、

file_put_contents("$dir/file.txt", "hello");

動作します。phpをインストールした別のサーバーでこれを経験しました。


17
これは正しくありません。文字列であると仮定$dir."/file.txt"すると"$dir/file.txt"、すべての場合で機能的に同等$dirです。さらに、この動作は、Kivancが主張するように、php.netに文書化されていません。
mattbasta
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.