(PHP 4, PHP 5, PHP 7, PHP 8)
pg_pconnect — Establece una conexión PostgreSQL persistente
pg_pconnect() devuelve una instancia PgSql\Connection de conexión persistente.
Si se realiza una segunda llamada a pg_pconnect() con el mismo
connection_string como una conexión
existente, se devolverá la conexión existente a menos que se pase
PGSQL_CONNECT_FORCE_NEW a
flags.
Para activar las conexiones persistentes, la directiva de configuración
pgsql.allow_persistent
del php.ini debe establecerse en On (que es su valor por omisión).
El número máximo de conexiones puede limitarse mediante
la directiva de configuración
pgsql.max_persistent
en el archivo php.ini (por omisión, su valor es -1, es decir, sin límite).
El número total de conexiones puede configurarse con la directiva
pgsql.max_links del archivo
php.ini.
pg_close() no cerrará las conexiones persistentes generadas por pg_pconnect().
connection_string
La cadena connection_string puede estar vacía para
utilizar todos los parámetros por omisión o puede contener uno o
varios parámetros de configuración separados por espacios.
Cada parámetro de configuración tiene la forma code =
valor. Los espacios alrededor del signo igual son opcionales.
Para escribir un valor vacío o un valor que contenga espacios,
rodee este valor con comillas simples, por ejemplo: code =
'un valor'. Las comillas simples y las barras invertidas dentro
del valor deben escaparse con una barra invertida, es decir
\' y \\.
Las palabras clave actualmente reconocidas son :
host, hostaddr,
port,
dbname, user,
password,
connect_timeout,
options, tty (ignorado),
sslmode,
requiressl (obsoleto, utilice
sslmode) y
service.
La lista de estos argumentos depende de la versión del servidor PostgreSQL.
flags
Si PGSQL_CONNECT_FORCE_NEW se pasa como argumento,
entonces se creará una nueva conexión, incluso si la cadena
connection_string es idéntica a la de la conexión existente.
Devuelve una instancia de PgSql\Connection en caso de éxito, o false si ocurre un error.
| Versión | Descripción |
|---|---|
| 8.1.0 | Ahora devuelve una instancia de PgSql\Connection ; anteriormente, se devolvía un resource . |
Ejemplo #1 Ejemplo con pg_pconnect()
<?php
// conexión a una base de datos llamada "marie"
$dbconn = pg_pconnect("dbname=marie");
// conexión a una base de datos llamada "marie" en el host "localhost" en el puerto "5432"
$dbconn2 = pg_pconnect("host=localhost port=5432 dbname=marie");
// conexión a una base de datos llamada "marie" en el host "mouton" con un
// nombre de usuario y una contraseña
$dk
// conexión a una base de datos llamada "test" en el host "mouton" con un
// nombre de usuario y una contraseña
$conn_string = "host=mouton port=5432 dbname=test user=agneau password=bar";
$dbconn4 = pg_pconnect($conn_string);
?>As of Aug 2007, some suggestions from the postgresql forums
on pg_pconnect(), faster postgres connections, and connection pooling:
Summary:
http://archives.postgresql.org/pgsql-general/2007-08/msg01406.php
Good details: http://archives.postgresql.org/pgsql-general/2007-08/msg00660.php
Also: http://archives.postgresql.org/pgsql-general/2007-08/msg01489.php You should not use pg_pconnect - it's broken. It will work but it doesn't really pool, and it's behaviour is unpredictable. It will only make you rise the max_connections parameter in postgresql.conf file until you run out of resources (which will slow your database down).
If you have many concurrent connections to your database, you should use the PostgreSQL connection pooler PgBouncer (developed by the Skype-team). When using pgbouncer, make sure you use pg_connect and NOT pg_pconnect. Also, make sure you close your connections with pg_close.
* PGBouncer homepage:
http://developer.skype.com/SkypeGarage/DbProjects/PgBouncer
* PostgreSQL pooling article by Last.fm:
http://www.last.fm/user/Russ/journal/2008/02/21
/zd_postgres_connection_pools:_pgpool_vs._pgbouncerInstead of reducing MaxClients in apache you may try to
reduce pgsql.max_links in php to at least the number of
postmasters. It should work and leave
you with more available httpds for static html pages.<?php
//
// Using pg_pconnect in a class.
//
// Why this? Because the manual says:
//
// If a second call is made to pg_pconnect() with the same
// connection_string as an existing connection, the existing
// connection will be returned unless you pass
// PGSQL_CONNECT_FORCE_NEW as connect_type.
//
// This is not always true.
//
/**
* MyClassA creates a postgresql connection using pg_pconnect
* and stores the resulting resource id to $this->conn
*/
class MyClassA
{
function __construct($connection_string)
{
$this->conn =
pg_pconnect($connection_string)
or die('Wrong CONN_STRING');
}
}
//
// Showing current php.ini settings to be sure
// that persistent connections s are allowed.
// -1 means 'unlimited'
//
echo '<br>pgsql.allow_persistent: ' . ini_get('pgsql.allow_persistent');
echo '<br>pgsql.max_persistent: ' . ini_get('pgsql.max_persistent');
echo '<br>pgsql.max_links: ' . ini_get('pgsql.max_links');
echo '<br><br>';
// setting one custom connection string for all objects
// (modify $connection_string to fit your needs)
$connection_string =
'host=localhost port=5432' .
' dbname=test user=test password=test';
//
// Creating 10 MyClassA objects using the same $connection_string
//
$objArr = Array();
for ($i = 0; $i < 10; $i++)
{
$objArr[] = new MyClassA($connection_string);
}
//
// Human readable result:
//
foreach($objArr as $id => $object)
{
printf(
'%s: Object %s: using db %s<br>',
get_class($object), $id, $object->conn
);
}
/* ------------------------------------------------------------- */
// The result
// pgsql.allow_persistent: 1
// pgsql.max_persistent: -1
// pgsql.max_links: -1
//
// MyClassA: Object 0: using db Resource id #2
// MyClassA: Object 1: using db Resource id #3
// MyClassA: Object 2: using db Resource id #4
// MyClassA: Object 3: using db Resource id #5
// MyClassA: Object 4: using db Resource id #6
// MyClassA: Object 5: using db Resource id #7
// MyClassA: Object 6: using db Resource id #8
// MyClassA: Object 7: using db Resource id #9
// MyClassA: Object 8: using db Resource id #10
// MyClassA: Object 9: using db Resource id #11
//
/* ------------------------------------------------------------- */
//
// Each MyClassA object will use its _own_ database Resource id
//
?>If a transaction is in progress when page processing ends, is it aborted before the connection placed bak in the pool? Or is the connection added "as is"?
It would seem that the correct thing to do is to always 'ABORT' before adding to the pool.
As a note, this would be a good time to check and see if the connection is still open before readding it. Thus allowing closed connections to be cleaned up over time, instead of hanging around for ever as they do now.Be careful when using Apache/PHP dynamic module/PostgreSQL :
in httpd.conf (Apache conf) default MaxClients is 150, whereas default PG's max_connections is 32 which is much fewer than 150. You have to set max_connections to at least MaxClients (and pg's shared_buffers to 2*max_connections at least) to avoid PG's errors with pg_pconnect like : "Sorry, too many clients already connected"To setup a high availability server with apache as a static module and postgreSQL, change httpd.conf and set MaxClients to less than max postgreSQL simultaneous connections (like 32 or 64).
This way pg_pconnect will allways return a valid handle under heavy traffic or under a request flow attack without wasting resources and without connection problems.