Вам нужно работу выполнять не в скрипте, запускаемом браузере, а отдельно запускаемом вами, в идеале в виде службы (в windows это делается средствами планировщика задач или программ типа srvstart или anyservice, уже нет таких либо 10-ку не поддерживают, не задавался никогда такими глупостями).
Задания из браузера оставляйте где-то в очереди (в базе данных или в файле, дописывая в конец), пусть главный цикл берет задания от туда, помечает какие уже исполнил или из-за ошибок, и брал следующую или ждал появление таковой.
Чтобы после фатальной ошибки ваша программа снова была перезапущена - запускайте ее в бесконечном цыкле из другого процесса, хоть на том же php или cmd:
@echo off
:loop
php main.php
goto :loop
приведенный пример кривой, не умеет отслеживать причину ошибки и советую между запусками вставить хотя бы 1 секундную паузу, чтобы не за-ддосить вашу базу данных или еще какой глюк не словить из-за слишком частых запросов, но как пример показывает что к чему. Но это приложение не должно быть слишком умным, чтобы не допустить и в нем ошибки и фатальные случаи.
Ваш сервис долгой обработки должен при запуске попытаться понять, первый это его запуск или после фатальной ошибки, и что делать.
Правильный подход - обрабатывайте ВСЕ ошибки, по максимуму, и не тупо запись в лог а именно пытайтесь понять что случилось и как правильно было бы дальше себя вести программе. Причем ВСЕ это значит включая глюки вашей внутренней инфраструктуры (базы данных, проблемы авторизации, отсутствие интернета, ошибка в конфиг файле и прочее прочее), с обязательной попыткой связаться с вами, причем не бесконечно в цикле а отдельным воркером, следящим чтобы не было повторных сообщений об одной и той же ошибке (например про частые отключения интернета лучше сообщать сообщением не чаще чем раз в час с коротким резюме о количестве разрывов связи и с чем именно, чтобы было видно что это косяк интернета или службы, с которой вы пытались связаться).