RE: flushing AJAX scripts

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

 



As I said if the client abort or close the connection, PHP does not finish its execution, it simply exits from the script.

If you run this code and you close the browser before 10 seconds the file will never be created, for example.

<?php
function write($stuff){
    echo    $stuff, PHP_EOL."<br />", ob_get_clean();
    @ob_flush();
    @flush();
};
$seconds = 10;
ob_start();
while($seconds){
    write('I should do something in '.($seconds--).' seconds');
    sleep(1);
}
$fp = fopen('test.txt', 'wb');
fwrite($fp, gmdate('Y-m-d H:i:s'));
fclose($fp);
write('Finished!');
?>

but, obviously, if you launch a query via PHP and PHP is killed, MySQL will go on performing the query until it has been fully executed but if PHP would like to do something else after that query and again, the client leave the page, PHP will never perform that operation.

So, unless you are not creating a flagged report in one shoot and your system is clever enough to understand what's going on in a secure way, I still suggest delayed, crontabbed or extra threads for this task which does not suite/scale in a webpage.
In my company we are using multi threading tasks with real status able to constantly monitor the situation but we are in C# over SQLServer.
I did something similar in PHP and Ajax and MySQL in the old company but trust me, it is not simple if you want to be consistent.

Regards.



> Date: Sat, 28 Mar 2009 00:45:27 -0400
> From: jbw2003@xxxxxxxxxxxxx
> To: an_red@xxxxxxxxxxx
> Subject: Re: RE:  flushing AJAX scripts
> 
> Well, the point was that I had tried the first way, submitting one AJAX 
> request and waiting for it to finish and it was timing out, probably on 
> my firewall which it shouldn't have - but it did. The reports can take 
> 10 seconds or 10 minutes to create. Doing it this way I can still load 
> the report even if the original request shuts down after 3-4 minutes.
> 
> Jim
> 
> Andrea Giammarchi wrote:
> > Sorry Jim, I meant Jim when I wrote Kim ... and 
> > Phico: http://webreflection.blogspot.com/2008/04/phomet-changes-name-so-welcome-phico.html
> >
> > Regards
> >
> >   
> >> From: an_red@xxxxxxxxxxx
> >> To: php-general@xxxxxxxxxxxxx
> >> Date: Fri, 27 Mar 2009 15:55:28 +0100
> >> Subject: RE:  flushing AJAX scripts
> >>
> >>
> >> Sorry, Kim, but why on earth you are polling with a second request to know when the first one has finished?
> >> I mean, when the first request inserts data in the database that's it, you'll manage the end of the request.
> >>
> >> $A --->  do stuff; do stuff; do stuff; report ready;
> >> $B ---> report ready?
> >> $B ---> report ready?
> >> $B ---> report ready?
> >> $B ---> report ready?
> >> report ready; ---> notification to A
> >> $B ---> report ready;
> >>
> >> the report ready, if it is when $A request has been finished, will be in $A, the polling via $B is absolutely useless, imo.
> >>
> >> There is no timeout from Ajax, it simply keep waiting, but obviously if your PHP has max_execution_time 30 seconds and the script execution takes more than 30 seconds there's no polling that could save you.
> >>
> >> The same if the user closes the browser, connection lost, bye bye response.
> >>
> >> To have a notice, you need Comet, try out Phico but still, a page that requires that much is not suitable for the web. Report creation should be a cronjob in a separed thread if it is that stressful.
> >>
> >> Regards
> >>
> >>     
> >>> Date: Fri, 27 Mar 2009 10:47:10 -0400
> >>> From: jbw2003@xxxxxxxxxxxxx
> >>> To: an_red@xxxxxxxxxxx
> >>> CC: php-general@xxxxxxxxxxxxx
> >>> Subject: Re: RE:  flushing AJAX scripts
> >>>
> >>> My page submits the AJAX request to complete a report that takes some 
> >>> time, and upon completion stores results in a database. A second AJAX 
> >>> request polls every 5 seconds and queries the database if the report is 
> >>> ready. This hopefully will get around any timeout problems I am having 
> >>> with a long running request, and seems to be working. It looks like I 
> >>> can accept the default behavior for now. I don't depend on getting a 
> >>> response from the original request, but is there a point where the AJAX 
> >>> response script will be stopped either by Apache or PHP before it can 
> >>> insert into the database?
> >>>
> >>> Jim
> >>>       
> >> _________________________________________________________________
> >> News, entertainment and everything you care about at Live.com. Get it now!
> >> http://www.live.com/getstarted.aspx
> >>     
> >
> > _________________________________________________________________
> > Drag n’ drop—Get easy photo sharing with Windows Live™ Photos.
> >
> > http://www.microsoft.com/windows/windowslive/products/photos.aspx
> >   
> 
> 
> -- 
> James (Jim) B. White
> tel: (919)-380-9615
> homepage: http://jimserver.net/ 
> 

_________________________________________________________________
More than messages–check out the rest of the Windows Live™.
http://www.microsoft.com/windows/windowslive/

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux