dimastik1986
@dimastik1986
учусь

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

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

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

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

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

Спасибо!
  • Вопрос задан
  • 74 просмотра
Решения вопроса 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
Laravel Framework Russian Community
и второй вопрос, скорее просьба - перехват fatal ошибок php, поделитесь простеньким перехватчиком ошибок,

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

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

Войти через центр авторизации
Похожие вопросы
Алгоритмика Москва
от 110 000 до 160 000 руб.
N1.RU Новосибирск
от 100 000 руб.
Living Core Казань
от 50 000 руб.