Re: apache+php overloading when user clicks many times on the same link
| From: | George Whiffen | Date: | Fri, 16 Nov 2001 17:34:02 +0000 |
| Subject: | Re: apache+php overloading when user clicks many times on the same link | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-74900@lists.php.net to get a copy of this message | ||
Peter Frlicka wrote:
>
> Hello.
>
> What does apache + php do if the user refreshes a page 10 times in a while
> before the scripts finishes? do all 10 .php scripts finish or do the first 9
> get aborted? how can i solve the problem that when someone clicks a lot on a
> link (always the same link) the server gets overloaded (because the action
> taken in the script is somehow memory consuming). i need to ensure a user
> (www) can run only one instance of a .php script.
>
> Peter Frlicka
See http://www.php.net/manual/en/features.connection-handling.php
I'm worried about why the user is clicking so much. If your connection/processing really is
going
to take a long time you could consider sending them the first bit of your page as quickly as
possible using "flush()". That will take away any buttons/links they've clicked on
(but not
Refresh), and at least make them feel something is happening!
However multiple clicking is a general problem with no great solutions. It's a particularly
important issue for on-line E-commerce applications when it is not only vital that the php script
complete but also that it should not be repeated. For that you almost have to use a database to
record "transactions" (or at least the session variables which identify a
"transaction").
I typically do the following :
1. set ignore_user_abort
2. check to see if we have a record of this transaction, if we do check to see if it is complete.
If it's complete
take them to a results/end page, if it's not complete take them to a holding page with an
automatic
META-REFRESH to
the same url.
3. if we have no record of the transaction, create one, do the work, mark the transaction as
complete and show them the results/end page.
If the user only clicks once, everything proceeds smoothly and they get their results page as
normal.
If the user clicks two or more times they go to a "holding" page with an automatic refresh
which
keeps showing the same holding page until the first script completes and the next refresh takes them
to the results.
This is basically a safe approach but it's significant work unless you really need it!
George