首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony/ Doctrine :如何使Doctrine使用Unix套接字?

Symfony/ Doctrine :如何使Doctrine使用Unix套接字?
EN

Stack Overflow用户
提问于 2019-11-07 07:09:09
回答 4查看 2.7K关注 0票数 3

我正在尝试使用Unix连接到PostgreSQL。我认为只有一种方式可以连接到主机上的数据库,但是应用程序在Docker中(我遵循的原则是不包含不复制的数据库)。我用的是Symfony 4和最新的原则。

我用PDO对原始PHP进行了测试,它可以工作。我不知道如何执行Doctrine来使用unix套接字。

代码语言:javascript
复制
<?php
$dbh = new PDO('pgsql:host=/var/run/postgresql;user=xxxx;dbname=zzzz;password=yyyy');
$dbh->setAttribute(PDO::ERRMODE_EXCEPTION, true);
var_dump($dbh->errorInfo());

$stmt = $dbh->query('SELECT 1 as dupa;');
$stmt->execute();

var_dump($stmt->fetchAll());

其结果与预期的一样:

代码语言:javascript
复制
www-data@ef0f2269b69a:~/html$ php o.php 
array(3) {
  [0]=>
  string(5) "00000"
  [1]=>
  NULL
  [2]=>
  NULL
}
array(1) {
  [0]=>
  array(2) {
    ["dupa"]=>
    int(1)
    [0]=>
    int(1)
  }
}

问题是,无论我在Doctrine中配置了什么,我都得到了以下信息:

代码语言:javascript
复制
In PDOConnection.php line 27:
                                                                        
  [PDOException (7)]                                                    
  SQLSTATE[08006] [7] could not connect to server: Connection refused   
        Is the server running on host "localhost" (127.0.0.1) and accepting  
        TCP/IP connections on port 5432?                                     
  could not connect to server: Cannot assign requested address          
        Is the server running on host "localhost" (::1) and accepting        
        TCP/IP connections on port 5432?    

我尝试过Doctrine的语法,原始的PDO语法,没有想法。是否有可能我的pdo_pgsql没有编译unix支持?

这就是我在Doctrine中尝试作为数据库URL的内容:

代码语言:javascript
复制
pdo-pgsql://yyyy:xxxxx@/var/run/postgresql:5432/zzzzz
pgsql:host=/var/run/postgresql;user=xxxx;dbname=zzzz;password=yyyy
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-11-08 06:13:18

在调试Doctrine的驱动程序之后,我创建了一个不那么优雅的解决方案,但是它仍然可以工作,并且可以改进。

我不喜欢访问驱动程序本身中的环境变量,但这可能是可以改进的。

doctrine.yaml

代码语言:javascript
复制
doctrine:
    dbal:
        #driver:   %database_driver%
        driver_class: App\Infrastructure\Common\Service\PostgreSQLDoctrineDriver
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        #charset:  UTF8

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

PostgreSQLDoctrineDriver.php

代码语言:javascript
复制
<?php declare(strict_types=1);

namespace App\Infrastructure\Common\Service;

use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Driver\PDOConnection;
use Doctrine\DBAL\Driver\PDOPgSql\Driver;
use \PDO;
use \PDOException;
use function defined;

/**
 * Driver that connects through pdo_pgsql
 *
 * Forked original PostgreSQL driver, extended to have a possibility to pass raw PDO DSN to be
 * able to connect via Unix socket
 */
class PostgreSQLDoctrineDriver extends Driver
{
    /**
     * {@inheritdoc}
     */
    public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
    {
        try {
            $pdo = new PDOConnection(
                $_SERVER['POSTGRES_DB_PDO_DSN'] ?? '',
                $username,
                $password,
                $driverOptions
            );

            if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')
                && (! isset($driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES])
                    || $driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES] === true
                )
            ) {
                $pdo->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
            }

            /* defining client_encoding via SET NAMES to avoid inconsistent DSN support
             * - the 'client_encoding' connection param only works with postgres >= 9.1
             * - passing client_encoding via the 'options' param breaks pgbouncer support
             */
            if (isset($params['charset'])) {
                $pdo->exec('SET NAMES \'' . $params['charset'] . '\'');
            }

            return $pdo;
        } catch (PDOException $e) {
            throw DBALException::driverException($this, $e);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'pdo_pgsql';
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-11-26 22:18:15

您可以将套接字路径作为主机放置,例如:

代码语言:javascript
复制
doctrine:
    dbal:
        host: /var/pgsql_socket
票数 2
EN

Stack Overflow用户

发布于 2019-11-08 06:32:13

您可以通过unix_socket配置选项配置套接字,该选项似乎可以在一段时间前使用:https://symfony.com/doc/current/reference/configuration/doctrine.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58743591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档