Re: How to cancel a query when user stops a page load
От | Noel |
---|---|
Тема | Re: How to cancel a query when user stops a page load |
Дата | |
Msg-id | 3FE62BB1.2050600@med.monash.edu.au обсуждение исходный текст |
Ответ на | How to cancel a query when user stops a page load (ljb <ljb220@mindspring.com>) |
Список | pgsql-php |
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@postgresql.org 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
В списке pgsql-php по дате отправления: