2024 年 PHP 大会日本站

pg_connect

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_connect打开 PostgreSQL 连接

描述

pg_connect(字符串 $connection_string, 整数 $flags = 0): PgSql\Connection|false

pg_connect() 打开到由 connection_string 指定的 PostgreSQL 数据库的连接。

如果使用与现有连接相同的 connection_stringpg_connect() 进行第二次调用,则将返回现有连接,除非您将 PGSQL_CONNECT_FORCE_NEW 作为 flags 传递。

使用多个参数的旧语法 $conn = pg_connect("host", "port", "options", "tty", "dbname") 已被弃用。

参数

connection_string

connection_string 可以为空,以使用所有默认参数;也可以包含一个或多个由空格分隔的参数设置。每个参数设置的格式为 keyword = value。等号周围的空格是可选的。要写入空值或包含空格的值,请将其用单引号括起来,例如 keyword = 'a value'。值中的单引号和反斜杠必须使用反斜杠转义,即 \' 和 \\。

当前识别的参数关键字为:hosthostaddrportdbname(默认为 user 的值)、userpasswordconnect_timeoutoptionstty(忽略)、sslmoderequiressl(已被 sslmode 弃用)和 service。哪些参数存在取决于您的 PostgreSQL 版本。

options 参数可用于设置服务器调用的命令行参数。

flags

如果传递了 PGSQL_CONNECT_FORCE_NEW,则即使 connection_string 与现有连接相同,也会创建一个新连接。

如果给出了 PGSQL_CONNECT_ASYNC,则异步建立连接。然后可以通过 pg_connect_poll()pg_connection_status() 检查连接的状态。

返回值

成功时返回 PgSql\Connection 实例,失败时返回 false

变更日志

版本 描述
8.1.0 现在返回 PgSql\Connection 实例;以前返回的是 资源

示例

示例 #1 使用 pg_connect()

<?php
$dbconn
= pg_connect("dbname=mary");
// 连接到名为“mary”的数据库

$dbconn2 = pg_connect("host=localhost port=5432 dbname=mary");
// 连接到“localhost” 5432 端口上名为“mary”的数据库

$dbconn3 = pg_connect("host=sheep port=5432 dbname=mary user=lamb password=foo");
// 使用用户名和密码连接到主机“sheep”上名为“mary”的数据库

$conn_string = "host=sheep port=5432 dbname=test user=lamb password=bar";
$dbconn4 = pg_connect($conn_string);
// 连接到主机“sheep”上名为“test”的数据库,使用用户名和密码

$dbconn5 = pg_connect("host=localhost options='--client_encoding=UTF8'");
// 连接到“localhost”上的数据库,并设置命令行参数,指示编码为 UTF-8
?>

参见

添加备注

用户贡献的备注 19 条备注

lukasz dot wolczak at gmail dot com
8 年前
值得知道的是,您可以在连接字符串中设置 application_name,请考虑这个简单的示例

<?php
$appName
= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$connStr = "host=localhost port=5432 dbname=postgres user=postgres options='--application_name=$appName'";

//简单的检查
$conn = pg_connect($connStr);
$result = pg_query($conn, "select * from pg_stat_activity");
var_dump(pg_fetch_all($result));

?>

通过在命令行或CGI中执行此操作,你可以在pgAdmin中查看正在运行的脚本或数据库中正在运行的请求。你可以扩展PostgreSQL的配置以跟踪慢查询并将应用程序名称打印到日志中。这对我找出应该优化什么以及在哪里优化非常有用。
Dave
11年前
如果你使用pgbouncer和Unix套接字
并且你的pgbouncer.ini看起来像这样
listen_port = 6432
unix_socket_dir = /tmp

你可以这样连接

pg_connect('host=/tmp port=6432 dbname=DB user=USER password=PASS');
匿名用户
10年前
由于缺乏文档,获取MD5密码令人困惑

- 设置你的pg_hba.conf以使用md5密码而不是'trust'或'ident'。
- 检查你的postgres.conf是否包含'password_encryption=on'(取决于版本,这可能已经是'on')。
- 确保重启你的PostgreSQL进程。
- 在PHP中,你只需提供_明文_用户名和密码
'host=localhost port=5432 dbname=megadb user=megauser password=holyhandbagsbatmanthispasswordisinplaintext'
PostgreSQL的PHP库会自动为你进行md5编码,无需自己动手。
bgalloway at citycarshare dot org
16年前
注意不要编写类似这样的代码
<?php
function getdb_FAILS() {
return
pg_connect("...") or die('connection failed');
}
?>

它将返回一个布尔值。如果你不使用返回值作为数据库连接句柄,这看起来似乎没问题,但如果你使用它,就会失败。

相反,使用
<?php
function getdb() {
$db = pg_connect("...") or die('connection failed');
return
$db;
}
?>

它实际上返回一个句柄。
tim at buttersideup dot com
16年前
这里没有明确说明,但你也可以通过将主机留空来通过Unix域套接字连接到PostgreSQL。这应该比使用TCP具有更低的开销,例如:

$dbh = new PDO('pgsql:user=exampleuser dbname=exampledb password=examplepass');

事实上,由于C库调用PQconnectdb是此实现的基础,你可以提供此库调用将接受的任何内容——“pgsql:”前缀在调用PQconnectdb之前会被剥离,如果你提供任何可选参数(例如user),则这些参数将添加到你提供的字符串中……检查你的相关PostgreSQL客户端库的文档:例如:

https://postgresql.ac.cn/docs/8.3/static/libpq-connect.html

