Stream_is_local()は、指定されたストリームがローカルファイルシステムのファイルを指しているかどうかを決定するPHPビルトイン関数です。関数の署名は次のとおりです。
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span>)
</span></span>
パラメーター: $ filenameはチェックするファイル名であり、ファイルパスまたはURLにすることができます。
return値:特定のストリームがローカルファイルである場合、 trueを返し、それ以外の場合はfalse 。
この関数は、ローカルファイルをリモートファイル(FTPまたはHTTP経由でアクセスしたファイルなど)と区別するためによく使用されます。ファイル操作を実行する前に、ローカルファイルが操作されていることを確認してください。
Stream_is_local()は非常に単純な機能ですが、実際の開発では、パス形式が異なる場合が異なる場合に予期しない結果につながる可能性があります。以下は、開発者が使用する際に特別な注意を払う必要がある一般的な落とし穴です。
Stream_is_local()が呼び出されると、パスはローカルファイルシステムパスまたはURLになります。プロトコルプレフィックスを備えたパス( http://やftp://など)の場合、 stream_is_local()はパスがローカルファイルシステムを指すかどうかを判断しますが、リモートURLの場合、 falseが返されます。
ポイント: Stream_is_local()は、パス形式に基づいたローカルファイルであるかどうかのみを決定し、プロトコルパーツを無視すると誤って考えることができます。
回避策:着信パスが、リモートURLではなく、正しいローカルファイルパスであることを確認してください。 URLを渡す場合、それを処理し、ニーズに基づいて適切な判断を下す必要があります。
<span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-string">"http://example.com/file.txt"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>)) {
</span><span><span class="hljs-comment">// ここに戻りますfalse</span></span><span>
}
</span></span>
PHPのStream_is_local()関数はTrueのみを返します。これにより、パスがローカルファイルシステムを指している場合、判断エラーが発生する可能性がありますが、パス形式がファイルを含むプロトコルなどの期待を満たしていない場合(たとえば: file:// )。
ピットポイント:ファイル://プロトコルがファイルパスで指定されていない場合、関数は誤った結果を返す場合があります。
回避策:ローカルファイルパスを処理するときは、ファイル://プロトコルを明示的に指定して、関数がローカルファイルを正しく認識できるようにすることをお勧めします。
<span><span><span class="hljs-variable">$localPath</span></span><span> = </span><span><span class="hljs-string">"/var/www/html/test.txt"</span></span><span>; </span><span><span class="hljs-comment">// 戻るかもしれませんfalse</span></span><span>
</span><span><span class="hljs-variable">$localPathWithProtocol</span></span><span> = </span><span><span class="hljs-string">"file://<span class="hljs-subst">$localPath</span></span></span><span>"; </span><span><span class="hljs-comment">// もっと明確です</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-variable">$localPathWithProtocol</span></span><span>)) {
</span><span><span class="hljs-comment">// ここに戻りますtrue</span></span><span>
}
</span></span>
ファイルパスの形式とセパレーターは、オペレーティングシステムが異なります。特にWindowsとUnix-like(Linux、MacOS)システムの間では、パスは異なる方法で処理されます。 Windowsはバックスラッシュ( \ )をパスセパレーターとして使用しますが、UNIXのようなシステムはフォワード( / )を使用します。 Stream_is_local()関数は、オペレーティングシステムのパス形式に基づいて判断されますが、パス形式が正しいことを確認する必要があります。
ピットポイント:Windowsシステムでは、パスにバックスラッシュがある場合があり、 Stream_is_Local()によりローカルファイルを正しく認識しません。
回避策:パス内の区切り文字が現在のオペレーティングシステムと互換性があることを確認するか、 Directory_Separator定数を使用してWindowsシステムに自動的に適応します。
<span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">"C:\\Users\\test\\file.txt"</span></span><span>; </span><span><span class="hljs-comment">// Windowsバックスラッシュパス</span></span><span>
</span><span><span class="hljs-variable">$pathLinux</span></span><span> = </span><span><span class="hljs-string">"/home/user/file.txt"</span></span><span>; </span><span><span class="hljs-comment">// 親切Unixフォワードスラッシュパス</span></span><span>
</span></span>
Stream_is_local()関数には、相対パスと絶対パスを処理するさまざまな方法があります。相対パスを通過している場合、PHPはそれを現在の作業ディレクトリと組み合わせて実際のパスを生成します。これにより、特に異なる実行環境で判断エラーが発生する可能性があります。
ピットポイント:相対パスを使用する場合、 stream_is_local()がローカルファイルを正しく判断できない場合があります。誤った現在の作業ディレクトリに基づいてパスを解決する場合があります。
解決策:可能であれば、常に判断のために絶対的なパスを使用してください。 RealPath()関数を介して相対パスを絶対パスに変換できます。
<span><span><span class="hljs-variable">$relativePath</span></span><span> = </span><span><span class="hljs-string">"./file.txt"</span></span><span>;
</span><span><span class="hljs-variable">$absolutePath</span></span><span> = </span><span><span class="hljs-title function_ invoke__">realpath</span></span><span>(</span><span><span class="hljs-variable">$relativePath</span></span><span>); </span><span><span class="hljs-comment">// 絶対的なパスを取得します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-variable">$absolutePath</span></span><span>)) {
</span><span><span class="hljs-comment">// ローカルファイルを正しく判断します</span></span><span>
}
</span></span>
Stream_is_local()ストリームパスがディレクトリではなくローカルファイルを指すかどうかを決定します。ファイルパスの代わりにディレクトリパスを渡すと、関数はfalseを返します。これにより、ディレクトリがローカルファイルシステムにあるかどうかを確認するシナリオの混乱を引き起こす可能性があります。
ピットポイント:パスがファイルではなくディレクトリを指している場合、 stream_is_local()はfalseを返しますが、これは予想どおりではありません。
回避策: Stream_is_local()を使用する場合、着信パスがディレクトリではなくファイルを指していることを確認してください。ディレクトリを判断する必要がある場合は、 is_dir()などの他の機能を使用できます。
<span><span><span class="hljs-variable">$dirPath</span></span><span> = </span><span><span class="hljs-string">"/var/www/html"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_is_local</span></span><span>(</span><span><span class="hljs-variable">$dirPath</span></span><span>)) {
</span><span><span class="hljs-comment">// ここに戻りますfalse,それはディレクトリだからです</span></span><span>
}
</span></span>