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 发送多个文件而不将它们加载到内存中?
我终于成功地通过改变来完成这项工作
'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)
通过此更改,文件不会加载到内存中,我能够发送更大的文件