I have a PHP script that takes a long time (5-30 minutes) to complete. Just in case it matters, the script is using curl to scrape data from another server. This is the reason it’s taking so long; it has to wait for each page to load before processing it and moving to the next.
I want to be able to initiate the script and let it be until it’s done, which will set a flag in a database table.
What I need to know is how to be able to end the http request before the script is finished running. Also, is a php script the best way to do this?
Advertisement
Answer
Certainly it can be done with PHP, however you should NOT do this as a background task – the new process has to be dissociated from the process group where it is initiated.
Since people keep giving the same wrong answer to this FAQ, I’ve written a fuller answer here:
http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html
From the comments:
The short version is
shell_exec('echo /usr/bin/php -q longThing.php | at now');
but the reasons “why”, are a bit long for inclusion here.
Update +12 years
While this is still a good way to invoke a long running bit of code, it is good for security to limit or even disable the ability of PHP in the webserver to launch other executables. And since this decouples the behaviour of the log running thing from that which started it, in many cases it may be more appropriate to use a daemon or a cron job.