Я в коде для таких задач имею скриптик лет 10 назад написанный:
public static function execAsDeamon($script,$params = null){
$tmp = '';
foreach((array)$params as $k=>$v){
if(empty($k)){
continue;
}
$tmp .= ' -'.$k.'='.$v;
}
$tmp = g::options('core.php-cli-starter', 'php').' '.$script.' '.srv::$HOST_TYPE.$tmp.' > /dev/null &';
exec($tmp);
}
Когда запрашивают тяжелую статистику по ресурсу, а она еще не рассчитывалась, то я запускаю этим методом скрипт расчета, он в отдельном потоке выполняет свою работу. а я клиенту отдаю страницу "ой, надо немного подождать" с тегом мета перезагрузки страницы и кнопкой "не могу больше ждать. покажи статистику." для немедленного перегруза страницы.
Само собой, в логике приложения есть предохранитель от многократного запуска демона.