Re: How to cancel a query when user stops a page load

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



It works great, Thanks heaps, so simple once you know how :).

Cheers

ljb wrote:

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.]

Counting through a table with >20mill rows, 20 times :), to show stats which are dynamic.


.........................................

# 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).

.........................................

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
     subscribe-nomail command to majordomo@xxxxxxxxxxxxxx so that your
     message can get through to the mailing list cleanly
Thanks once again :)

--
Noel Faux
Department of Biochemistry and Molecular Biology
Monash University
Clayton 3168
Victoria
Australia




[Index of Archives]     [Postgresql General]     [Postgresql Admin]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Databases]     [Yosemite Backpacking]     [Postgresql Jobs]

  Powered by Linux