Как это на что. Апач это вебсервер, у него другое назначение, каждый воркер обслуживает запросы от сокета. Принял запрос, максимально быстро выдал контент, ожидаем следующий запрос. Чем дольше сервер возвращает контент, тем хуже, тем меньше запросов способен обработать вебсервер. А ты предлагаешь на длительной время отхавать у него целый воркер :)
А если подобных фоновых задач не одна, а несколько? Все шансы задосить сервак :)
По теме, поскольку нужно непросто запустить задачу в фоне, но и еще и от имени другого пользователя, имхо самым оптимальным способом будет стартовать скрипт бинарником с suid-ом. Как вариант:
starter.c
int main() {
signal(SIGHUP, SIG_IGN);
int pid = fork();
if(pid != 0) {
printf("background task started pid: %d\n", pid);
exit(0);
}
setsid();
system("/usr/bin/php -f /path/to/task.php >/dev/null 2>&1");
exit(0);
}
компилим бинарник
# gcc -o starter starter.c
устанавливаем владельцем файла пользователя, от чьего имени его нужно запускать, например root
# chown root:root starter
устанавливаем suid бит
# chmod u+s starter
теперь запустить задачу можно просто
system('/path/to/starter');
путь к php скрипту задачи зашиваем жестко в бинарник, передавать аргументом нельзя в целях безопасности, так же все исполняемые задачей скрипты, не должны быть доступны на запись кому попало, владельцем на них всех должен быть выставлен root, или тот юзер от имени которого они запускаются, права на запись соответственно только для владельца. Это кстати также касается запуска задачи через ssh, который хотел применить ТС.