web-dev-qa-db-ja.com

PHP致命的エラー必要なファイルを開けませんでした

Apacheから次のエラーが表示されます

[2011年3月19日23:10:50] [警告] mod_fcgid:stderr:PHP致命的エラー:require_once()[function.require]:必要なオープンに失敗しました '/ common/configs/config_templates.inc.php '(include_path ='。:/ usr/share/pear:/ usr/share/php ')/home/viapi​​cs1/public_html/common/configs/config.inc.php in 158

私は間違いなくApacheの専門家ではありませんが、config.inc.phpとconfig_templates.inc.phpファイルがあります。また、common/configs /に配置したtest.htmlページに移動しようとしたので、権限の問題は発生していないと思います。また、config_templates.inc.phpに権限を設定して、すべての人に読み取り、書き込み、実行の権限を付与します。この時点で何をすべきかわからない、/ usr/share/phpディレクトリがあるかどうかを確認し、ないことを発見したが、phpをyumインストールしたとき、それが最新であると言った。アイデア?

45
Al Katawazi

それは実際にはApache関連の質問ではありません。 PHP関連のものでもありません。このエラーを理解するには、仮想サーバー上のパスファイルシステム内のパスを区別する必要があります

require演算子はファイルで機能します。しかし、ない

                          /common/configs/config_templates.inc.php

サーバー上のファイルが、むしろ

/home/viapics1/public_html/common/configs/config_templates.inc.php

/home/viapics1/public_html

パートはDocument rootと呼ばれ、仮想世界と実際の世界を接続します。幸いなことに、Webサーバーは通常、PHPと共有する構成変数にドキュメントルートを持っています。コードを次のようなものに変更すると

require_once $_SERVER['DOCUMENT_ROOT'].'/common/configs/config_templates.inc.php';

任意のディレクトリに配置された任意のファイルから機能します。

更新:最終的に、ファイルシステムとWebサーバーで 相対パスと絶対パスの違い を説明する記事を書きました。これは、問題を詳細に説明し、実用的な解決策を含んでいます。

残念ながら、コマンドラインからスクリプトを実行する場合、このような便利な変数は存在しません。この場合、「単一のエントリポイント」と呼ばれる技法が助けになります。詳細については、上記の記事も参照してください。

83

SELinuxを実行している場合、次を使用して/ home dirから読み取るためのhttpdパーミッションを付与する必要があります。

 Sudo setsebool httpd_read_user_content=1
9
user1533634

php -f /common/configs/config_templates.inc.phpを実行して、ファイル内のPHP構文の妥当性を検証します。

3
Alex Howansky

これが他の誰にも役立つ場合に備えて、昨夜トリガーされたこのエラーのあいまいなケースに私はつまずきました。具体的には、require_onceメソッドを使用し、ファイル名のみを指定し、パスは指定しませんでした。必要なファイルは同じディレクトリに存在していたからです。

ある時点で「必要なファイルを開けませんでした」というエラーが表示され始めました。しばらく髪を引き裂いた後、「[ストリームを開くことができませんでした:許可が拒否されました」」という致命的なエラー出力のすぐ上にPHP警告メッセージがありましたが、さらに重要なことに、開こうとしていたファイル。それから、PHP 'include'検索パスにあるファイルのコピー(Apacheにアクセスできない所有権を含む)を作成したという事実に気付きました。拾いたかった。ど!

1
John Rix

ちょっと私はこの問題を抱えていて、フォルダーの場所を十分に見ていないことがわかりました:

持っていた

require_once /vagrant/public/liberate/**APP**/vendor/autoload.php

うまくいったのは:

require_once /vagrant/public/liberate/vendor/autoload.php

この非常に目立たない問題を見落とすことは、(初心者として)非常に簡単でした。はい、私は、記録されている必要な問題が目前の問題を直接指していることを理解していますが、あなたが私のような初心者であれば、これらのことは簡単に見落とされる可能性があります。

修正:

(__ Dir __ '/etc/etc/etc/file.php')のデバッグをよく見て、ファイルシステムを別のウィンドウで開いて、2つを直接マッピングします。わずかな違いさえあれば、このrequireは機能せず、上記のエラーは吐き出されます。

0

PHP定数__DIR__で修正できます

require_once __DIR__ . '/common/configs/config_templates.inc.php';

ファイルのディレクトリです。インクルード内で使用される場合、インクルードされたファイルのディレクトリが返されます。これはdirname __FILE__と同等です。このディレクトリ名には、ルートディレクトリでない限り、末尾のスラッシュはありません。 1

0
Bernard