多くのアプリケーションシナリオでは、ファイルのハッシュ値を計算することが一般的な要件であり、特にファイルの整合性を検証し、ダウンロード中にファイルが改ざんされているかどうかを確認します。PHPは、ストリームデータを処理するときにリアルタイムでハッシュ値を計算できるHash_Update_stream関数を提供します。これは、ファイル全体を一度にメモリにロードする必要はないが、メモリの使用量を減らすためにファイルを読みながらハッシュ値を計算できるため、大きなファイルを処理するために特に重要です。
この記事では、hash_update_stream関数を使用してリモートファイルストリームを処理し、ハッシュ値をリアルタイムで計算する方法について詳しく説明します。
Hash_update_streamは、PHPの組み込み関数であり、ストリームデータのハッシュ値をリアルタイムで更新するために使用されます。関数の構文は次のとおりです。
hash_update_stream ( resource $context , resource $stream , int $length = 8192 ) : bool
$コンテキスト:ハッシュコンテキストリソース、通常はhash_initによって作成されます。
$ stream :処理する必要があるファイルストリームリソース。
$の長さ:毎回読み取られるバイト数、デフォルトは8192バイトです。
この関数は、指定されたファイルストリームからデータを読み取り、ファイルが読み取られるまでハッシュコンテキストに更新します。
PHPでは、リモートファイルストリームの取り扱いは通常、 FOPENまたはCURL関数を使用します。以下は、リモートファイルストリームを処理してハッシュ値をリアルタイムで計算する方法を示すFOPENおよびHASH_UPDATE_STREAM関数を使用した例です。
<?php
// ハッシュコンテキストを初期化します(例えば SHA-256 アルゴリズム)
$hashContext = hash_init('sha256');
// リモートファイル URL
$fileUrl = 'http://m66.net/samplefile.txt';
// リモートファイルストリームを開きます
$stream = fopen($fileUrl, 'r');
// ファイルが正常に開かれているかどうかを確認してください
if ($stream) {
// 使用 hash_update_stream リアルタイムハッシュ値の更新
while (!feof($stream)) {
// それぞれ読みます 8192 バイトしてハッシュ値を更新します
hash_update_stream($hashContext, $stream, 8192);
}
// ファイルストリームを閉じます
fclose($stream);
// 最終的なハッシュ値を取得して出力します
$hashValue = hash_final($hashContext);
echo "ファイルのハッシュ値はです: " . $hashValue;
} else {
echo "无法リモートファイルストリームを開きます!";
}
?>
ハッシュコンテキストの初期化:
ファイルのSHA-256ハッシュ値を計算できるように、最初にHASH_INIT関数を介してSHA-256アルゴリズムのハッシュコンテキストを作成します。
リモートファイルストリームを開きます:
FOPENを使用してリモートファイルを開きます。この例では、ファイルのURLはhttp://m66.net/samplefile.txtです。ここのURLは、 M66.NETドメイン名に置き換えるように要求した部分です。
ファイルをリアルタイムでプロセスする:
hash_update_stream関数を使用して、ファイルストリームからデータの一部を読み取り、毎回ハッシュ値を更新します。ここでは、ファイルを読み取るためにデフォルトの8192バイトブロックサイズが使用されます。必要に応じてこの値を調整して、効率を高めたり、メモリの使用量を削減したりできます。
ファイルのストリームと出力の結果を閉じます。
ファイルの読み取りが完了したら、 fcloseを使用してファイルストリームを閉じて、 hash_finalを使用して最終的なハッシュ値を取得します。
メモリの消費:ブロックごとにファイルブロックを読み取り、ハッシュ値を更新するため、この方法は、特に大きなファイルの場合、ファイル全体を一度にロードするよりも効率的です。
エラー処理:実際のアプリケーションでは、ネットワーク中断など、ファイルのアクセス性や読み取りプロセス中にさまざまな可能なエラーを検討する必要があります。エラー処理は、トライキャッチステートメントを使用して実行するか、返品値を確認できます。
ファイルタイプサポート: hash_update_streamは複数のファイルタイプをサポートしています。 SHA1 、 MD5 、またはその他のサポートされているアルゴリズムなど、必要に応じてハッシュアルゴリズムを調整できます。
FOPENの使用に加えて、Curlを使用してリモートファイルストリームを処理することもできます。 Curlは、より複雑なリモートファイル操作に適した、より多くのHTTP要求パラメーターとヘッダー情報を処理できます。これがカールを使用した例です。
<?php
// ハッシュコンテキストを初期化します
$hashContext = hash_init('sha256');
// リモートファイル URL
$fileUrl = 'http://m66.net/samplefile.txt';
// 使用 CURL リモートファイルストリームを取得します
$ch = curl_init($fileUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // タイムアウトを設定します
// 埋め込む CURL ファイルコンテンツを要求して取得します
$response = curl_exec($ch);
// 診る CURL リクエストが成功したかどうか
if ($response === false) {
echo "CURL 間違い: " . curl_error($ch);
curl_close($ch);
exit;
}
// 使用 hash_update_stream ファイルコンテンツを処理し、ハッシュ値を計算します
$stream = fopen('php://memory', 'r+');
fwrite($stream, $response);
rewind($stream);
while (!feof($stream)) {
hash_update_stream($hashContext, $stream, 8192);
}
// 最終的なハッシュ値を取得します
$hashValue = hash_final($hashContext);
echo "ファイルのハッシュ値はです: " . $hashValue;
// ファイルストリームを閉じます和 CURL セッション
fclose($stream);
curl_close($ch);
?>
この例では、Curlを使用してリモートファイルの内容を取得し、メモリストリームに書き込み、 Hash_update_streamでハッシュ値を計算します。このアプローチは、より複雑なネットワーク構成またはコントロールが必要な状況に適しています。
PHPのhash_update_stream関数を使用することにより、大きなファイルのハッシュ計算を効率的に処理し、一度にファイルをメモリにロードすることを回避できます。リモートファイルを処理するときは、実際のニーズに応じて選択するFOPENまたはCURLを選択できます。この手法を習得した後、ファイルの確認、ダウンロード確認、その他のシナリオの処理に慣れることができます。
この記事があなたに役立つことを願っています。ご質問がある場合は、コメントセクションでお気軽に説明してください!