1

我继承了一个用 PHP 编写的 Web 应用程序,它使用 PostgresSQL 作为数据库服务器。我对 PHP 和 PostgresSQL 没有任何经验,我来自 Java / C# 背景。我正在研究它是如何工作的,当我对其进行分析时,我注意到老程序员在每次页面请求期间都会实例化一个名为 Database 的类,在该类中他使用以下方式打开与数据库的连接:

$this->connection = pg_connect($qs, PGSQL_CONNECT_FORCE_NEW)

探查器告诉我这是一个非常昂贵的调用(页面在 2.7 秒内加载......),我想知道是否以及何时真正需要标志 PGSQL_CONNECT_FORCE_NEW。由于连接字符串始终相同,因此我尝试使用 pg_pconnect 代替(甚至没有该标志的 pg_connect),并且页面加载时间仅为 741 毫秒。现在一切似乎都很好,但我有点担心这可能会在某个地方破坏应用程序,而且由于我没有 PHP 经验,所以我想知道使用该标志的做法是否有某种意义我需要检查的场景。显然,没有可依赖的单元测试。作为旁注,你知道关于这个 pg_(p)connect 如何真正工作的好资源吗?官方文档似乎不够深入。

谢谢!

4

2 回答 2

0

使用时,此常量告诉 pg_connect 每次都创建一个新连接,而不是使用已经打开的连接。这可能表明程序使用了一些与会话相关的功能,例如:

  • postgres 会话变量(search_path?)
  • 实例化连接时不应存在的临时表
  • (坏)手动使用序列函数

祝你好运

于 2012-08-29T08:32:21.173 回答
0

警告:pg_pconnect 将在每个 Apache 后端的生命周期内维护一个连接,因此如果您最终获得大量连接,请不要感到惊讶。如果它们最终同时发出查询,则会阻塞数据库服务器。

不过,我从未听说过连接数据库需要 2 秒。我可以在 0.2 秒内启动 psql、连接、发出查询并获得响应,这在我的旧上网本上。检查您的网络设置或类似的设置 - 这里发生了一些奇怪的事情。

于 2012-08-29T10:48:10.070 回答