cakephp 在AuthenticationMiddleware.php中的process()函数有时花费的时间太长

olhwl3o2  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(158)

有些页面需要一个简单的重新加载,有时很长(4到45秒)。不幸的是延迟是不可预测的。首先我认为这当然是我做错了什么,但经过进一步的调查,我发现延迟功能。
vendor/cakephp/authentication/src/Middleware/AuthenticationMiddleware.php中函数process()运行这个代码$service->authenticate($request);

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
    $service = $this->getAuthenticationService($request);

    try {
        $result = $service->authenticate($request);
        ^^^^^^^^ This call needs between 0.01 and 45 seconds
    } catch (AuthenticationRequiredException $e) {
        $body = new Stream('php://memory', 'rw');

以下是我的执行时间测量的一些示例转储:
执行时间较长的/api/shop的转储;向右滚动以查看每个时间快照之间的增量时间:

[2020-11-01T16:58:02+00:00] /api/shop/ - /vendor/cakephp/authentication/src/Middleware/AuthenticationMiddleware.php :0103 - Delta time:0.04342
[2020-11-01T16:58:14+00:00] /api/shop/ - /vendor/cakephp/authentication/src/Middleware/AuthenticationMiddleware.php :0107 - Delta time:11.81272
[2020-11-01T16:58:14+00:00] /api/shop/ - /vendor/cakephp/authentication/src/Middleware/AuthenticationMiddleware.php :0121 - Delta time:11.81295

然后,17秒后[没有变化,只是重新加载页面],没有延迟:

[2020-11-01T16:58:31+00:00] /api/shop/ - /vendor/cakephp/cakephp/src/Http/Runner.php                                :0071 - Delta time:0.03756
[2020-11-01T16:58:31+00:00] /api/shop/ - /vendor/cakephp/authentication/src/Middleware/AuthenticationMiddleware.php :0103 - Delta time:0.04211
[2020-11-01T16:58:31+00:00] /api/shop/ - /vendor/cakephp/authentication/src/Middleware/AuthenticationMiddleware.php :0107 - Delta time:0.04506

你知道是什么原因吗?这是非常令人沮丧的,因为它是完全不可预测的。在上面的真实的例子中,在几秒钟内有一个巨大的延迟,然后它工作了3-4次,然后突然它再次延迟。如前所述,我没有做任何事情;正在重新加载页面。
蛋糕PHP 4.1.4

j7dteeu8

j7dteeu81#

我也在CakePHP Github Issues下发布了这个案例。CakePHP的成员othercorey给了我检查Authentication\Authenticator\SessionAuthenticator的建议,在这里我找到了原因:
vendor/cakephp/cakephp/src/Http/Session.php为单位
--〉在函数start()
--〉调用if (!session_start()) {
完整代码:

if (!session_start()) {
        throw new RuntimeException('Could not start the session');
    }
  • 那么解决方案就很简单了 *。我使用的是SSE,这就是这些不可预测的延迟的原因。在SSE函数中调用session_write_close()后,页面加载〈2秒。

当我得到一些时间我会检查如果会话存储在数据库中可能是另一种解决方案。

相关问题