I think, if all you need is to have the script finish i.e. you dont have to give any response to the browser when it's done, you can just use ignore_user_abort() - if you read the manual carefully, you'll see that the script stops executing when it times out, even when you don't hit the stop button. It will timeout when the broser has not recieved any output in a certain time. (I think it's a browser setting.)
Another way of doing it:
exec('echo "cp somebigfile somewhereelse" |at now');
This can't time out, and will continue, even if the webserver is stopped. You might have to add the apache user (www-data?) to /etc/at.allow for it to work.
And then, just output to the browser that it has started. If you click refresh, you can make a test in the script somewhere above, comparing the file sizes, and if different, say that work is in progress, and give the % of done.