要使用 PHP 和 Guzzle 实现远程文件的流式传输,可以有效地处理大文件而不会占用过多的服务器内存。以下是详细的步骤和示例代码:
首先,确保你已经安装了 Guzzle。你可以使用 Composer 来安装:
composer require guzzlehttp/guzzle
下面是一个示例代码,展示如何使用 Guzzle 从远程服务器流式下载文件并将其输出到客户端:
<?php
require 'vendor/autoload.php'; // 引入 Composer 的自动加载器
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
// 远程文件的URL
$remoteFileUrl = 'https://example.com/largefile.zip';
// 客户端配置
$client = new Client([
'timeout' => 0, // 设置为0表示不超时
'headers' => [
'User-Agent' => 'MyCustomUserAgent/1.0', // 可选:自定义用户代理
],
]);
try {
// 发起GET请求,并启用流式响应
$response = $client->get($remoteFileUrl, [
'stream' => true, // 启用流式响应
]);
// 获取响应头中的内容类型和内容长度(可选)
$contentType = $response->getHeaderLine('Content-Type');
$contentLength = $response->getHeaderLine('Content-Length');
// 设置适当的响应头,以便浏览器识别并处理文件
header("Content-Type: $contentType");
if ($contentLength) {
header("Content-Length: $contentLength");
}
header('Content-Disposition: attachment; filename="' . basename(parse_url($remoteFileUrl, PHP_URL_PATH)) . '"');
// 获取流资源
$body = $response->getBody();
// 设置适当的缓冲区大小(例如1MB)
$chunkSize = 1024 * 1024;
// 逐块读取并输出数据
while (!$body->eof()) {
echo $body->read($chunkSize);
// 可选:刷新输出缓冲区
flush();
if (connection_status() != 0) {
// 如果连接中断,停止传输
break;
}
}
} catch (RequestException $e) {
// 处理请求异常
if ($e->hasResponse()) {
echo 'Error: ' . $e->getResponse()->getBody();
} else {
echo 'Error: ' . $e->getMessage();
}
}
require 'vendor/autoload.php';
引入 Composer 的自动加载器。use
语句引入 Guzzle 的 Client
和 RequestException
类。Client
实例,可以设置超时时间、自定义头部等。$client->get($remoteFileUrl, ['stream' => true]);
发起 GET 请求,并启用流式响应。Content-Type
和 Content-Length
设置适当的响应头,以便浏览器正确处理下载。Content-Disposition
指示浏览器以附件形式下载文件,并设置文件名。$body = $response->getBody();
。flush()
将输出缓冲区的内容发送到客户端。try-catch
块捕获可能的请求异常,并根据情况输出错误信息。没有搜到相关的文章