Symfony HttpClient Stream 和 chunk->getContent() 超出正文大小限制
Posted
技术标签:
【中文标题】Symfony HttpClient Stream 和 chunk->getContent() 超出正文大小限制【英文标题】:Symfony HttpClient Stream and chunk->getContent() Body size limit exceeded 【发布时间】:2022-01-04 21:29:54 【问题描述】: 在我的 Symfony 项目中,我创建了一个控制器和一个函数来从站点检索 APi.json 的内容。我正在使用 HttpClient 来获取内容并将其嵌入到项目中的新文件中。
但是当我调用这个函数时,我在写入新文件时出错:
Http2StreamException> Http2StreamException> TransportException 超出体型限制
这个错误来自这段代码:
foreach ($httpClient->stream($response) as $chunk)
fwrite($fileHandler, $chunk->getContent());
我创建了一个 php.ini: memory_limit = '4G' upload_max_filesize = '700M' 最大输入时间 = 300000 post_max_size = '700M'
原始文件只有 242MB,由于内容相当大,所以不想放入新文件中。 如何绕过此异常并允许对新文件进行 fwrite? 提前致谢
public function infoBDD(): Response
//Update le fichier sur le site
$httpClient = HttpClient::create();
$response = $httpClient->request('GET', 'https://mtgjson.com/api/v5/AllPrintings.json');
// Création du fichier
$fileHandler = fopen('../public/BDD/Api.json', 'w');
// Incorporation dans le fichier créé le contenu du fichier uploadé
foreach ($httpClient->stream($response) as $chunk)
fwrite($fileHandler, $chunk->getContent());
//fermeture du fichier créé
fclose($fileHandler);
var_dump('ouverture nouveau fichier');
//Ouverture du fichier voulu
$content = file_get_contents('../public/BDD/Api.json');
$data = json_decode($content, true);
//Vérification si la clé 'data' n'existe pas
if(!array_key_exists('data', $data))
throw new ServiceUnavailableHttpException("La clé 'data' n'existe pas dans le tableau de données récupéré,
la réponse type fournie par l'API a peut-être été modifiée");
//Vérification si la clé 'data' existe
if(array_key_exists('data', $data))
$api = $data['data'];
$this->getTableauData($api);
unlink('../public/BDD/Api.json');
return $this->render('users/index.html.twig', [
'controller_name' => 'UsersController',
'page' => 'Profile'
]);
【问题讨论】:
【参考方案1】:因此,您面临的限制来自 Request 类的 $bodySizeLimit 属性,该属性的默认值来自那里的 const。
但是你可以“解锁”它,就像回购本身中的this example 试图解释的那样
所以基本上,你可以像这样调整你的代码:
public function infoBDD(): Response
// Instantiate the HTTP client
$httpClient = HttpClientBuilder::buildDefault();
$request = new Request('https://mtgjson.com/api/v5/AllPrintings.json');
$request->setBodySizeLimit(242 * 1024 * 1024); // 128 MB
$request->setTransferTimeout(120 * 1000); // 120 seconds
$response = $httpClient->request('GET', 'https://mtgjson.com/api/v5/AllPrintings.json');
//....
【讨论】:
谢谢,我用 Amp/Http/Client 更改了我的代码,没关系以上是关于Symfony HttpClient Stream 和 chunk->getContent() 超出正文大小限制的主要内容,如果未能解决你的问题,请参考以下文章
HttpClient Received an unexpected EOF or 0 bytes from the transport stream
(多张图片打包为Zip返回前端下载) 记NetCore HttpClient.GetStreamAsync()返回只读流,Stream的Length属性不可用,报错的问题。