这个问题的范围很广,例如web服务器、数据库服务器、php应用程序等等,因此我怀疑它是否属于stackoverflow,但是由于这个问题将帮助我们如何编写应用程序代码,我决定在这里提问。
我对数据库会话和web服务器如何协同工作感到困惑。如果我是对的,当为客户端建立连接时,将只为该连接创建一个会话,并且该会话将一直持续到连接断开或由于长时间不活动而重新连接。
现在,如果我们考虑一个web服务器,特别是Apache2.4,运行PHP7.2应用程序(在虚拟主机中),数据库由MariaDB 10.3.10支持(如果这很重要的话),我假设以下情况(如果我错了,请纠正我):
如果上面提到的所有用例都是正确的,那么数据库锁定的概念似乎非常令人困惑。假设我们将发出一个排它锁,例如lock tables t1 write;
,它将阻塞其他会话的读写,以避免并发会话的脏读写操作。然而,由于所有20个用户同时使用相同的会话和连接,我们将无法从数据库锁定机制中获得所需的并发安全性。
问题:
show status where
variable_name= 'Threads_connected'
?方面是如何工作的? Laravel应用程序收到的每个web请求都会创建新的连接和会话,还是只重用了一个连接和会话?发布于 2018-10-11 16:39:04
在这种情况下,Apache与会话(主要)没有任何关系。数据库连接和会话是由php自己处理的。
除非您启用了连接池,否则不会重用数据库会话,每个请求都将打开自己的连接,并在结束时关闭它。
启用连接池后,为请求提供服务的线程将请求从池到进程管理器的连接(无论是fpm
还是mod_php
),并且它将从池返回一个可用的连接,但仍然会有至少与并发请求一样多的会话(除非达到任何max_
限制)。general reference包含更多细节,但作为一个亮点:
持久连接不能让你在同一条链路上打开‘用户会话’,它们不能让你高效地建立一个事务,它们也不能做很多其他的事情。事实上,为了非常清楚这个主题,持久连接不会为您提供任何非持久兄弟不能提供的功能。
即使有一个可用的连接池,管理器也必须在将连接返回给客户端之前运行一些清理操作。其中一个操作是表解锁。
有关更多信息,请参阅mysqli
扩展的connections reference和persistent connections reference。
但是,您正在描述的多个客户端会话共享一个连接的操作模式是可能的(并且是实验性的),并且具有更多的缺点。它被称为session multiplexing。
https://stackoverflow.com/questions/52754521
复制相似问题