2013-05-08 3 views
0

У меня есть php-файл, который я написал, который проверяет наличие новых файлов в определенных папках, а затем отправляет электронные сообщения с самых последних файлов с момента последнего запуска. Иногда это может быть 10-15 файлов, прикрепленных к электронной почте. Я использую swiftmailer для отправки писем.Лучший способ продолжить синхронизированный скрипт в php?

Этот скрипт может работать до 50 клиентов, и каждый клиент может иметь файлы, которые необходимо отправить по электронной почте. Часто, это будет тайм-аут через PHP и выбросить ошибку. Я пытался отслеживать, где он остановился, написав номера клиентов в файл через php.

Как я могу использовать PHP, чтобы сказать «Если есть резкий выход или ошибка, повторите запуск этого файла».

Другой способ сказать, что это .... когда я получаю ошибку тайм-аута или любую другую ошибку, могу ли я просто перезагрузить другой файл PHP, чтобы продолжить, где я остановился?

Это не похоже на самый чистый способ выполнить мою задачу, поэтому я открыт для предложений.

+0

Вы можете использовать исключения? try/catch style может быть –

+0

сделать журнал, файл которого запущен и который завершен – Ibu

+1

Не можете ли вы увеличить срок? –

ответ

3

Вы можете отслеживать файлы, подлежащие обработке, путем записи в плоский файл или базу данных, удаляя запись для каждого файла по мере его завершения. Когда скрипт перезагрузится, прочитайте список файлов, которые нужно обработать, и продолжите, где вы остановились.

Кроме того, рассмотрите возможность увеличения тайм-аута в php.ini, если вы знаете, что ваш скрипт регулярно требует больше времени.

В том случае, если вам необходимо перезапустить скрипт постоянно, пока обработка не будет завершена, рассмотрим следующий сценарий:

  • Запустить скрипт через хрон каждые пять минут (или соответствующий интервал)
  • Сценарий пишет PID-файл
    • Если скрипт обнаружил, что файл PID уже существует, предыдущий скрипт разбился, поэтому снова запустите обработку журнала.
  • Проверьте базу данных за последнее успешное время работы.
    • Если последнее успешное время выполнения было меньше минимального (интервал, в котором вы сейчас запускаете скрипт), удалите PID и выйдите.
    • Если последнее успешное время работы было больше минимального, обработайте файлы, удалите PID и выйдите.

Использование PID файл не является строго необходимым; вы можете получить ту же информацию, проверив, существует ли журнал и есть записи. Однако использование PID является традиционным и обеспечивает быстрый и дешевый метод определения успешного завершения предыдущего процесса.

+0

У меня уже есть вход в систему, но проблема заключается в перезапуске скрипта. Этот скрипт запускается по расписанию, а не по человеку. Поэтому, если система запускает файл file.php, но он выходит из строя, мне нужно его повторно запустить file.php, пока не будет больше сбоев. – user1424232

+0

@ user1424232 Взгляните на мой обновленный ответ. Вы можете часто запускать сценарий, проверять наличие сбоев и выходить до тех пор, пока «реальное» время для запуска сценария не произойдет снова. –

+0

Спасибо @George Cummins, это вкратце, что я сейчас делаю, я просто надеялся на более легкую функцию «On crash, do this». Спасибо за подробный ответ. – user1424232