開発中、多くの場合、大量のデータを処理する必要があります。一度にデータを処理しすぎるには、時間がかかるだけでなく、メモリオーバーフローを引き起こす可能性もあります。パフォーマンスとユーザーエクスペリエンスを向上させるために、ブロック処理を採用できます。 Array_chunkは、PHPに組み込まれた非常に便利な機能であり、大きな配列をいくつかの小さな配列に分割できます。非同期操作と組み合わせることで、チャンク中にプログラムの実行効率を改善できます。
array_chunkは、PHPアレイ関数の1つです。その機能は、大きな配列を複数の小さな配列に分割することです。各小さな配列には、指定された数の要素が含まれています。この機能は、大量のデータが必要な状況に非常に適しており、メモリの使用量を効果的に削減できます。
関数プロトタイプ:
array_chunk(array $array, int $size, bool $preserve_keys = false): array
$ array :チャンクする配列。
$サイズ:各小さな配列のサイズ。
$ preserve_keys :元の配列のキー名を保持するかどうか(デフォルトはfalse )。
1000のデータの配列があり、 Array_chunkを使用して100個の要素を含む10個の小さな配列に分割するとします。
<?php
$data = range(1, 1000); // 生成する1到着1000の配列
$chunkedData = array_chunk($data, 100);
print_r($chunkedData);
?>
出力結果:
Array
(
[0] => Array ( [0] => 1 [1] => 2 ... [99] => 100 )
[1] => Array ( [0] => 101 [1] => 102 ... [99] => 200 )
...
)
このようにして、大きな配列$データを複数の小さなアレイに分割し、各小さな配列には100の要素が含まれます。
array_chunkを使用してビッグデータをブロックした後、非同期操作をさらに組み合わせてパフォーマンスを向上させることができます。非同期操作により、複数のタスクが並行して実行される可能性があるため、ブロッキングを回避できます。非同期操作は多くの方法でPHPで実装できます。その中で最も一般的な方法は、 curl_multi_execまたはPHP Async拡張機能を使用することです。
HTTPリクエストを介して各チャンクのデータを処理すると、元の処理方法は、リクエストを1つずつ開始し、長期的な閉塞につながる可能性があります。非同期リクエストを使用して、バックグラウンドで複数のリクエストを開始し、それにより処理効率を改善できます。
<?php
$data = range(1, 1000); // ビッグデータをシミュレートします
$chunkedData = array_chunk($data, 100); // ブロック処理
// 初期化 cURL multi handle
$mh = curl_multi_init();
// 各リクエストを保存するために使用されるハンドル
$curlHandles = [];
// データの各ブロックを繰り返します,非同期にリクエストを開始します
foreach ($chunkedData as $index => $chunk) {
$url = "http://m66.net/api/process_data"; // 予測API住所
$postData = json_encode(['data' => $chunk]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// に追加着 multi handle 真ん中
curl_multi_add_handle($mh, $ch);
$curlHandles[$index] = $ch;
}
// 非同期リクエストを実行します
do {
$multiExec = curl_multi_exec($mh, $running);
if ($running) {
curl_multi_select($mh);
}
} while ($running);
// 応答コンテンツを取得します
foreach ($curlHandles as $index => $ch) {
$response = curl_multi_getcontent($ch);
echo "Response from chunk {$index}: " . $response . "\n";
// 各リクエストハンドルを閉じます
curl_multi_remove_handle($mh, $ch);
}
// 閉鎖 multi handle
curl_multi_close($mh);
?>
この例では、 curl_multi_execを使用して、非同期リクエストの関数を実装します。各データブロックは、 Curlを介して要求を開始し、並行して処理し、パフォーマンスを大幅に改善します。
待ち時間の短縮:非同期操作は、複数のリクエストを同時に処理でき、1つずつリクエストするときの待ち時間を避けることができます。
効率の向上:I/O集約型操作(HTTPリクエストなど)の場合、非同期操作はシステムリソースを最大限に活用できます。
リソースの使用量を最適化する:チャンクおよび非同期処理により、CPUとネットワーク帯域幅の利用を最適化しながら、メモリオーバーフローの問題を回避します。
エラー処理:非同期操作では、取り扱いエラーが特に重要です。各リクエストの成功と失敗をタイムリーにキャプチャおよび処理できるようにする必要があります。
リソースの制限:非同期操作はパフォーマンスを改善できますが、無制限ではありません。リクエストの数がサーバーの処理能力を超えないことを確認してください。
データの一貫性:非同期処理では、各データブロックの処理順序が最終結果に影響しないことを確認します。
array_chunk関数を使用することにより、ビッグデータをチャンクしてメモリの使用量を減らすことができます。非同期操作( curl_multi_execなど)と組み合わせて、複数のデータブロックを同時に処理し、プログラムのパフォーマンスをさらに向上させることができます。この方法は、大量のデータを処理する場合に特に効果的であり、特に多数のネットワークリクエストまたはI/O操作が必要なシナリオでは、ユーザーエクスペリエンスを大幅に改善できます。