laravel如何维护持久的数据库连接

mi7gmzs6  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(492)

我在本地机器(我的笔记本电脑)的lamp setup中开发了一个laravel应用程序。
出于测试目的,我尝试使用 Aws RDS 而是我当地的 mysql server . 发现只有一个没有连接的db调用(query:showtables)的api调用平均需要12秒。这太荒谬了。当我使用本地mysql服务器时,大约是600多毫秒。直到现在,pdo::attr\u persistant还没有启用。
登录 Illuminate\Database\Connectors\Connector.php [内部 createConnection() 方法],我发现,每个请求都会调用这个方法。这是针对mysql和服务器的。
然后,我开始 PDO::ATTR_PERSISTANTtrue . 但响应时间是相似的。
仔细查看后,在同一个文件中发现:

/**
 * 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 -哪个 extends PDO ,当persistent为false时使用-构造函数为:

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_PERSISTANTtrue 没有效果。这让我很困惑。
持久性数据库连接在laravel中的实际作用是什么?
响应时间长的原因是什么 Aws RDS ) ?

2eafrhcq

2eafrhcq1#

mysql是一个以轻量级连接开销著称的数据库。因此,很少有人关注连接重用,但无论如何,php中的连接都与进程相关。只有在有足够多的php进程运行的情况下,持续的php进程才能重新使用mysql客户机连接,您才能真正看到负载下连接重用的好处。
换句话说,您的mysql客户机连接可以/将/可能关闭,这取决于您的web服务器配置,即使您使用的是持久的mysql连接,或者如果请求的apache进程还没有可用的持久连接,则需要建立新的连接。
即使您有一个持久的连接可用,这并不意味着在您的场景中事情会更快,因为您所做的假设是通过公共互联网到rds的连接时间很慢,而实际上,通过公共互联网从localhost应用程序到mysql客户机的整个连接都很慢。查询速度会很慢,结果集获取速度会很慢,总的来说这将是一个糟糕的体验。
如果你在aws上托管你的整个站点并使用rds作为你的数据存储,那么12秒的连接是不会出现的。它将更接近于使用本地数据库在本地主机上获得的性能类型。
此外,整个 predicate 的想法是不好的。
rds是一款价格昂贵的产品。你根本不应该用它来发展。如果您使用的是free层,那么除了一个很小的db之外,任何数据库的性能都会非常慢。
mysql本质上没有网络层安全性。您的aws部署应该使用vpc,rds在vpc中,php应用服务器在vpc中。
在你的应用程序中使用rds没有什么特别之处。在您的应用程序看来,它就像任何其他具有非localhost-h参数的mysql数据库一样。
你试图调整一些在现实世界中没有人会用到的东西,因此你试图解决一个你自己造成的问题,这对你的项目没有长期的好处。
话虽如此,如果您想更好地理解为什么会遇到这样的情况,以及php和相关的资源处理是如何工作的,那么一个确实有一个繁重且耗时的连接过程的数据库就是oracle。在php中使用oracle的人必须关心连接重用,因为oracle期望建立一个连接,然后会发生许多“会话”。尽管这篇oracle cookbook文章现在有点老了,但它很好地说明了php进程(至少使用apache和modïphp)和数据库连接之间的关联。
最后但并非最不重要的一点是,有许多不同的方法可以运行php,这使得本主题变得复杂。apache有几种不同的配置,不同于iis,iis不同于近年来流行的nginx/php-fpm。这个问题/答案已经解决了您正试图使用的特定pdo参数,它最终只是将其传递给mysql客户机库,以及一些重要的注意事项和顾虑,它们解释了为什么mysql连接很少值得它们可能引起的潜在麻烦。

相关问题