PHP PDO Unix 套接字到 Postgresql 失败

问题描述 投票:0回答:1

测试类似 LAMP 的应用程序,失败并显示:

SQLSTATE[08006] [7] 连接到套接字“/tmp/.s.PGSQL.5432”上的服务器失败:没有这样的文件或目录

经过大量故障排除后,我被难住了。我可能不得不重新安装 Linux 来解决我因盲目破解而引入的任何问题。在我这样做之前,有什么方法可以调试它以找到根本原因吗?

这是我的灯箱:

  • Postgresql 14
  • Fedora Linux 36(工作站版)
  • php 4.1.12
  • 阿帕奇2.2

这是我迄今为止尝试过的:

  1. 检查文件是否存在。确实如此,但是锁有问题吗?
[xxx@mybox~]$ sudo ls -al /tmp/.s.*
srwxrwxrwx. 1 postgres postgres  0 Nov 28 12:10 /tmp/.s.PGSQL.5432
-rw-------. 1 postgres postgres 48 Nov 28 12:10 /tmp/.s.PGSQL.5432.lock
  1. 尝试连接php。它连接并从 Postgresql 返回预期的表数据。

php /var/www/html/lamp/connect.php

  1. 尝试使用卷曲。错误。

curl http://localhost/lamp/connect.php

SQLSTATE[08006] [7] 连接到套接字“/tmp/.s.PGSQL.5432”上的服务器失败:没有这样的文件或目录 服务器是否在本地运行并接受该套接字上的连接?

测试文件connect.php。使用PDO连接Postgresql:

<?php

require_once 'config.php';

function connect(string $host, string $db, string $user, string $password): PDO
{
        try {
                $dsn = "pgsql:host=/tmp;port=5432;dbname=$db";

                // make a database connection
                return new PDO(
                        $dsn,
                        $user,
                        $password,
                        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
                );
        } catch (PDOException $e) {
                die($e->getMessage());
        }
}

return connect($host, $db, $user, $password);
  1. 我已尝试按照以下方式对 SELinux 进行故障排除
    SELinux 故障排除

我确实找到了与该问题直接相关的审核日志通知,使用 sealert 来允许所需的访问。那行不通。我禁用了修复模块,可能已经搞砸了 SE,因为我再也找不到拒绝的信息了。关闭 SE 和防火墙也不起作用。

[peter@fedora ~]$ getenforce
Permissive
$ firewall-cmd --state
not running
php postgresql apache selinux
1个回答
0
投票

尝试从 DSN 中删除

host=
port=
。 AFAIK 这将使 PDO 连接到本地套接字:

$dsn = "pgsql:dbname=$db";
© www.soinside.com 2019 - 2024. All rights reserved.