如何使用 Guzzle 发送文件而不将其加载到内存中

lju*_*adr 5 php laravel guzzle guzzle6

我有一个表单,可以将多个文件上传到我的 laravel 后端,并且我想使用 Guzzle 将所有这些文件发送到外部 API

我遇到一个问题,如果我上传的 MB 数超过可用内存,我的脚本就会耗尽内存。错误信息是

允许的内存大小...字节已耗尽(尝试分配...字节)

不幸的是,我无法动态更改内存限制

这是我使用的代码

// in laravel controller method

/* @var \Illuminate\Http\Request $request */
$files = $request->allFiles();

$filesPayload = [];

foreach ($files as $key => $file) {
    $filesPayload[] = [
        'name'     => $key,
        'contents' => file_get_contents($file->path()),
        // 'contents' => fopen($file->path(), 'r'), // memory issue as well
        'filename' => $file->getClientOriginalName(),
    ];
}

$client = new \GuzzleHttp\Client\Client([
    'base_uri' => '...',
]);

$response = $client->post('...', [
    'headers' => [
        'Accept'         => 'application/json',
        'Content-Length' => ''
    ],
    'multipart' =>  $filesPayload,
]);
Run Code Online (Sandbox Code Playgroud)

我正在使用 Guzzle 6。在文档中我找到了示例fopen,但这也引发了内存错误

有没有办法使用 Guzzle 发送多个文件而不将它们加载到内存中?

lju*_*adr 4

我终于成功地通过改变来完成这项工作

'contents' => file_get_contents($file->path()),
Run Code Online (Sandbox Code Playgroud)

'contents' => \GuzzleHttp\Psr7\stream_for(fopen($file->path(), 'r'))
Run Code Online (Sandbox Code Playgroud)

通过此更改,文件不会加载到内存中,我能够发送更大的文件