From: | ljb <ljb220(at)mindspring(dot)com> |
---|---|
To: | pgsql-php(at)postgresql(dot)org |
Subject: | How to cancel a query when user stops a page load |
Date: | 2003-12-20 02:24:34 |
Message-ID: | bs0bt1$2i35$1@news.hub.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-php |
This is in response to a message posted here asking how to have PHP cancel
an in-progress PostgreSQL query when the user hits STOP on their web
browser, or clicks to another page. Here is my solution. This is not a
complete script, just fragments, but it should help.
To the original poster: you can't just check pg_connection_busy() once,
then call pg_get_result(), because pg_get_result will block waiting for the
query to finish, and the user abort won't be seen. You must loop as shown
below. [P.S. Do you really have a "select count(*) from test" which takes
2 minutes? Wow. I had trouble coming up with a test case taking 20 seconds
on a PII-350MHz.]
.........................................
# Make a global flag to indicate query in progress:
$in_progress = 0;
# Register a function to be called at shutdown:
function halted()
{
global $db, $in_progress;
if ($in_progress) {
pg_cancel_query($db);
}
}
register_shutdown_function('halted');
# Connect to the database and check for errors (OMITTED):
$db = pg_connect(...);
# Issue the query and set the flag telling the shutdown function to cancel it:
if (!pg_send_query($db, $query)) { ... error handling omitted ... }
$in_progress = 1;
# Now we loop waiting for the query to complete or the user to cancel.
# Display a message to the user telling how long it has been.
flush();
$base = time();
while (pg_connection_busy($db)) {
sleep(2);
$delta = time() - $base;
echo "<br>... $delta seconds\n";
flush();
}
# All done, and it took $delta seconds.
# Don't let the shutdown handler try to cancel the query:
$in_progress = 0;
# Fetch the query result:
$r = pg_get_result($db);
# Check $r for errors (omitted), display results (omitted).
.........................................
From | Date | Subject | |
---|---|---|---|
Next Message | Seader, Cameron | 2003-12-20 21:44:31 | PostgreSQL and Bitwise and with int8 field |
Previous Message | Seader, Cameron | 2003-12-19 14:42:55 | int8 and PHP problems |