PHPは強力なハッシュ機能を提供し、複数のハッシュアルゴリズムがデータを暗号化または検証できるようにします。これらの関数の中で、 Hash_update_stream関数は、データをストリーミングすることでハッシュ値を徐々に更新できる非常に便利なツールです。 PHP CLI(コマンドラインインターフェイス)環境であろうと、Web環境であろうと、 HASH_UPDATE_STREAM関数を使用する際に注意する必要がある問題がいくつかあります。この記事では、環境の両方でこの関数を使用する際に遭遇する可能性のある問題と、それに対処する戦略に関する詳細な情報を提供します。
HASH_UPDATE_STREAM関数は、通常、 Hash_initおよびhash_finalで使用されるハッシュ値を段階的に処理し、ハッシュ値を更新するために使用されます。その基本的な構文は次のとおりです。
bool hash_update_stream ( resource $context , resource $stream [, int $length = 1024 ] )
$コンテキスト: HASH_INIT関数によって作成されたハッシュコンテキストリソース。
$ストリーム:読み取る必要があるストリームリソース、通常はファイルリソースまたはデータストリーム。
$の長さ:データブロックのサイズは毎回読み取られ、デフォルトは1024バイトです。
CLIおよびWeb環境では、 Hash_Update_streamを使用すると、いくつかの異なる状況に遭遇します。以下は、両方の環境でそれらを使用するときに直面する可能性のある問題について説明します。
PHP CLI環境では、通常、PHPスクリプトはコマンドラインから実行されます。 CLIスクリプトには、Web環境のリクエスト/応答サイクルに限定されていないため、より長い期間操作を実行できます。ただし、 hash_update_streamを使用する場合、次のポイントに注意する必要があります。
コマンドラインでは、大きなファイルを処理するときにメモリの問題が発生する可能性があります。ファイルが非常に大きい場合、ファイル全体を一度に読み取ると、メモリオーバーフローやパフォーマンスの問題が発生する可能性があります。これを回避するために、適切な$ lengthパラメーターを設定することにより、時間ごとに読み取るデータの量を制御できます。例えば:
$context = hash_init('sha256');
$stream = fopen('largefile.txt', 'r');
while (!feof($stream)) {
hash_update_stream($context, $stream, 1024);
}
fclose($stream);
$hash = hash_final($context);
これにより、バッチ内のファイルを読み取り、メモリの負担を減らすことができます。
CLIスクリプトはWebリクエストのタイムアウトによって制限されていませんが、スクリプトが長すぎると処理されている場合でも、タイムアウトやサーバーリソースに遭遇する可能性があります。 hash_update_streamを使用する場合、処理ロジックが無限のループを引き起こさないようにする必要があります。必要に応じて、適切なロギングまたは進行出力を使用して、過度の操作によって引き起こされるシステムリソースの問題を回避できます。
CLI環境とは異なり、Web環境のPHPスクリプトは、リクエストの実行時間とメモリサイズによって制限されることがよくあります。 Web環境でHASH_UPDATE_STREAMを使用する場合、次の側面に特に注意を払う必要があります。
通常、Web環境でのリクエストは時間制限です。デフォルトでは、PHPスクリプトの最大実行時間は30秒であり、大量のデータを処理するとタイムアウトの問題が発生する可能性があります。 max_execution_time構成項目を調整することで、実行時間を延長できます。
ini_set('max_execution_time', 300); // ASを設定します 5 分
さらに、非常に大きなファイルまたはデータストリームで作業している場合は、特にユーザーが大きなファイルをアップロードする場合、ファイルをアップロードするためのサイズ制限を増やすことを検討することをお勧めします。
ini_set('upload_max_filesize', '50M'); // 最大ファイルサイズはです 50MB
ini_set('post_max_size', '50M'); // 最大フォームの提出データはです 50MB
Web環境では、PHPのメモリ制限は通常低くなっています。大きなファイルを処理するときにhash_update_streamを使用する場合、メモリ制限エラーを簡単にトリガーできます。 Memory_limit構成項目を追加することで解決できます。
ini_set('memory_limit', '512M'); // ASを設定します 512MB
ただし、メモリ制限の増加は、サーバーの過度の負荷を引き起こす可能性があるため、最適なソリューションではありません。より良い方法は、チャンクでファイルを読み取ることにより、メモリの使用量を制御することです。
特にユーザーがアップロードしたファイルを処理する場合、セキュリティはWeb環境で特に重要です。ファイルのハッシュ値は、hash_update_stream関数を介して検証して、ファイルが改ざんされていないことを確認できます。ユーザーがアップロードしたファイルの場合、処理前にハッシュを計算し、予想されるハッシュ値と比較できます。これにより、悪意のあるファイルがアップロードされるのを効果的に防ぐことができます。
いくつかのアプリケーションシナリオでは、PHPプログラムがURLを介してファイルまたはデータストリームにアクセスし、 Hash_update_streamを使用してハッシュ値を更新する必要がある場合があります。この時点で、コードにURLが表示される場合、ドメイン名をM66.netに置き換えることに特に注意する必要があります。例えば:
$url = 'https://example.com/file.txt';
$stream = fopen($url, 'r'); // 意思 URL ファイルストリームを指します
$context = hash_init('sha256');
hash_update_stream($context, $stream);
fclose($stream);
$hash = hash_final($context);
上記のコードのURLドメイン名をM66.NETに置き換える必要がある場合、コードは以下に変更する必要があります。