- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Уважаемые форумчане. Прошу помочь советом в следующей ситуации:
Имеется довольно тяжелый скрипт на php, который запускается по крону в определенное время. Он обрабатывает данные и складывает их в базу. В связи с тем, что данные могут быть весьма разного обьема, скрипт не успевает их обработать за время max_execution_time = ххх (из php.ini) или за время set_time_limit(хх) (установленное в самом скрипте); он вылетает с ошибкой Fatal error: Maximum execution time of хх seconds exceeded in ххх. При этом естественно аварийно закрываются все открытые базы данных и файлы, и теряются все обработанные данные, которые скрипт не успел записать.
Можно ли обьявить/описать/создать блок кода или функцию, которая бы определяла, что наступило максимальное время работы скрипта или перехватывала это сообщение, записывала данные в базу(пусть даже и не все) и заканчивала работу? Либо же обьявить перехватчик этой ошибки Maximum execution time exceeded и направить его в функцию, см. выше.
Или же придется тупо проверять время выполнения скрипта(которое не может быть заранее известно) временными функциями и по концу его заканчивать работу.
Буду благодарен за дельные советы и замечания.
ЗЫ. Все возможные таймауты выставлены, подсчет примерного времени работы скрипта в зависимости от входных данных обьективно не рационален. Просьба также не предлагать увеличить время выполнения функцией set_time_limit(ххх).
Просьба также не предлагать увеличить время выполнения функцией set_time_limit(ххх).
Я не буду это предлогать, но скажите почему, хостер блокирует ?
Можно ли обьявить/описать/создать блок кода или функцию, которая бы определяла, что наступило максимальное время работы скрипта или перехватывала это сообщение, записывала данные в базу(пусть даже и не все) и заканчивала работу? Либо же обьявить перехватчик этой ошибки Maximum execution time exceeded и направить его в функцию, см. выше.
Или же придется тупо проверять время выполнения скрипта(которое не может быть заранее известно) временными функциями и по концу его заканчивать работу.
1) Самое разумное: самим выставить set_time_limit в максимально допустимое значение. Допустим 60 секунд. После этого в скрипте, в критических моментах - проверять текущее время и если что аварийно завершаться. Лучше с заведомо достаточным запасом по времени.
2) "Трюковой" подход (ибо функция всё-таки не для этого). Пример:
Смысл примера вот в чем. Сначала включается буферизация вывода и функция которая вызывается когда этот вывод начинается. Когда time_limit кончится, то начнется вывод контента (он передается как параметр этой функции) и в этой функции можно сделать что угодно. Пример наглядно покажет, что даже после уже вывода фатальной ошибки о конце скрипта - будет выполнена функция abazaba и сделана приписка к контенту.
3) "Стандартный" способ: register_shutdown_function - просто регистрируете функцию и она вызывается на событии заверешния скрипта. В отличии от пункта 2 - контент уже будет выкинут в аутпут. Пункт 2 как ни странно надежнее по нашему опыту, да и контент позволяет ловить.
P.S.: Способы 2 и 3 могут не сработать если хостер просто прибивает сами процессы, а не отдает это на откуп php.
P.P.S.: Учтите, что файловые операции, операции с БД и удалёнными урлами могут не учитываться в set_time_limit. Например, если Вы ждете ответа от удалённого сервера 50 секунд, то для скрипта это время не будет считаться. Если у Вас граббер - это может быть актуально.
Я не буду это предлогать, но скажите почему, хостер блокирует ?
Как правило что бы не блокировать если что клиента или его скрипты экстренно:) Нужен хостеру подвисший скрипт, создающий постоянную нагрузку? А клиенту нужен жестко прибитый скрипт по только что названной причине? Лимиты на время выполнение достаточно мягкий способ избежать проблем из-за ошибок в скриптах приводящих к их подвисанию и в то же время они легко обходятся в случае необходимости, плюс это способ - дающий понять клиенту сколько у его скрипта есть гарантированного времени на работу.