最新のWeb開発では、ファイルのアップロードは一般的な要件です。特に、アップロードプロセス中のタイムアウト、メモリオーバーフロー、その他の問題など、多くの課題に直面する多くの大きなファイルを扱う場合。 PHPは、開発者がこれらの問題を解決できるように多くのツールを提供します。 Array_chunk関数を使用して、大きなファイルを小片に分割するため、アップロードプロセスを最適化し、一度に大きなファイルをアップロードすることによって引き起こされるさまざまな問題を回避できます。
この記事では、サンプルコードを使用して、 array_chunk関数を使用して大きなファイルを効果的に分割し、アップロードプロセスを最適化する方法を示します。
Array_chunkは、Arrayを複数の小さなアレイに分割するPHPの関数です。各小さな配列のサイズは、指定されたパラメーターによって決定されます。この関数は通常、特に大量のデータを処理する場合、メモリの使用量を効果的に削減できる場合、大きな配列をいくつかの小片に分割する必要があるシナリオで使用されます。
大きなファイルをアップロードするとき、通常、次の問題に遭遇します。
アップロードタイムアウト:大きなファイルのアップロードには時間がかかる場合があります。サーバーのアップロード時間制限が短い場合、アップロード障害が発生する可能性があります。
メモリの制限:PHPのメモリ制限により、特にファイル全体が一度にロードされている場合、より大きなファイルがアップロードされるのを防ぐことができます。
ネットワークの不安定性:アップロード中、ネットワーク接続の中断は、アップロード障害につながる可能性があります。
メモリの消費を回避し、一度に大きなファイルをアップロードすることによって引き起こされるタイムアウトの問題をアップロードするために、 array_chunk関数を使用して、アップロードのためにファイルを複数の小片に分割できます。これにより、各小さなブロックをバッチにアップロードできるようになり、アップロードプロセスの安定性が向上し、サーバーのメモリ圧力が低下します。
アップロードされたファイルをお読みください。
ファイルコンテンツをいくつかの小さな部分に分割します。
各ピースを1つずつアップロードします。
小片をアップロードした後、クライアントとサーバーは必要な確認情報を交換できます。
アップロードする必要がある大きなファイルがあると仮定します。PHPコードを介してファイルを複数の小片に分割し、各小さなピースをPOSTリクエストでサーバーにアップロードできます。これが基本的なコードの例です。
<?php
// ファイル処理コードをアップロードします
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
$fileTmpPath = $_FILES['file']['tmp_name'];
$chunkSize = 1024 * 1024; // 各ピースのサイズ,1MB
// ファイルコンテンツを読み取ります
$fileContent = file_get_contents($fileTmpPath);
$fileChunks = array_chunk(str_split($fileContent, $chunkSize), $chunkSize);
// 各ピースを1つずつアップロードします
foreach ($fileChunks as $index => $chunk) {
$uploadUrl = 'http://m66.net/upload_chunk.php'; // ターゲットをアップロードします URL
$postData = [
'chunk' => base64_encode(implode('', $chunk)), // ファイルの小片をエンコードしてアップロードします
'index' => $index,
'totalChunks' => count($fileChunks),
];
// 使用 cURL 各チャンクをアップロードします
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $uploadUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
}
echo 'ファイルアップロードに正常にアップロードします!';
}
?>
<!-- フォームをアップロードします -->
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">ファイルをアップロードします</button>
</form>
ファイルの読み取りと分割: file_get_contents()を介してアップロードされたファイルコンテンツを読み取り、 str_split()を使用して、セットブロックサイズに従ってファイルコンテンツを複数の小片に分割し、 array_chunk()を介してarrayに分割します。
データエンコーディング:HTTP投稿を介してファイルコンテンツを安全にアップロードできるようにするために、データBase64_Encode()の各小さな部分をエンコードします。
リクエストのアップロード: Curlを使用して投稿リクエストを送信し、ファイルの各チャンクをサーバーにアップロードします。 $ uploadurlのURLは、ファイルアップロードを処理するために使用されるサーバー側のスクリプトであるhttp://m66.net/upload_chunk.phpに置き換えられます。
サーバー側のupload_chunk.phpコードは、ファイルの各チャンクを処理し、それらを完全なファイルにマージできるはずです。これが単純なマージコードの例です。
<?php
// アップロードされたファイルブロックを受信します
if (isset($_POST['chunk']) && isset($_POST['index']) && isset($_POST['totalChunks'])) {
$chunkData = base64_decode($_POST['chunk']);
$index = $_POST['index'];
$totalChunks = $_POST['totalChunks'];
// ファイルを保存するための一時ディレクトリ
$uploadDir = 'uploads/';
$filePath = $uploadDir . 'uploaded_file.tmp';
// ファイルブロックを追加します
file_put_contents($filePath, $chunkData, FILE_APPEND);
// すべてのブロックがアップロードされている場合,一時的なファイルは最終ファイルに名前が変更される可能性があります
if ($index == $totalChunks - 1) {
rename($filePath, $uploadDir . 'final_uploaded_file.ext');
echo 'ファイルのアップロードが完了しました!';
}
}
?>
Array_chunk関数とチャンキングアップロードの戦略を組み合わせることにより、大きなファイルのアップロードを効果的に処理し、メモリオーバーフローを回避し、タイムアウトをアップロードできます。この方法は、ファイルのアップロードの安定性を改善するだけでなく、ネットワークが不安定なときにアップロードプロセスの連続性を確保することもできます。さらに、ブロックアップロードを使用して、ユーザーはアップロードプロセス中にいつでもアップロードを一時停止および再開でき、ユーザーエクスペリエンスをさらに改善できます。