Symfony批处理请求内核执行时间

时间:2018-08-15 10:00:58

标签: php symfony batch-processing

我正在尝试使用命令行工具和http_kernel组件执行批量操作。

我已将请求存储在数据库中,并使用命令通过为每个请求调用$kernel->handle($request);来在内部使用控制器。

问题在于,每个请求的执行时间都随着时间而增长。

此命令已在测试环境中运行,我确信在生产服务器上执行速度会更快。

编辑:我大约有10.000个请求要执行,所有这些请求都非常相似

但是,我想知道是否可以进行优化以确保整个批次的稳定的执行时间

这是我的代码:

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

foreach ($requests as $request) {

        $start = round(microtime(true) * 1000);

        $response = $kernel->handle($request);
        $kernel->terminate($request, $response);

        $requestDuration = (round(microtime(true) * 1000) - $start);

        $output->writeln(($response->isSuccessful() ? ' . ' : ' X ') . '(' . $handleDuration . ')');
}

以下是示例输出:(.代表请求成功;时间(ms)用括号括起来)

. (246 ms)
. (275 ms)
. (271 ms)
. (268 ms)
. (564 ms)
. (379 ms)
. (353 ms)
. (321 ms)
[...]
. (416 ms)
. (425 ms)
. (409 ms)
. (448 ms)
. (402 ms)
. (405 ms)
. (410 ms)
. (453 ms)
. (476 ms)
. (462 ms)
. (488 ms)
[...]
. (564 ms)
. (537 ms)
. (553 ms)
. (564 ms)
. (510 ms)
. (564 ms)
. (531 ms)
. (569 ms)
. (655 ms)
[...]
. (1155 ms)
. (1179 ms)
. (1142 ms)
. (1126 ms)

谢谢您的帮助!

(编辑)

以下是有关控制器执行的操作的一些详细信息:

public function postEntityAction(Request $request) {
    // get the authenticated user
    $authUser = $this->getUser();
    // fetch some data from the database (there is about 6 calls like this one that could be done during the process)
    // note: the hydrator used by all my repository methods is SIMPLEOBJECT
    $item = $itemRepository->getItemById($request->request->get('itemId'));
    // create an entity and set its fields
    $entity = new Entity();
    $entity->setItem($item);
    // I also do some validations using the validator service
    $validator = $this->get('validator');
    $validator->validate($entity);
    // I persist the new entity
    $this->getDoctrine()->getManager()->persist($entity);
    $this->getDoctrine()->getManager()->flush();
    // and finally I return the serialized object (using JMS serializer)
    return $this->serialize($entity);
}

0 个答案:

没有答案