プラットフォーム全体でPHPアプリケーションを開発する場合、開発者は多くの場合、オペレーティングシステムの基礎となるファイルパスルールの違いを無視し、ファイルパスを解析するために使用される関数であるPathInfo()も、システムの違いにより異なるパフォーマンスを発揮する場合があります。 PHP自体はクロスプラットフォーム言語として設計されていますが、ファイルパスの処理時にはWindowsとLinuxの違いの詳細が必要です。この記事では、WindowsおよびLinuxシステムでPathInfo()を使用するときに発生する可能性のあるパフォーマンスの違いと互換性の問題を調べます。
PathInfo()は、パス文字列を解析し、ディレクトリ名、ベースファイル名、拡張機能などのファイルパスのコンポーネントを返すPHPの組み込み関数です。基本的な使用法は次のとおりです。
<span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">pathinfo</span></span><span>(</span><span><span class="hljs-string">'/path/to/file.txt'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$info</span></span><span>);
</span></span>
出力結果:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[dirname] => /path/to
[basename] => file.txt
[extension] => txt
[filename] => file
)
</span></span>
WindowsはBackSlash \をPath Separatorとして使用し、LinuxはForward Slash /を使用します。 PHPは、ほとんどの機能でこれらのセパレータを自動的に認識して処理しますが、 PathInfo()が異なる動作を引き起こす可能性のある詳細がまだあります。
PHPは通常、パスを解析するときにこれら2つのセパレータを自動的に適応させます。例えば:
<span><span><span class="hljs-variable">$windowsPath</span></span><span> = </span><span><span class="hljs-string">'C:\Users\Public\file.txt'</span></span><span>;
</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">pathinfo</span></span><span>(</span><span><span class="hljs-variable">$windowsPath</span></span><span>);
</span></span>
\を使用している場合でも、PHPはほとんどの環境でパスを正しく解析できます。ただし、 Windowsの下の\はエスケープキャラクターであるため、コード内の「C:\\ users \\ public \\ file.txt」として記述する必要があります。そうしないと、予期しない動作につながる可能性があります。
Linuxシステムの上記のパス(パスが存在する場合)を処理することも正常に解決できますが、LinuxのWindows形式のパスで通過することは論理的に推奨されません。
Linuxのルートパスは/var/www/html/index.phpのようなもので、そのルートディレクトリは/です。 Windowsでは、パスには通常、 C:\ xampp \ htdocs \ index.phpなどのドライブレターがあります。
Windowsでは、 pathinfo()はドライブ文字を含むパスを正しく処理できますが、返されたdirNameにはドライブレターパーツが含まれます。
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[dirname] => </span><span><span class="hljs-attr">C</span></span><span>:\xampp\htdocs
[basename] => index.php
[extension] => php
[filename] => index
)
</span></span>
Linuxでは、ドライブ文字がなく、パスはよりシンプルです。
Windowsファイルシステムは多くの場合、UTF-16エンコーディングを使用しますが、Linuxは通常UTF-8を使用します。ほとんどの最新のPHP環境では、 pathinfo()はファイル名で非ASCII文字をサポートしますが、以前のバージョンまたは誤って構成されたシステムでは、文字化けまたは不完全な解析が発生する可能性があります。
オペレーティングシステム、PHP、および編集者が、多言語パスに関しては、均一なエンコーディング、できればUTF-8を使用するようにすることをお勧めします。
別の一般的なトラップは、パスの終わりにあります:
<span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">pathinfo</span></span><span>(</span><span><span class="hljs-string">'/var/www/html/'</span></span><span>);
</span></span>
この時点で返された結果はDIRNAMEです。端がディレクトリのように見えるため、PHPはファイルパスとは見なされず、ベースネームと他のフィールドが欠落している可能性があります。これは異なるオペレーティングシステムで一貫して実行されますが、パスを動的にスプライシングすると、特にWindowsでエラーが発生することがよくあります。
<span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">'C:\\xampp\\htdocs\\'</span></span><span>; </span><span><span class="hljs-comment">// テールバックスラッシュに注意してください</span></span><span>
</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">pathinfo</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>); </span><span><span class="hljs-comment">// 分析結果は不完全な場合があります</span></span><span>
</span></span>
したがって、 pathinfo()を呼び出す前に、パスがディレクトリパスではなく特定のファイルであることを確認する必要があります。
統合されたパス形式:Windowsでも機能するフォワードスラッシュ/を使用してみてください。 PHPは、システム適応形式に自動的に変換されます。
RealPath()を使用してPrecess Paths : RealPath()は絶対パスを返し、形式を正規化します。これにより、互換性が向上します。
パスエンドデリミッターの誤用を防ぐ: pathinfo()を通過する前に、 rtrim()を使用してend /または\を削除できます。
コーディングの均一性に注意してください:パス文字列がUTF-8エンコーディングの下で処理されていることを確認して、コードの問題を避けてください。
クロスプラットフォーム環境でのテストパス関連コード:開発中のあるシステムでの作業や、展開中に別のシステムの問題を避けてください。
pathinfo()は、PHPの関数であり、単純に見えるが、クロスプラットフォーム環境では問題が発生しやすい。ほとんどの場合、さまざまなシステムのパス形式に自動的に適応することができますが、開発者は「インテリジェント」処理に完全に依存することはできません。より堅牢でポータブルなPHPプログラムを作成するために、パス入力を積極的に標準化し、基礎となるファイルシステムの違いを理解する必要があります。