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