|
pg_pconnect
Open a persistent PostgreSQL connection
(PHP 4, PHP 5)
Example 1959. Using pg_pconnect()<?php Code Examples / Notes » pg_pconnecttumor
Well, pg_pconnect is ALMOST identical to pg_Connect. The difference is that when you make something nasty with the PSQL server (like reseting it) then pg_pConnect still tryes to use the previous connection. This creates some nice broken_pipe errors (and maybe some more). I do not know that resetting the http server would help it, I think it would. As pg_connect creates a new connection every time (that is why it is \"so slow\") this error does not occurs with it. Really this is not a bug, but perphaps you could do something with it, and it may help some people working with recently changing pg security settings... Good bug hunting...
etsysx dot i dot hate dot spam
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. clecerf
The "Options" parameter. It seems to worry some users... Refering to the libpq doc of Postgres, it is used to set trace/debug options to be sent to backend. Probably no use for a PHP3 programmer. spiros ioannou
Instead 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. garrett
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. zarathustra dot heuser
I was having the same problem with persistent connections to an Oracle database. Compiling PHP with the option --enable-sigchild solved the problem.
dmitri
How to reset persistent connections: killall -USR1 httpd herve
For resetting an apache web server and in same time the persistent connections you may use : ./apachectl graceful raggaflo
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" dennis fogg
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 info
A contribution to the transaction issue raised by "garrett at bgb dot cc". In a German book about PostgreSQL in connection with PHP (Cornelia Boenigk, PostgreSQL - Grundlagen, Praxis, Anwendungsentwicklung mit PHP) one can read in chapter 19.3 about persistent connections: If the page processing aborts and the transaction is not finished yet, the next script using the same persistent connection will be considered as the continuation of the transaction. In particular a lock of a table will persist. The explanation is as follows: After the abort of the script no COMMIT or ROLLBACK was sent to the db server. The author describes a hint to avoid the scenario above: You can create a function for resolving transactions and locks erroneously not closed. For invoking the function after execution of a script it has to be registered with the function register_shutdown_function(): http://de2.php.net/manual/en/function.register-shutdown-function.php ts
<?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 ' pgsql.allow_persistent: ' . ini_get('pgsql.allow_persistent'); echo ' pgsql.max_persistent: ' . ini_get('pgsql.max_persistent'); echo ' pgsql.max_links: ' . ini_get('pgsql.max_links'); echo ' '; // 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 ', 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 // ?> |
Change Languagepg_affected_rows pg_cancel_query pg_client_encoding pg_close pg_connect pg_connection_busy pg_connection_reset pg_connection_status pg_convert pg_copy_from pg_copy_to pg_dbname pg_delete pg_end_copy pg_escape_bytea pg_escape_string pg_execute pg_fetch_all_columns pg_fetch_all pg_fetch_array pg_fetch_assoc pg_fetch_object pg_fetch_result pg_fetch_row pg_field_is_null pg_field_name pg_field_num pg_field_prtlen pg_field_size pg_field_table pg_field_type_oid pg_field_type pg_free_result pg_get_notify pg_get_pid pg_get_result pg_host pg_insert pg_last_error pg_last_notice pg_last_oid pg_lo_close pg_lo_create pg_lo_export pg_lo_import pg_lo_open pg_lo_read_all pg_lo_read pg_lo_seek pg_lo_tell pg_lo_unlink pg_lo_write pg_meta_data pg_num_fields pg_num_rows pg_options pg_parameter_status pg_pconnect pg_ping pg_port pg_prepare pg_put_line pg_query_params pg_query pg_result_error_field pg_result_error pg_result_seek pg_result_status pg_select pg_send_execute pg_send_prepare pg_send_query_params pg_send_query pg_set_client_encoding pg_set_error_verbosity pg_trace pg_transaction_status pg_tty pg_unescape_bytea pg_untrace pg_update pg_version |