Skip to content

Commit dd69a29

Browse files
committed
Merge pull request #3515 from morozov/persistent-connections
Implemented support for persistent connections in PDO and mysqli drivers
2 parents 9a2e4cf + 3e691d2 commit dd69a29

File tree

6 files changed

+54
-1
lines changed

6 files changed

+54
-1
lines changed

lib/Doctrine/DBAL/Driver/Mysqli/MysqliConnection.php

+6-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public function __construct(array $params, $username, $password, array $driverOp
5656

5757
$socket = $params['unix_socket'] ?? ini_get('mysqli.default_socket');
5858
$dbname = $params['dbname'] ?? '';
59+
$host = $params['host'];
60+
61+
if (! empty($params['persistent'])) {
62+
$host = 'p:' . $host;
63+
}
5964

6065
$flags = $driverOptions[static::OPTION_FLAGS] ?? 0;
6166

@@ -67,7 +72,7 @@ public function __construct(array $params, $username, $password, array $driverOp
6772
set_error_handler(static function () {
6873
});
6974
try {
70-
if (! $this->conn->real_connect($params['host'], $username, $password, $dbname, $port, $socket, $flags)) {
75+
if (! $this->conn->real_connect($host, $username, $password, $dbname, $port, $socket, $flags)) {
7176
throw MysqliException::fromConnectionError($this->conn);
7277
}
7378
} finally {

lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Doctrine\DBAL\Driver\AbstractMySQLDriver;
99
use Doctrine\DBAL\Driver\PDOConnection;
1010
use Doctrine\DBAL\Driver\PDOException;
11+
use PDO;
1112

1213
/**
1314
* PDO MySql driver.
@@ -19,6 +20,10 @@ class Driver extends AbstractMySQLDriver
1920
*/
2021
public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
2122
{
23+
if (! empty($params['persistent'])) {
24+
$driverOptions[PDO::ATTR_PERSISTENT] = true;
25+
}
26+
2227
try {
2328
$conn = new PDOConnection(
2429
$this->constructPdoDsn($params),

lib/Doctrine/DBAL/Driver/PDOOracle/Driver.php

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Doctrine\DBAL\Driver\AbstractOracleDriver;
99
use Doctrine\DBAL\Driver\PDOConnection;
1010
use Doctrine\DBAL\Driver\PDOException;
11+
use PDO;
1112

1213
/**
1314
* PDO Oracle driver.
@@ -24,6 +25,10 @@ class Driver extends AbstractOracleDriver
2425
*/
2526
public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
2627
{
28+
if (! empty($params['persistent'])) {
29+
$driverOptions[PDO::ATTR_PERSISTENT] = true;
30+
}
31+
2732
try {
2833
return new PDOConnection(
2934
$this->constructPdoDsn($params),

lib/Doctrine/DBAL/Driver/PDOPgSql/Driver.php

+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ class Driver extends AbstractPostgreSQLDriver
2121
*/
2222
public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
2323
{
24+
if (! empty($params['persistent'])) {
25+
$driverOptions[PDO::ATTR_PERSISTENT] = true;
26+
}
27+
2428
try {
2529
$connection = new PDOConnection(
2630
$this->_constructPdoDsn($params),

lib/Doctrine/DBAL/Driver/PDOSqlsrv/Driver.php

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Doctrine\DBAL\Driver\PDOSqlsrv;
66

77
use Doctrine\DBAL\Driver\AbstractSQLServerDriver;
8+
use PDO;
89
use function is_int;
910
use function sprintf;
1011

@@ -28,6 +29,10 @@ public function connect(array $params, $username = null, $password = null, array
2829
}
2930
}
3031

32+
if (! empty($params['persistent'])) {
33+
$pdoOptions[PDO::ATTR_PERSISTENT] = true;
34+
}
35+
3136
return new Connection(
3237
$this->_constructPdoDsn($params, $dsnOptions),
3338
$username,

tests/Doctrine/Tests/DBAL/Functional/ConnectionTest.php

+29
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@
77
use Doctrine\DBAL\Connection;
88
use Doctrine\DBAL\ConnectionException;
99
use Doctrine\DBAL\Driver\Connection as DriverConnection;
10+
use Doctrine\DBAL\Driver\PDOConnection;
1011
use Doctrine\DBAL\DriverManager;
1112
use Doctrine\DBAL\Platforms\AbstractPlatform;
13+
use Doctrine\DBAL\Platforms\SqlitePlatform;
14+
use Doctrine\DBAL\Platforms\SQLServerPlatform;
1215
use Doctrine\Tests\DbalFunctionalTestCase;
16+
use Doctrine\Tests\TestUtil;
1317
use Error;
1418
use Exception;
19+
use PDO;
1520
use RuntimeException;
1621
use Throwable;
1722
use function in_array;
@@ -313,4 +318,28 @@ public function testDeterminesDatabasePlatformWhenConnectingToNonExistentDatabas
313318

314319
$connection->close();
315320
}
321+
322+
public function testPersistentConnection() : void
323+
{
324+
$platform = $this->connection->getDatabasePlatform();
325+
326+
if ($platform instanceof SqlitePlatform
327+
|| $platform instanceof SQLServerPlatform) {
328+
self::markTestSkipped('The platform does not support persistent connections');
329+
}
330+
331+
$params = TestUtil::getConnectionParams();
332+
$params['persistent'] = true;
333+
334+
$connection = DriverManager::getConnection($params);
335+
$driverConnection = $connection->getWrappedConnection();
336+
337+
if (! $driverConnection instanceof PDOConnection) {
338+
self::markTestSkipped('Unable to test if the connection is persistent');
339+
}
340+
341+
$pdo = $driverConnection->getWrappedConnection();
342+
343+
self::assertTrue($pdo->getAttribute(PDO::ATTR_PERSISTENT));
344+
}
316345
}

0 commit comments

Comments
 (0)