web-dev-qa-db-ja.com

file_put_contents許可が拒否されました

デバッグのためにクエリをファイルに書き込もうとしています。ファイルは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したのですが、問題は何ですか?

84
Hailwood

ディレクトリのアクセス許可を調整してみてください。

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

Apacheは、このディレクトリが正しくchmoddされている場合、このディレクトリにアクセスできません。

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

64
Jason

他のオプション

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/wwwをphpファイルのルートフォルダーに変更します
13
azerafati

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

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

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

7
Adam

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

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

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

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

「www.your-domain.com/mytest.php」というURLを一度開いてから、メールを確認します。ホストからmytest.phpに入力した情報を記載したメールが届くはずです。送信者名を確認してください。その発信元がNobodyの場合、「Permission Denied」に関する問題が発生します。何かが定義されていないため、送信者名が私のid:[email protected]のような場合、probはありません。

私の管理者がサーバーを変更し、ホストを再度インストールしたので、問題は解決したと思います。ホスト管理者に私が言ったことを伝えてください。

それがあなたを助けることを願っています!

3
Hesam

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

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

Webサーバーは、グループのメンバーであるIDで実行することになっています。 Webサーバーは、ファイルとディレクトリの所有者と同じ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
Loek Bergman

このリンクから情報を収集する stackmodflow-imageの保存は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」が画像フォルダの所有者になります。

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

3
Bruce Tong

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

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

0
DaveS

Ubuntuを使用していて、ウェブホスティングサービスではなくページをローカルに読み込むときにこのエラーを受け取った場合は、

これを修正するには、nautilus(Sudo nautilus)を開き、開こうとしているファイルを右クリックし、[プロパティ]> [設定]をクリックして、「他の全員」に読み書きを与えます。

0
d-_-b

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

php artisan cache:clear

あなたのアプリケーションがgit pullの前に動作していた場合、時々トリックになるかもしれません

0
Deepesh Thapa

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

1. $ php artisan cache:clear

2. $ Sudo chmod -R 777 storage

3. $ composer dump-autoload

それが役に立てば幸い

0
rust