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