note 123568 added to function.pg-connect-poll
| From: | VLroyrenn@php.net | Date: | Wed, 30 Jan 2019 17:31:45 +0000 |
| Subject: | note 123568 added to function.pg-connect-poll | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-210145@lists.php.net to get a copy of this message | ||
So the documentation on this function is pretty barebones (as is the case for a lot of thin PHP
wrappers around C functions), but from what I've gathered by reading the libpq doc and trying
various things, you should probably know the following :
* Polling the connection while the underlying socket is busy will cause the connection (or at least
the polling, I'm not sure) to fail.
* As stated by the libpq documentation, "do not assume that the socket remains the same across
PQconnectPoll calls"
* The socket will become ready after every change in connection status, so the connection must be
polled multiple times until the function returns "polling_ok" or
"polling_failed".
* "polling_active" can never be returned by libpq and has literally never been used
anywhere ever, it has been an unused constant since day 1.
What you need to do is use pg_socket get a PHP stream object corresponding to the current socket and
wait after it before polling, like so:
<?php
function pg_wait_connection_ready($conn) {
assert(is_resource($conn));
assert(get_resource_type($conn) === "pgsql link" || get_resource_type($conn) ===
"pgsql link persistent");
// "On the first iteration, i.e. if you have yet to call PQconnectPoll, behave as if it last
returned PGRES_POLLING_WRITING."
$poll_outcome = PGSQL_POLLING_WRITING;
while (true) {
$socket = [pg_socket($conn)]; // "Caution: do not assume that the socket remains the same
across PQconnectPoll calls."
$null = [];
if ($poll_outcome === PGSQL_POLLING_READING) {
stream_select($socket, $null, $null, 5);
$poll_outcome = pg_connect_poll($conn);
} else if ($poll_outcome === PGSQL_POLLING_WRITING) {
stream_select($null, $socket, $null, 5);
$poll_outcome = pg_connect_poll($conn);
} else {
break;
}
}
}
$db = pg_connect($conn_string, PGSQL_CONNECT_ASYNC);
// Do things while the connection is getting ready
pg_wait_connection_ready($db);
pg_query($sql);
?>
----
Server IP: 208.43.231.9
Probable Submitter: 82.199.157.35 (proxied: 207.96.202.138)
----
Manual Page -- http://php.net/manual/en/function.pg-connect-poll.php
Edit -- https://master.php.net/note/edit/123568
Del: integrated -- https://master.php.net/note/delete/123568/integrated
Del: useless -- https://master.php.net/note/delete/123568/useless
Del: bad code -- https://master.php.net/note/delete/123568/bad+code
Del: spam -- https://master.php.net/note/delete/123568/spam
Del: non-english -- https://master.php.net/note/delete/123568/non-english
Del: in docs -- https://master.php.net/note/delete/123568/in+docs
Del: other reasons-- https://master.php.net/note/delete/123568
Reject -- https://master.php.net/note/reject/123568
Search -- https://master.php.net/manage/user-notes.php