dimastik1986
@dimastik1986
учусь

Два вопроса: как настроить постоянный онлайн в облаке и перехват fatal ошибок php?

Приветствую, прошу помочь разобраться в двух вопросах

как настроить постоянный онлайн в облаке?
я зарегистрировал и запустил облако на яндекс на базе windows, мне нужно запустить вечный цикл + в паре с одной программой, которая на обычном хостинге не будет работать, только на локал! + еще пара моментов, короче в облаке - удобнее, что на домашнем пк... Все ок, ток не пойму, как запустить и выйти, чтобы скрипт в браузере продолжал обрабатывать цикл? Я запускаю, закрываю окно и все останавливается, хотя само облако - онлайн...

и второй вопрос, скорее просьба - перехват fatal ошибок php, поделитесь простеньким перехватчиком ошибок,
а то не получается пока найти скрипт - легкий для восприятия! При выполнении цикла из первого вопроса, так бывает, что скрипт выплевывает ошибку и цикл прерывается. Я хотел бы сделать, чтобы в случае ошибки, он ее просто игнорировал или запускал сам себя по новой.

пы: как долго может работать "бесконечный" цикл, как часто его стоит прерывать и запускать заново, нужно ли как-то чистить, например, кэш при этом? интересует именно бесконечный цикл, запуск по расписанию не совсем подходит!

Спасибо!
  • Вопрос задан
  • 84 просмотра
Решения вопроса 3
@Enj0y
1) Костыль какой то, нужно больше инфы, RDP? Постоянный цикл в браузере не сделать, там таймауты будут.
2) Можно повесить свой обработчик
set_error_handler()
https://www.php.net/manual/ru/function.set-error-h...
Но критические ошибки он не ловит, так как если ошибка например в синтаксисе то и компилить ваш обработчик PHP уже не сможет.
Ответ написан
@rPman
Вам нужно работу выполнять не в скрипте, запускаемом браузере, а отдельно запускаемом вами, в идеале в виде службы (в windows это делается средствами планировщика задач или программ типа srvstart или anyservice, уже нет таких либо 10-ку не поддерживают, не задавался никогда такими глупостями).

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

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

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

Правильный подход - обрабатывайте ВСЕ ошибки, по максимуму, и не тупо запись в лог а именно пытайтесь понять что случилось и как правильно было бы дальше себя вести программе. Причем ВСЕ это значит включая глюки вашей внутренней инфраструктуры (базы данных, проблемы авторизации, отсутствие интернета, ошибка в конфиг файле и прочее прочее), с обязательной попыткой связаться с вами, причем не бесконечно в цикле а отдельным воркером, следящим чтобы не было повторных сообщений об одной и той же ошибке (например про частые отключения интернета лучше сообщать сообщением не чаще чем раз в час с коротким резюме о количестве разрывов связи и с чем именно, чтобы было видно что это косяк интернета или службы, с которой вы пытались связаться).
Ответ написан
SerafimArts
@SerafimArts
Senior Notepad Reader
и второй вопрос, скорее просьба - перехват fatal ошибок php, поделитесь простеньким перехватчиком ошибок,

while (true) {
    try {
        $your->codeHere();
    } catch (\Throwable $e) {
        //
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы