Laravel如何维护持久数据库连接

时间:2018-12-05 16:40:38

标签: mysql laravel-5 amazon-rds

我正在本地计算机(笔记本电脑)的LAMP设置中开发Laravel应用程序。

出于测试目的,我尝试使用select split_part(lot_size1, ???,1) as area, split_part(lot_size1, ???,2) as units; 的mysql服务代替我的本地Aws RDS。发现,一个只有一个数据库调用且没有联接的API调用(查询: show table )-平均需要12秒钟。这是荒唐的。当我使用本地mysql服务器时,大约是600毫秒左右。到目前为止,尚未启用PDO :: ATTR_PERSISTANT。

登录mysql server [在Illuminate\Database\Connectors\Connector.php方法内部],我发现,对于每个请求都调用此方法。这适用于两个mysql服务器。

然后,我将createConnection()设置为PDO::ATTR_PERSISTANT。但是响应时间相似。

更仔细地寻找之后,在同一文件中找到了它:

true

/** * Create a new PDO connection instance. * * @param string $dsn * @param string $username * @param string $password * @param array $options * @return \PDO */ protected function createPdoConnection($dsn, $username, $password, $options) { if (class_exists(PDOConnection::class) && ! $this->isPersistentConnection($options)) { return new PDOConnection($dsn, $username, $password, $options); } return new PDO($dsn, $username, $password, $options); } -其中PDOConnection,当持久性为false时使用-构造函数为:

extends PDO

似乎将public function __construct($dsn, $user = null, $password = null, array $options = null) { try { parent::__construct($dsn, $user, $password, $options); $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, ['Doctrine\DBAL\Driver\PDOStatement', []]); $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (\PDOException $exception) { throw new PDOException($exception); } } 设置为PDO::ATTR_PERSISTANT无效。 这让我感到困惑。

  1. 持久性数据库连接实际上在Laravel中如何发挥作用?
  2. 响应时间长(使用true的mysql服务)是什么原因?

1 个答案:

答案 0 :(得分:1)

MySQL是一个众所周知的数据库,它具有轻量级的连接开销。因此,关于连接重用的担忧很少出现,但是无论如何,PHP中的连接都与进程相关联。您真的只会在负载下看到连接重用的好处,那里有足够的php进程在运行,而持续的PHP进程可以重用mysql客户端连接。

换句话说,即使您正在使用持久性mysql连接,您的mysql客户端连接也可以/将/可能会根据您的Web服务器配置而关闭,或者如果请求的apache进程确实需要一个新的连接,还没有持久连接可用。

即使您有一个持久的连接,也不意味着您的情况会变快,因为您所做的假设是,通过公共Internet到RDS的连接时间很慢,实际上,您的本地主机应用程序在整个公共Internet上的整个mysql客户端连接都很慢。查询将很慢,结果集的获取将很慢,并且总体而言,这将是一个糟糕的体验。

如果要在AWS上托管整个站点并使用RDS进行数据存储,那么花费12秒的连接就不会出现。这将更接近您通过本地数据库在localhost上获得的性能类型。

此外,这个想法的整个谓词都不是很好。

  1. RDS是一种高价产品。您根本不应该将其用于开发。如果您使用的是免费套餐,那么除了很小的数据库外,其他任何数据库的数据库性能都将非常缓慢。
  2. MySQL本质上没有网络层安全性。您的AWS部署应使用VPC,其中RDS在VPC中,PHP应用程序服务器在VPC中。
  3. 使用RDS在您的应用程序中没有什么特别之处。在您的应用程序中,它看起来像其他任何具有非localhost -h参数的mysql数据库一样。

您正在尝试调整实际上在现实世界中不会使用的任何东西,因此,您正在尝试解决自己制造的问题,这对您的项目没有长期好处。

话虽如此,如果您想更好地理解自己为什么要经历自己的生活,以及PHP和关联资源如何工作,那么一个拥有繁重且耗时的连接过程的数据库就是Oracle。合法地将Oracle与PHP结合使用的人们必须关心连接的重用,因为Oracle希望建立连接,然后会发生许多“会话”。尽管此Oracle Cookbook article现在已经有些老了,但它很好地说明了PHP进程(至少与Apache和Mod_php)与数据库连接之间的关联。

最后但并非最不重要的一点是,由于可以使用多种不同的方式运行PHP,因此使本主题变得复杂。 Apache具有几种不同的配置,这与IIS不同,而IIS与近年来流行的Nginx / php-fpm不同。 This SO question/answer已经解决了您要使用的特定PDO参数,最终将其传递给MySQL客户端库,以及一些重要的警告和担忧,这些原因和疑虑解释了为什么MySQL连接很少值得它们潜在的麻烦原因。