我正在尝试使用Unix连接到PostgreSQL。我认为只有一种方式可以连接到主机上的数据库,但是应用程序在Docker中(我遵循的原则是不包含不复制的数据库)。我用的是Symfony 4和最新的原则。
我用PDO对原始PHP进行了测试,它可以工作。我不知道如何执行Doctrine来使用unix套接字。
<?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());其结果与预期的一样:
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中配置了什么,我都得到了以下信息:
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的内容:
pdo-pgsql://yyyy:xxxxx@/var/run/postgresql:5432/zzzzz
pgsql:host=/var/run/postgresql;user=xxxx;dbname=zzzz;password=yyyy发布于 2019-11-08 06:13:18
在调试Doctrine的驱动程序之后,我创建了一个不那么优雅的解决方案,但是它仍然可以工作,并且可以改进。
我不喜欢访问驱动程序本身中的环境变量,但这可能是可以改进的。
doctrine.yaml
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: truePostgreSQLDoctrineDriver.php
<?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';
}
}发布于 2019-11-26 22:18:15
您可以将套接字路径作为主机放置,例如:
doctrine:
dbal:
host: /var/pgsql_socket发布于 2019-11-08 06:32:13
您可以通过unix_socket配置选项配置套接字,该选项似乎可以在一段时间前使用:https://symfony.com/doc/current/reference/configuration/doctrine.html
https://stackoverflow.com/questions/58743591
复制相似问题