Мое решение для запуска заданий PHP в фоновом режиме - просто сделать так, чтобы сам скрипт выполнял новый запрос, выполняющий фактическое задание.
Код, который я использовал ранее, следующий: я не уверен, что есть более элегантные решения ... но в прошлом он работал более чем достаточно для меня. Причина, по которой я использую fsock, а не file_get_contents () и т. Д., Конечно, так что мне не придется ждать окончания работы (что может нанести ущерб цели)
$sock = fsockopen("127.0.0.1", 80);
fwrite($sock, "GET /yourjoburl/ HTTP/1.1\r\n");
fwrite($sock, "Host: yourdomain.com\r\n");
fwrite($sock, "Connection: close\r\n");
fwrite($sock, "\r\n");
fflush($sock);
fclose($sock);
Итак, другой скрипт записывает результаты и ход выполнения в базу данных или что-то еще ... также помните, что MySQL поддерживает мьютексы, что означает, что вы можете легко предотвратить одновременное выполнение нескольких заданий ... или чтобы другие сценарии могли дождаться завершения задания.
PS. Причина, по которой я лично избегаю exec и всего такого, заключается в том, что работать с разными серверами, разными настройками, разными операционными системами и т. Д. Это просто хлопотно. Это работает одинаково на всех хостах, которые позволяют открывать сокеты. Хотя вам может потребоваться добавить закрытый ключ к запросу, который вы проверяете в задании, или проверить IP-адрес вызывающего абонента, чтобы другие пользователи не могли запускать задания.
РЕДАКТИРОВАТЬ: Это не проверено, но должно работать, если вы хотите переслать также куки, включая куки сессии.
$sock = fsockopen("127.0.0.1", 80);
fwrite($sock, "GET /yourjoburl/ HTTP/1.1\r\n");
fwrite($sock, "Host: yourdomain.com\r\n");
fwrite($sock, "Cookie: " . $_SERVER['HTTP_COOKIE'] . "\r\n");
fwrite($sock, "Connection: close\r\n");
fwrite($sock, "\r\n");
fflush($sock);
fclose($sock);