为什么symfony在调用其他控制器时会阻塞?

为什么symfony在调用其他控制器时会阻塞?,symfony,Symfony,我有两个动作,在其中一个动作中我调用另一个动作,但symfony阻塞该调用,直到第一个动作(我从中调用的那个动作)完成。因此,由于这个事实,我得到了超时错误。有人知道原因是什么吗 行动非常简单: $url = $this->router->generate( 'invoice_show', [ 'invoiceId' => $invoiceId, ], UrlGeneratorIn

我有两个动作,在其中一个动作中我调用另一个动作,但symfony阻塞该调用,直到第一个动作(我从中调用的那个动作)完成。因此,由于这个事实,我得到了超时错误。有人知道原因是什么吗

行动非常简单:

    $url = $this->router->generate(
        'invoice_show',
        [
            'invoiceId' => $invoiceId,
        ],
        UrlGeneratorInterface::ABSOLUTE_URL
    );

    return new Response(
        $this->pdfGenerator->getOutput(
            $url,
            [
                'margin-bottom'       => 3,
                'margin-top'          => 3,
                'margin-left'         => 4,
                'margin-right'        => 4,
                'disable-javascript'  => true,
                'load-error-handling' => 'ignore',
                'cookie'              => $request->cookies->all(),
            ]
        ),
        200,
        [
            'Content-Type'        => 'application/pdf',
            'Content-Disposition' => 'attachment; filename="' . $invoiceId . '.pdf"',
        ]
    );
例外情况:

Symfony\Component\Process\Exception\ProcessTimeDouteException(代码: 0):进程\“/usr/bin/xvfb run/usr/bin/wkhtmltopdf——低质量 --页边距底部“3”--左边距“4”--右边距“4”--页边距顶部“3”--禁用javascript--加载错误处理“忽略” '' “/var/www/var/cache/dev/snappy/knp_snappy599cffb13836d0.68608376.pdf”\” 超过了60秒的超时时间。在 /var/www/vendor/symfony/symfony/src/symfony/Component/Process/Process.php:1265


根据与symfony一起使用的会话处理程序,它可能会锁定会话,直到第一个请求完成。 这意味着所有后续请求都将被阻止,以防止写入会话时出现并发问题(在两个请求中写入同一会话可能会导致第一次写入失败)

举个例子,这是一个例子

您可以通过调用
$request->session->save()显式关闭会话在控制器中

如果您不希望出现并发问题,例如,如果您根本不向会话写入,您还可以禁用整个应用程序的会话锁定:

session.handler.pdo:
    class: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
    public: false
    arguments:
        - "pgsql:host=%database_host%;port=%database_port%;dbname=%database_name%"
        - db_username: %database_user%
          db_password: %database_password%
          db_table: session
          db_id_col: session_id
          db_data_col: session_value
          db_time_col: session_time
          db_lifetime_col: session_lifetime
          lock_mode: 0

根据与symfony一起使用的会话处理程序,它可能会锁定会话,直到第一个请求完成。 这意味着所有后续请求都将被阻止,以防止写入会话时出现并发问题(在两个请求中写入同一会话可能会导致第一次写入失败)

举个例子,这是一个例子

您可以通过调用
$request->session->save()显式关闭会话在控制器中

如果您不希望出现并发问题,例如,如果您根本不向会话写入,您还可以禁用整个应用程序的会话锁定:

session.handler.pdo:
    class: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
    public: false
    arguments:
        - "pgsql:host=%database_host%;port=%database_port%;dbname=%database_name%"
        - db_username: %database_user%
          db_password: %database_password%
          db_table: session
          db_id_col: session_id
          db_data_col: session_value
          db_time_col: session_time
          db_lifetime_col: session_lifetime
          lock_mode: 0

也不知道你发布的代码实际上在哪里调用另一个控制器,但我假设在生成完整的pdf文件之前,事情都被阻止了?如果是这样,请查看流式响应:
pdfGenerator
调用另一个操作并将html转换为pdf,但html响应从未出现。由于应用程序在第一个请求中被某种方式阻止,我们正在为该pdf文件设置w8ing,因此我建议您使用Symfony调试URL来测试应用程序。我的文章展示了如何使用它和一些屏幕截图(3.2版)。然后您可以查看
dev.log
中的
var/logs
文件夹,看看它是否解释了504个错误。这是一个服务器错误。你也看过KnpSnappyBundle吗?它很容易使用@Cerad的建议也很好。这就是我正在使用的。如果这是一个全新的请求,那么会话阻塞可能就是问题所在。您使用什么类型的会话处理程序?PdoSessionHandler将阻止后续请求,直到会话在第一个会话中关闭。也不确定您发布的代码实际上在何处调用另一个控制器,但我假设在生成完整的pdf文件之前,事情会被阻止?如果是这样,请查看流式响应:
pdfGenerator
调用另一个操作并将html转换为pdf,但html响应从未出现。由于应用程序在第一个请求中被某种方式阻止,我们正在为该pdf文件设置w8ing,因此我建议您使用Symfony调试URL来测试应用程序。我的文章展示了如何使用它和一些屏幕截图(3.2版)。然后您可以查看
dev.log
中的
var/logs
文件夹,看看它是否解释了504个错误。这是一个服务器错误。你也看过KnpSnappyBundle吗?它很容易使用@Cerad的建议也很好。这就是我正在使用的。如果这是一个全新的请求,那么会话阻塞可能就是问题所在。您使用什么类型的会话处理程序?PdoSessionHandler将阻止后续请求,直到会话在第一个会话中关闭。