はじめに
今日は問題を見つけたので共有します。プロセス全体を説明しましょう。
問題
会社には、smarty に基づいて書かれたフレームワークがあります。私は、メンテナンス スタッフが新しい環境をデプロイした後、私のところに来て、頻繁にエラー (エラー) を報告しました。 : プロンプトが見つかりません) ファイル)。
コードを追跡したところ、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. ファイルの上位ディレクトリに書き込み権限のみが与えられている場合、ファイルは存在しません。読み取り権限のみが与えられている場合、ファイルは存在しません
3 、すべての上位レベルのディレクトリに実行権限がある場合、報告されたファイルは存在し、すべてが正常です。
その結果、file_exists()はファイルの存在を判定する際に、各ディレクトリに実行権限があるかどうかを再帰的に判定していることがわかります。
ファイル パスを相対パスに変更しても、同じ結果が得られます。
概要
PHP マニュアルには、file_exists がディレクトリの実行権限の影響を受けるという記述はありません。この記事は、この問題を抱えている開発者に情報を提供するために使用されます。これは警告として受け取ってください。
追加情報
皆さん、コメントをありがとうございます。とても役に立ちます。皆さんのご意見を参考に改めてマニュアルを確認してみたところ、確かにディレクトリに実行権限がないとphp-fpmアプリケーションプロセスはこのディレクトリにアクセスしてファイルを検索することはできません、当然ファイルが存在しないものとみなされます。 (実際には実行可能ディレクトリは存在しないと考えられます)。
実行権限を中心にマニュアルの内容を一緒に検討していただけます。ここでは、読み取りおよび書き込み権限については詳しく説明しません (一般に、これらは簡単に理解できます)。
明らかにマニュアルには、ディレクトリの実行許可について明確な指示があります。ディレクトリに対する実行権限とは、検索される権限を持っていることを意味します。