如果你真的想,可以使用';'来分隔你的参数——在调用PQconnectdb之前,这些参数将被转换为空格。

Tim。
thakur at corexprts dot com
14年前
要记住的一点是,每当尝试使用pg_connect时,都要添加超时参数。

<?php
$d
=pg_connect('host=example.com user=pgsql dbname=postgres connect_timeout=5');
?>
matias at nospam dot projectcast dot com
22年前
至少在PostgreSQL 7.2中,连接到本地PostgreSQL数据库需要数据库中存在一个与运行Apache的用户同名的用户,否则连接会失败。
VLroyrenn
5年前
值得一提的是,虽然PHP通常会为你处理连接重用,只要你继续使用相同的连接字符串,如下例所示

<?php
$before_conn1
= microtime(true);
$db1 = pg_connect($conn_string);

$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo(
$before_conn2 - $before_conn1); // 耗时约0.03秒
echo("\n");
echo(
$after_conn2 - $before_conn2); // 耗时0秒
?>

……虽然这很好,但这对于异步连接并不适用;你必须自己管理它们,并且你不能简单地用阻塞连接来跟进异步连接,作为在发送查询之前等待连接过程完成的一种简单方法。

<?php
$before_conn1
= microtime(true);
$db1 = pg_connect($conn_string, PGSQL_CONNECT_ASYNC);
sleep(1);

$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo(
$before_conn2 - $before_conn1); // 耗时约1秒
echo("\n");
echo(
$after_conn2 - $before_conn2); // 耗时约0.025秒
?>
匿名用户
19年前
pg_connect的sslmode参数接受的值为:disable、allow、prefer、require
gutostraube at gmail dot com
15年前
可以通过以下两种方式使用pg_connect()函数通过Unix套接字连接到PostgreSQL数据库

1) 使用套接字路径

<?php
$conn
= pg_connect('host=/var/run/postgresql user=username dbname=databasename');
?>

2) 省略主机名/路径

<?php
$conn
= pg_connect('user=username dbname=databasename');
?>

注意:在这种情况下(省略主机值),将使用默认套接字路径。
leace at post dot cz
24年前
如果你使用PostgreSQL用户进行pg数据库身份验证而不是使用你自己的身份验证,请始终在pg_connect中指定host指令并编辑pg_hba.conf以相应地从该主机进行身份验证。否则,PHP将作为'local'使用Unix域套接字连接,默认情况下在pg_hba.conf中设置为'trust'(因此你可以使用psql在控制台中连接而无需指定密码),并且任何人都可以_无需密码_连接到数据库。
phpnet at benjamin dot schulz dot name
20年前
如果你需要打开一个新的连接句柄(例如,对于多个pg_send_query()),请使用PGSQL_CONNECT_FORCE_NEW作为pg_connect()的第二个参数。
floriparob at gmail dot com
8 年前
使用“service”参数作为连接字符串——我们发现以下函数:

putenv("PGSERVICEFILE=/path/to/your/service/file/pg_service.conf");
$connect_string = ("service=testdb");
try {
$pgconn_handle = pg_connect($connect_string);
……等等。

注意:
1) 环境变量必须指向路径和文件名。
2) Apache 必须能够读取该文件。

参见:

https://postgresql.ac.cn/docs/9.6/static/libpq-pgservice.html

了解如何创建你的 pg_service.conf 文件。
Sohel Taslim
17 年前
我遇到了同样的问题,但我用不同的方法解决了它。
在我的 postgresql.conf 文件中,以下内容被注释掉了。
因此,我在“连接设置”下启用了它:

#- 连接设置 –
tcpip_socket = true
xzilla at users dot sourceforge dot net
20年前
关于 matias at nospam dot projectcast dot com 在
2002 年 2 月 12 日 01:16 发送的备注,你不需要在数据库中创建一个与你的 Web 用户同名的用户,无论 PostgreSQL 的版本如何。只有在你将 PostgreSQL 服务器设置为仅允许基于 IDENT 的身份验证时(据我回忆,这是 Red Hat 系统的默认设置,这可能会导致混淆),这才是必需的。有关 PostgreSQL 允许的各种身份验证方法的更多信息,请查看 https://postgresql.ac.cn/docs/7.4/static/client-authentication.html
jtate at php dot net
21 年前
如果你在连接到 7.1 以上版本的 PostgreSQL 数据库时,在你的 pg_connect 字符串中使用 host=HOSTNAME,你需要确保你的 postmaster 守护进程是用“-i”选项启动的。否则连接将会失败。有关客户端身份验证文档,请参见 https://postgresql.ac.cn/idocs/index.php?client-authentication.html
kayotix at yahoo dot com
24年前
安装过程中某个地方隐藏的一个小提示。在 PHP 3 中,PostgreSQL 支持是通过向传递给 ./configure 的选项添加 --with-postgresql=[DIR] 来激活的。在 PHP 4.0.2(在 Linux 上)中,参数是 --with-pgsql。我找到这个的唯一地方是在手册的“在 Unix 上安装 PHP”部分。
rolf at sir-wum dot de
23 年前
pg_connect() 不适用于 pg_hba.conf 中的“crypt”身份验证方法。花了我一个小时才弄清楚,直到我记起 Windows 缺少 crypt() 调用的一些其他问题。
derry at siliconriver.com dot au
21 年前
pg_connect 似乎支持 SSL 连接,在使用 ssl 编译 Postgres 的系统上,我假设这是因为 psql 使用 libpq 来连接。
pg_connect 可以成功连接并使用“requiressl”参数。
To Top