PHPでは、 Stream_Get_Meta_Data()関数は通常、ファイルストリームのメタデータを取得するために使用されます。ファイルストリームは、ストリームの状態、オフセット、ファイルポインターの位置など、ファイルストリームに関する詳細な情報を提供できます。この関数を使用して、開発者は、特にファイルを処理する場合、現在のファイルストリームがどこに読まれるかを簡単に確認できます。ファイルのポインター位置を理解することで、ファイルの読み取りと書き込みをより効率的に制御できます。
Stream_get_meta_data()関数は、ファイルストリームのメタデータを返すことができます。この情報には、ファイルストリームのステータス、オープニングモード、現在の読み取り場所などが含まれます。その構文は次のとおりです。
<span><span><span class="hljs-title function_ invoke__">stream_get_meta_data</span></span><span>(resource </span><span><span class="hljs-variable">$stream</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>$ストリーム:有効なファイルストリームリソースである必要があります。
次のような、ファイルストリームの関連するメタデータを含む配列を返します。
timed_out :ストリーム操作がタイムアウトした場合はtrueを返します。
ブロック:ストリームがブロックされている場合はtrueを返します。
EOF :ストリームがファイルの終了に達した場合、 trueを返します。
unread_bytes :現在のストリームで読み取られていないバイト数。
シーク可能:ファイル内の特定の場所にジャンプできるかどうか。
URI :ファイルのURI。
モード:ファイルストリームのオープンモード(たとえば、 R 、 Wなど)。
Stream_Type :ストリームのタイプ、通常はストリーム。
wrapper_data :ラッパーのデータ(ある場合)。
wrapper_type :ストリームのラッパータイプ(ある場合)。
ファイルストリームの読み取り場所は、返されたメタデータでunread_bytesまたは模索可能な情報をチェックすることで学習できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ファイルストリームを開きます</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-comment">// ファイルストリームのメタデータを確認してください</span></span><span>
</span><span><span class="hljs-variable">$metaData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_get_meta_data</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-comment">// ファイルポインターの場所を取得します</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ファイルストリームは現在読みやすいですか?: "</span></span><span> . (</span><span><span class="hljs-variable">$metaData</span></span><span>[</span><span><span class="hljs-string">'seekable'</span></span><span>] ? </span><span><span class="hljs-string">'はい'</span></span><span> : </span><span><span class="hljs-string">'いいえ'</span></span><span>) . PHP_EOL;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ファイルストリームで読み取られていないバイト数: "</span></span><span> . </span><span><span class="hljs-variable">$metaData</span></span><span>[</span><span><span class="hljs-string">'unread_bytes'</span></span><span>] . PHP_EOL;
</span><span><span class="hljs-comment">// ファイルストリームを閉じます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Stream_get_meta_data()を介してストリームステータス情報を取得することに加えて、PHPの組み込み関数ftell()を介して現在のファイルポインターの場所を取得することもできます。 ftell()関数は、バイト単位の現在の読み取り位置のオフセットを返します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ファイルを開きます</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-comment">// いくつかのコンテンツを読んでください</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-comment">// 現在のファイルポインターの場所を取得します</span></span><span>
</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftell</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"現在のファイルポインターの場所: "</span></span><span> . </span><span><span class="hljs-variable">$position</span></span><span> . </span><span><span class="hljs-string">" バイト"</span></span><span> . PHP_EOL;
</span><span><span class="hljs-comment">// ファイルを閉じます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>大きなファイルを使用する場合、ファイルの読み取りの進捗をリアルタイムで追跡する必要がある場合があります。たとえば、大きなファイルをインポートする場合、 Stream_get_meta_data()を使用してファイルポインターの場所を取得し、進行状況バーを動的に表示できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 大きなファイルを開きます</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-comment">// 获取文件的总バイト数</span></span><span>
</span><span><span class="hljs-variable">$fileSize</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filesize</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>);
</span><span><span class="hljs-comment">// 初始化读取的バイト数</span></span><span>
</span><span><span class="hljs-variable">$readBytes</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-comment">// 行ごとにファイルをお読みください</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-comment">// 更新已读取的バイト数</span></span><span>
</span><span><span class="hljs-variable">$readBytes</span></span><span> += </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$line</span></span><span>);
</span><span><span class="hljs-comment">// 進捗を計算します</span></span><span>
</span><span><span class="hljs-variable">$progress</span></span><span> = (</span><span><span class="hljs-variable">$readBytes</span></span><span> / </span><span><span class="hljs-variable">$fileSize</span></span><span>) * </span><span><span class="hljs-number">100</span></span><span>;
</span><span><span class="hljs-comment">// 進捗状況を示します</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"進捗状況を読んでください: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">round</span></span><span>(</span><span><span class="hljs-variable">$progress</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>) . </span><span><span class="hljs-string">"%\r"</span></span><span>;
}
</span><span><span class="hljs-comment">// ファイルを閉じます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>時には、ファイルが読み取るときにファイルが終了に達したかどうかを判断する必要があります。 stream_get_meta_data()によって返されたEOF情報を使用して、ファイルが完全に読み取られているかどうかを簡単に判断します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ファイルストリームを開きます</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-comment">// 行ごとにファイルをお読みください直到文件末尾</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$line</span></span><span>;
}
</span><span><span class="hljs-comment">// ファイルストリームメタデータを取得します</span></span><span>
</span><span><span class="hljs-variable">$metaData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_get_meta_data</span></span><span>(</span><span><span class="hljs-variable">$file</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-variable">$metaData</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>]) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ファイルは最後まで読み取られました"</span></span><span> . PHP_EOL;
}
</span><span><span class="hljs-comment">// ファイルを閉じます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Stream_get_meta_data()は、特にファイルストリームを扱う場合、非常に便利なツールです。それを通じて、開発者はファイルストリームのステータスを確認するだけでなく、ファイルポインターの場所とファイルストリームが読み取られるかどうかをさらに監視できます。他のファイル操作関数( ftell()やfseek()など)と組み合わせることで、ファイルの読み取り操作をより効率的に制御できます。これは、大きなファイルを処理するときに特に役立ちます。