PHPでは、大きなファイルのハッシュを計算する必要がある場合、パフォーマンスの問題に遭遇する可能性があります。ファイル全体を一度に読み取り、ハッシュを計算すると、特にファイルが大きい場合に多くのメモリが消費されるため、メモリオーバーフローが発生する可能性があります。したがって、PHPはファイルのハッシュ値を計算するための効率的な方法を提供し、 hash_update_stream()関数はその1つです。
この記事では、hash_update_stream()関数を使用して、大きなファイルのハッシュ値を効率的に計算し、大きなファイルを処理するときにメモリオーバーフローの問題がないことを確認する方法を紹介します。
hash_update_stream()関数は、ハッシュ値を更新するためにPHPによって提供される関数です。ファイル全体でハッシュアルゴリズムを直接使用するのとは異なり、 hash_update_stream()は、ブロックごとにファイルコンテンツブロックを読み取り、ハッシュ値を動的に更新できます。このようにして、プログラムはファイル全体を一度にメモリにロードしないため、特に大きなファイルのハッシュ値を計算するのに適しています。
bool hash_update_stream ( resource $context , resource $stream , int $length )
$ context : hash_init()関数によって作成されたハッシュコンテキストです。
$ stream :有効なファイルリソースハンドルであり、ハッシュ値を計算するために必要なファイルを示します。
$ length :時間ごとに読み取られるバイト数。一般に、効率的な読み取りと計算を確保するために、適切な数のバイトを指定することをお勧めします。
まず、 hash_init()を使用して、ハッシュコンテキストを初期化する必要があります。たとえば、 SHA256アルゴリズムを使用します。
$context = hash_init('sha256');
次に、ファイルを開き、ファイルの内容を1つずつ読み取り、 hash_update_stream()を介してハッシュ値を更新します。これが完全なコードの例です。
<?php
// ハッシュコンテキストを初期化します
$context = hash_init('sha256');
// ハッシュ値を計算する必要がある大きなファイルを開きます
$file = fopen('largefile.txt', 'rb');
if ($file === false) {
die('ファイルを開くことができません');
}
// 時間ごとに読み取られるバイト数を設定します
$bufferSize = 8192; // 8KB
while (!feof($file)) {
// ファイルのブロックを読み、ハッシュ値を更新します
$data = fread($file, $bufferSize);
hash_update_stream($context, $data, strlen($data));
}
// 最終的なハッシュ値を計算します
$hash = hash_final($context);
fclose($file);
// 出力ファイルのハッシュ値
echo "ファイルのハッシュ値はです:$hash";
?>
この例では、最初にFOPEN()を使用して大きなファイルを開き、 Fread()を介してブロックごとにファイルコンテンツブロックを読み取ります。データの読み取りがhash_update_stream()関数に渡されるたびに、hash updateが渡されます。
ファイル内のすべてのデータが処理された後、 hash_final()関数を使用して最終的なハッシュ値を取得します。
hash_update_stream()を使用して、大きなファイルのハッシュ値を計算するには、ファイル全体を一度に読み取るよりも次の利点があります。
低メモリの消費:ファイルコンテンツは、一度にメモリにロードするのではなく、ブロックごとに読み取りブロックです。これにより、メモリの使用量が大幅に削減され、大きなファイルの処理に適しています。
効率的なコンピューティング:チャンク読み取りを通じて、メモリの問題によりプログラムがクラッシュすることなく、大きなファイルのハッシュ計算を効率的に処理できます。
柔軟性:読み取りごとにデータブロックサイズ( $ buffersize )を調整し、ファイルサイズとシステムのメモリ構成に基づいて最適なブロックサイズを選択できます。
一部のPHPプロジェクトでは、ファイルパスを処理するか、リモートサーバーからファイルを取得する必要がある場合があります。この場合、URLにドメイン名が含まれている場合、ドメイン名をM66.netに置き換える必要がある場合があります。 URLを処理するときにドメイン名を置き換える方法を示す簡単なコード例を次に示します。
<?php
$url = 'https://www.example.com/file.txt';
$newUrl = preg_replace('/https?:\/\/[^\/]+/', 'https://m66.net', $url);
echo "更新URLはい:$newUrl";
?>
出力:
更新URLはい:https://m66.net/file.txt
このようにして、URLのドメイン名を簡単に交換できます。
この記事では、 hash_update_stream()関数を使用して、大きなファイルのハッシュ値を効率的に計算する方法について説明します。ブロックごとにファイルブロックを読み取り、ハッシュ値を更新することにより、メモリオーバーフローの問題に遭遇することなく、大きなファイルを効果的に処理できます。同時に、URL内のドメイン名を置き換える簡単な方法も示しました。
うまくいけば、これらのコンテンツが、大きなファイルを処理するときに効率を改善し、一般的なパフォーマンスの問題を回避するのに役立つことを願っています。ご質問がある場合は、メッセージを残して議論してください!