We can't find the internet
Attempting to reconnect
Something went wrong!
Hang in there while we get back on track
When dealing with large files over HTTP in Laravel, you may want to process the data in chunks rather than downloading it all at once. Laravel's HTTP client, powered by Guzzle, provides streaming capabilities that allow efficient memory usage.
By default, Laravelβs HTTP client loads the entire response into memory. To stream data instead, use the stream
option:
use Illuminate\Support\Facades\Http;
$url = 'https://example.com/large-file.zip';
$chunkSize = 1024 * 1024; // 1 MB
$response = Http::withOptions(['stream' => true])->get($url);
if ($response->ok()) {
$stream = $response->toPsrResponse()->getBody();
while (!$stream->eof()) {
$chunk = $stream->read($chunkSize);
echo("Read " . strlen($chunk) . " bytes\n");
}
}
This approach avoids loading the full file into memory, but read($chunkSize)
may return smaller, inconsistent chunks.
To ensure that chunks are always processed in your preferred size (e.g., 1 MB), you can use an internal buffer:
use Illuminate\Support\Facades\Http;
$url = 'https://example.com/large-file.zip';
$chunkSize = 1024 * 1024; // 1 MB
$response = Http::withOptions(['stream' => true])->get($url)->get($url);
if ($response->ok()) {
$stream = $response->toPsrResponse()->getBody();
$buffer = '';
while (!$stream->eof()) {
$buffer .= $stream->read(8192); // Read in 8 KB chunks
while (strlen($buffer) >= $chunkSize) {
$chunk = substr($buffer, 0, $chunkSize);
$buffer = substr($buffer, $chunkSize);
echo("Process " . strlen($chunk) . " bytes\n");
}
}
if (strlen($buffer) > 0) {
echo("Processed final " . strlen($buffer) . " bytes\n");
}
}
Why use a buffer?
- Ensures predictable chunk sizes (e.g., always 1 MB)
- Prevents inefficient small reads
- Optimizes memory usage while streaming
If this post was enjoyable or useful for you, please share it! If you have comments, questions, or feedback, you can email my personal email. To get new posts, subscribe use the RSS feed.