我正在本地计算机(笔记本电脑)的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
无效。
这让我感到困惑。
true
的mysql服务)是什么原因? 答案 0 :(得分:1)
MySQL是一个众所周知的数据库,它具有轻量级的连接开销。因此,关于连接重用的担忧很少出现,但是无论如何,PHP中的连接都与进程相关联。您真的只会在负载下看到连接重用的好处,那里有足够的php进程在运行,而持续的PHP进程可以重用mysql客户端连接。
换句话说,即使您正在使用持久性mysql连接,您的mysql客户端连接也可以/将/可能会根据您的Web服务器配置而关闭,或者如果请求的apache进程确实需要一个新的连接,还没有持久连接可用。
即使您有一个持久的连接,也不意味着您的情况会变快,因为您所做的假设是,通过公共Internet到RDS的连接时间很慢,实际上,您的本地主机应用程序在整个公共Internet上的整个mysql客户端连接都很慢。查询将很慢,结果集的获取将很慢,并且总体而言,这将是一个糟糕的体验。
如果要在AWS上托管整个站点并使用RDS进行数据存储,那么花费12秒的连接就不会出现。这将更接近您通过本地数据库在localhost上获得的性能类型。
此外,这个想法的整个谓词都不是很好。
您正在尝试调整实际上在现实世界中不会使用的任何东西,因此,您正在尝试解决自己制造的问题,这对您的项目没有长期好处。
话虽如此,如果您想更好地理解自己为什么要经历自己的生活,以及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连接很少值得它们潜在的麻烦原因。