2

好的,这是我几个星期以来一直在努力的事情,所以请耐心等待。当我设置我的 postgres 数据库时,我只想通过本地 Unix 套接字连接到它。就像我如何设置我的 MySQL 数据库以及我为它编写的后续 PHP 脚本一样。因此,我的 pg_hba.conf 文件的底部看起来像这样:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
#host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
#host    all             all             ::1/128                 md5

我曾经并且现在仍然能够通过 psql 命令行实用程序与我的数据库交互,并且可以毫无问题地做任何我需要做的事情。但是,当我尝试编写一个简单的 PHP 脚本来连接数据库时,它总是会失败:

<?php
$dbhost = "localhost";
$dbname = "postgres";
$dbuser = "postgres";
$dbpassword = "####";
$conn_string = "host=$dbhost dbname=$dbname user=$dbuser password=$dbpassword";
$dbconn = pg_connect($conn_string);
if($dbconn)
{
        echo "<p>Win!</p>";
}
else
{
        echo "<p>Connect failed!</p>";
        exit();
}
pg_close($dbconn);
?>

几个星期以来,我对于为什么 PHP 不能建立一个简单的 Unix 套接字连接感到非常困惑,尤其是在为我的 MySQL 数据库使用本地连接的 mysqli 库编写了很多脚本之后!然而,我终于取消了与环回地址相关的行的注释,并且它突然起作用了!这向我表明,当 'localhost' 作为 pg_connect 的主机参数传递时,它使用环回接口,而不仅仅是本地 Unix 套接字。

这不是世界末日,但有没有办法以某种方式使用 PHP,以便它通过本地 Unix 套接字连接,或者它不支持这种与 postgresql 的连接?

4

1 回答 1

3

在连接字符串中设置host保存 unix 套接字的目录的值。

因此,如果套接字位于/var/run/postgresql/psql.sock然后尝试:

pg_connect("host=/var/run/postgresql dbname=..etc...");

PHP 文档页面上的其他评论pg_connect表明您也可以host完全省略键/值并且它会起作用 - 但我没有尝试过。:

http://php.net/manual/en/function.pg-connect.php

于 2013-06-16T22:26:53.550 回答