質問
会社には、smarty に基づいて書かれたフレームワークがあります。私は PHP のアップグレードを担当しています。保守スタッフが新しい環境をデプロイした後、テスターが頻繁にエラー (エラー: ファイルが見つかりません) を報告してくれました。 )。
コードを追跡したところ、smarty によって報告されたエラーであることが判明しました。
エラー: ここで報告されたファイルは存在しません。
思考プロセス:
1. プログラム内にそのようなファイルが存在しないからだと思っていましたが、実際にはファイルが存在していました。
2. その後、PHP カーネルに問題があるのではないかと考え、関連する PHP カーネル ファイルを調べましたが、問題は見つかりませんでした。その結果、私はプロジェクトマネージャーにすべてのプロセスを話しました。 ——問題は解決していないので、このままにしておきます。現時点ではアップグレードが遅れています。
今日、この問題を再び発見しました。最初に感じたのは、PHP のバージョンがアップグレードされていないことがわかりました。 ——その後、ディレクトリ全体を 777 に設定しましたが、すべて問題ありませんでした (chmod 777 -R ディレクトリ)。 file_exists()メソッドの問題なのでしょうか。
そこで、関連するデバッグと実験を実施しました。
デバッグプロセス
デバッグコード:
ディレクトリ:
各権限を確認してください。test には www に対する権限がありませんが、実行ファイル Index.php には読み取りおよび書き込みの実行権限があり、含まれているファイル test.txt には読み取りおよび書き込みの権限があります。
実行結果:
ディレクトリの実行権限は file_exists() に影響します
1. テストに最大の権限を与えます - 755
成功したということは、file_exists() 関数がディレクトリのアクセス許可によって制限されていることを意味します。
それでは、どのような種類のディレクトリ権限が file_exists() に影響するのでしょうか?
私はいくつかの実験を行いました。
1. 書き込み権限のみが与えられている場合、ファイルは存在しません。
2. 読み取りのみの場合、ファイルの上位ディレクトリには存在しません。権限が与えられている場合、ファイルは存在しません。
3. すべての上位レベルのディレクトリに実行権限がある場合、報告されたファイルは存在し、すべてが正常です。
結果は、 file_exists() がファイルの存在を判定する際に、各ディレクトリに実行権限があるかどうかを再帰的に判定していることがわかります。
ファイル パスを相対パスに変更しても、同じ結果が得られます。
概要
file_exists がディレクトリの実行権限の影響を受けることは PHP マニュアルには記載されていません。この記事は、この問題を抱えている開発者に情報を提供するために使用されます。これは警告として受け取ってください。
追加情報
皆さん、貴重なコメントをありがとうございます。皆さんのご意見を参考に再度マニュアルを確認してみたところ、確かにディレクトリに実行権限がないとphp-fpmアプリケーションプロセスはこのディレクトリ内にファイルを検索することはできません(実際にはファイルが存在しないものとみなされます)。実行可能ディレクトリが存在しないものとみなされます)。
実行権限を中心にマニュアルの内容を一緒に検討できます。ここでは、読み取りおよび書き込み権限について詳しくは説明しません (一般に、これらは簡単に理解できます)。
マニュアルには、ディレクトリの実行権限について明確な指示が記載されています。ディレクトリに対する実行権限とは、検索される権限を持っていることを意味します。