tags:

views:

1149

answers:

6

Suppose there are two scripts Requester.php and Provider.php, and Requester requires processing from Provider and makes an http request to it (Provider.php?data="data"). In this situation, Provider quickly finds the answer, but to maintain the system must perform various updates throughout the database. Is there a way to immediately return the value to Requester, and then continue processing in Provider.

Psuedo Code

Provider.php 
{
   $answer = getAnswer($_GET['data']);
   echo $answer;
   //SIGNAL TO REQUESTER THAT WE ARE FINISHED
   processDBUpdates();
   return;
}
+1  A: 

You can flush the output buffer with the flush() command.
Read the comments in the PHP manual for more info

Peter Olsson
A: 

Split the Provider in two: ProviderCore and ProviderInterface. In ProviderInterface just do the "quick and easy" part, also save a flag in database that the recent request hasn't been processed yet. Run ProviderCore as a cron job that searches for that flag and completes processing. If there's nothing to do, ProviderCore will terminate and retry in (say) 2 minutes.

Michał Rudnicki
+1  A: 

I think you'll need on the provider to send the data (be sure to flush), and then on the Requester, use fopen/fread to read an expected amount of data, so you can drop the connection to the Provider and continue. If you don't specify an amount of data to expect, I would think the requester would sit there waiting for the Provider to close the connection, which probably doesn't happen until the end of it's run (ie. all the secondary work intensive tasks are complete). You'll need to try out a few POC's..

Good luck.

DreamWerx
+2  A: 

I use this code for running a process in the background (works on Linux).

The process runs with its output redirected to a file.

That way, if I need to display status on the process, it's just a matter of writing a small amount of code to read and display the contents of the output file.

I like this approach because it means you can completely close the browser and easily come back later to check on the status.

Mark Biek
+1  A: 
William OConnor - csevb10
A: 

I'm going out on a limb here, but perhaps you should try cURL or use a socket to update the requester?

Extrakun