在PDO中,可以使用该PDO::ATTR_PERSISTENT
属性使连接持久化.根据php手册 -
持久连接不会在脚本末尾关闭,而是在另一个脚本使用相同凭据请求连接时进行高速缓存和重新使用.持久连接缓存允许您避免每次脚本需要与数据库通信时建立新连接的开销,从而产生更快的Web应用程序.
本手册还建议在使用PDO ODBC驱动程序时不要使用持久连接,因为它可能会妨碍ODBC连接池过程.
显然,除了在最后一种情况下,在PDO中使用持久连接似乎没有任何缺点.但是,我想知道使用这种机制是否存在任何其他缺点,即这种机制会导致性能下降或类似的情况.
我的Symfony页面不是太慢(它加载大约400毫秒)但考虑到它只是一个简单的hello world页面,带有基本身份验证,它应该在不到100毫秒的时间内加载.当我进入探查器时,我看到了这个:
注意它只是说"防火墙"250毫秒.我认为防火墙只是负责让用户远离页面的某些区域 - 我无法想象花费的时间超过几毫秒加上从数据库中获取用户信息所需的时间(在这种情况下是61毫秒).
有人可以解释防火墙实际上做了什么吗?如果您有关于如何提高防火墙性能的任何一般性指示,那将非常感激.
注意:我当然用Google搜索了这个,我想预先指出我是通过IP地址连接到MySQL数据库,而不是主机名.对于我能找到的慢速Symfony防火墙的所有其他情况,这似乎是个问题.
我项目中的一些资源可能是相关的:
我使用webgrind和xdebug来破坏我的网站性能.函数php :: PDO - > __ construct(约1秒)采用85%的页面加载时间...
这是无法接受的.我能以某种方式优化这个功能吗?(缓存,mysql配置等)
我正在使用php,mysql和codeigniter与redbean.redbean使用那个pdo构造函数...
这是函数源代码
/**
* Establishes a connection to the database using PHP PDO
* functionality. If a connection has already been established this
* method will simply return directly. This method also turns on
* UTF8 for the database and PDO-ERRMODE-EXCEPTION as well as
* PDO-FETCH-ASSOC.
*
* @return void
*/
public function connect() {
if ($this->isConnected) return;
$user = $this->connectInfo['user'];
$pass = $this->connectInfo['pass'];
//PDO::MYSQL_ATTR_INIT_COMMAND
$this->pdo = new PDO(
$this->dsn,
$user,
$pass, …
Run Code Online (Sandbox Code Playgroud) 我的问题是,我的 Symfony 应用程序在Apache/2.4.6 (CentOS) PHP/5.6.31 MySQL 5.7.19 的远程计算机上运行,无法处理并发请求。这意味着当同时请求两个不同的页面时。第一个必须先完成,然后才能渲染第二个。
我在同一服务器上有一个用普通 Php 编写的另一个站点,它可以同时渲染尽可能多的页面(它使用已弃用的 mysql 连接,而不是像 Doctrine 这样的 pdo)。
也就是说,我做了以下测试:我插入了 sleep(3); 在我的 DefaultController 处。我请求了该页面,同时请求了另一个页面。请参阅下面的两个分析器:
睡眠页面(称为第 1 页):
没有睡眠的页面(称为第二页)。
正如你所看到的,Symfony 的 Http Firewall 占用了第二个页面的所有时间来加载。我的猜测(可能很愚蠢)是,第一个操作保留数据库连接,只有在完成它之后,它才会放手让其他请求使用它。尤其是与 Doctrine 使用 PDO 连接有关的事情。
顺便说一句,我已经阅读过帮助和文章,例如: - Symfony 防火墙在做什么,需要这么长时间? -为什么构建 PDO 连接很慢? - https://www.drupal.org/node/1064342
PS 我尝试在 apache 配置中使用 app.php 和 app_dev.php 没有任何改变。坚持使用 app_dev.php,这样我就可以使用分析器。使用 Symfony 内置服务器的本地开发具有相同的结果