我有一个使用Symfony 2.8.14 / Doctrine构建的报告应用程序。我的一份报告大约需要2分钟才能运行并执行一系列查询(https://dba.stackexchange.com/questions/157981/reporting-query-blocks-other-query-but-isolation-level-read-uncommitted-set/159495#159495)。
我发现锁定似乎发生在Symfony级别,因为如果我在报告运行时切换到app_dev.php /或在命令行上运行MySQL查询,则可以加载相同的页面没问题。
我是否有意外打开的连接限制或其他锁定?
我的学说配置
# Doctrine Configuration
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
options:
1001: true
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: default
entity_managers:
default:
connection: default
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
AppBundle: ~
FOSUserBundle: ~
errorlog:
connection: default
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
AppBundle: ~
Apache2配置 - mpm-itk
<IfModule mpm_itk_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
不使用评论中所述的PHP-FPM,而是使用mod_php:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
我在m4.2xlarge上运行MySQL 5.7.11,根据这个:http://pushentertainment.com/rds-connections-by-instance-type/允许2500多个连接。
答案 0 :(得分:1)
几乎每次我遇到不在数据库中的锁定时,它都是PHP会话序列化。
使用默认的Symfony NativeFileSessionHandler
,PHP将在打开会话文件之前等待获取文件锁;在会话关闭之前不会释放锁(即请求已完成)。这有助于避免进程读/写会话数据之间的竞争条件。
如果这是原因,则在同一浏览器中打开2个选项卡(打印$session->getId以确认会话ID已共享)将被阻止,但尝试使用不同的浏览器(不同的会话ID)将不会阻止。请注意,取决于在浏览器中取消的ignore_user_abort() 以前的请求的状态,但仍然处理也会阻止任何新请求。
至于为什么这可以在dev / prod上运行,配置文件中会话处理程序设置的差异就会这样做。
或者,如果这不是原因,我会使用strace -p PID
和/proc/PID
来确定阻止apache / PHP进程的系统调用(可能很烦人解决阻塞进程的问题)但你只有5个apache进程和2分钟的窗口才能找到合适的进程)
答案 1 :(得分:0)
它不是由symfony引起的,它是由网络服务器引起的。你可以参考我的post关于另一个php mvc帧请求的laravel。
要解决此问题,请在后台运行时间成本流程。