gpt4 book ai didi

symfony - Symfony 上的批量请求

转载 作者:行者123 更新时间:2023-12-04 15:08:26 27 4
gpt4 key购买 nike

我正在尝试重现 facebook batch requests 的行为在他们的图形 api 上运行。

所以我认为最简单的解决方案是在 Controller 上向我的应用程序发出几个请求,例如:

public function batchAction (Request $request)
{
$requests = $request->all();
$responses = [];

foreach ($requests as $req) {
$response = $this->get('some_http_client')
->request($req['method'],$req['relative_url'],$req['options']);

$responses[] = [
'method' => $req['method'],
'url' => $req['url'],
'code' => $response->getCode(),
'headers' => $response->getHeaders(),
'body' => $response->getContent()
]
}

return new JsonResponse($responses)
}

所以有了这个解决方案,我认为我的功能测试将是绿色的。

但是,我填充喜欢初始化服务容器 X 次可能会使应用程序变慢。因为对于每个请求,每个包都被构建,服务容器每次都被重建等等......

你看到我的问题的任何其他解决方案吗?

换句话说,我是否需要向我的服务器发出完整的新 HTTP 请求才能从我的应用程序中的其他 Controller 获得响应?

预先感谢您的建议!

最佳答案

Symfony 在内部使用 http_kernel 处理请求成分。因此,您可以为要执行的每个批处理操作模拟一个请求,然后将其传递给 http_kernel组件,然后详细说明结果。

考虑这个示例 Controller :

/**
* @Route("/batchAction", name="batchAction")
*/
public function batchAction()
{
// Simulate a batch request of existing route
$requests = [
[
'method' => 'GET',
'relative_url' => '/b',
'options' => 'a=b&cd',
],
[
'method' => 'GET',
'relative_url' => '/c',
'options' => 'a=b&cd',
],
];

$kernel = $this->get('http_kernel');

$responses = [];
foreach($requests as $aRequest){

// Construct a query params. Is only an example i don't know your input
$options=[];
parse_str($aRequest['options'], $options);

// Construct a new request object for each batch request
$req = Request::create(
$aRequest['relative_url'],
$aRequest['method'],
$options
);
// process the request
// TODO handle exception
$response = $kernel->handle($req);

$responses[] = [
'method' => $aRequest['method'],
'url' => $aRequest['relative_url'],
'code' => $response->getStatusCode(),
'headers' => $response->headers,
'body' => $response->getContent()
];
}
return new JsonResponse($responses);
}

使用以下 Controller 方法:
/**
* @Route("/a", name="route_a_")
*/
public function aAction(Request $request)
{
return new Response('A');
}

/**
* @Route("/b", name="route_b_")
*/
public function bAction(Request $request)
{
return new Response('B');
}

/**
* @Route("/c", name="route_c_")
*/
public function cAction(Request $request)
{
return new Response('C');
}

请求的输出将是:
[
{"method":"GET","url":"\/b","code":200,"headers":{},"body":"B"},
{"method":"GET","url":"\/c","code":200,"headers":{},"body":"C"}
]

PS:我希望我已经正确理解你需要什么。

关于symfony - Symfony 上的批量请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40767234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com