As long as the browser is receiving text, I dont think it cares how long th epage loading goes on. The only reason a browser times out is cos either the HTTP connection gets dropped between it and the server, or because no ouput has been received for X amount of time.
As long as your script doesn't time out (set_time_limit(0)), and it produces some output to keep the browser happy, then it should all go smoothly.
As a point though - if you want a kind of percentage thing to happen, I think you're gonna have to do some crafty Javascript work to update a variable when you dump more output out which in turns refreshed the display on the browser.
Another thing to bear in mind with this is that the browser caches all output until either the stream is broken, or it's buffer gets full. It then flushes output to the display and resets the buffer. You can get around this by filling the buffer till it flushes (with spaces or somet like that - since spaces wont display in browser). This is a code snippet I used before when sending 1000's of emails:
/*Dump some page output out up here*/
// Let this script execute forever if it has to
set_time_limit(0);
// Make sure that the buffer is flushed and the browser does not cache any content so thatthe page output will display before we begin our work
print(str_repeat(" ", 300) . "\n");
flush(); // Flush all output to make sure
// Send the mails out - this func sends regular output (spaces) to the browser to keep the browser from timing out
$arrValues = do_send_campaign_mail($campaign, $sendto, $value, $S_cid, true);
// when the mails are finished then send the page somewhere else
print("<script language=\"Javascript\">
<!--
document.location='finished.php';
//-->
</script>");
Hope this helps