Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перехватить Fatal error 
:(
    Опции темы
capitan
Дата 18.12.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Мне просто не понятно, что значит обработать? Записать в лог, прервать выполнение? Перехватить её можно, но вот что дальше делать?
PM MAIL WWW ICQ   Вверх
sTa1kEr
Дата 18.12.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



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

PM MAIL   Вверх
Simpliest
Дата 18.12.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(sTa1kEr @  18.12.2009,  15:45 Найти цитируемый пост)
 продолжить выполнение программы.

Вот тут твоя ошибка smile

Выболнение программы в веб это обычно череда запросов (ведь программа это не 1 урл) smile Т.е. показать на одном из этапов окошко с ошибкой и возможность идти куда-то дальше - будет нормальным


--------------------
user posted image
PM   Вверх
Fubu_By
Дата 18.12.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 14.2.2007

Репутация: нет
Всего: 0



тут уже лучше сразу посчитать, чтобы память не забивать под ноль
а сначало я и хотел чтото вроде try использовать, но чтобы он заработал надо много возни такак php сам исключения не кидает((( так бы подошёл


--------------------
PM MAIL WWW   Вверх
sTa1kEr
Дата 18.12.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(Simpliest @  18.12.2009,  11:56 Найти цитируемый пост)
Редирект можно попробовать сделать куда-нибудь smile хотя не проверял. 

Можно, только это большого смыла в этом не вижу.

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

Добавлено через 5 минут и 5 секунд
Цитата(Simpliest @  18.12.2009,  17:50 Найти цитируемый пост)
Вот тут твоя ошибка smile

Выболнение программы в веб это обычно череда запросов (ведь программа это не 1 урл) smile Т.е. показать на одном из этапов окошко с ошибкой и возможность идти куда-то дальше - будет нормальным 

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

Добавлено через 7 минут и 9 секунд
Т.е. несомненно, что можно построить веб приложение так, что бы для пользователя фатальные ошибки остались незамеченными, но это не значит "обработать ошибку".
PM MAIL   Вверх
Simpliest
Дата 18.12.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



sTa1kEr, чтобы не переливать из пустого в порожнее.

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

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


--------------------
user posted image
PM   Вверх
sTa1kEr
Дата 18.12.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Бррр... опять демагогия пошла smile 

Сухие факты:
Фатальная ошибка - это Fatal Error, вне зависимости от назначения скрипта. Точка.
Fatal Error - в PHP скрипте перехватить и обработать никак нельзя. Точка.
Избежать возникновения Fatal Error при работе с изображениями можно сл. способами:
   a. Ограничить размер обрабатываемых картинок.
   б. Использовать консольные утилиты.
   в. ...

Это сообщение отредактировал(а) sTa1kEr - 18.12.2009, 17:33
PM MAIL   Вверх
Simpliest
Дата 18.12.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(sTa1kEr @  18.12.2009,  16:29 Найти цитируемый пост)
Фатальная ошибка - это Fatal Error, вне зависимости от назначения скрипта. Точка.
Fatal Error - в PHP скрипте перехватить и обработать никак нельзя. Точка.

Врешь ведь smile нагло smile

Вот тебе скрипт, который резервирует память и обрабатывает фатальную ошибку котеровским способом smile
http://simpliest.co.cc/consumer.php

Исходники
http://simpliest.co.cc/provider.phps
http://simpliest.co.cc/consumer.phps



Это сообщение отредактировал(а) Simpliest - 18.12.2009, 18:21


--------------------
user posted image
PM   Вверх
sTa1kEr
Дата 18.12.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(Simpliest @  18.12.2009,  19:20 Найти цитируемый пост)
Вот тебе скрипт, который резервирует память и обрабатывает фатальную ошибку котеровским способом smile

Нет. К этому времени скрипт уже за-вер-шен. Обрабатывает ее уже веб-сервер.
PM MAIL   Вверх
Simpliest
Дата 18.12.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Не-не-не smile
$_SESSION устанавливает тоже веб-сервер? smile
Ты бы хоть исходники глянул smile

Добавлено через 2 минуты и 11 секунд
А то ты так договоришься до того, что exception, кинутый в одном классе (один файл), и, обработанный в другом классе (другой файл), тоже обрабатывает веб-сервер smile


--------------------
user posted image
PM   Вверх
sTa1kEr
Дата 18.12.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(Simpliest @  18.12.2009,  20:32 Найти цитируемый пост)
А то ты так договоришься до того, что exception, кинутый в одном классе (один файл), и, обработанный в другом классе (другой файл), тоже обрабатывает веб-сервер smile 

Не притворяйся, ты понял, что я имел ввиду.

Код

try {
... 
} catch (Exception $ex) {
...
}

Этот код перехватывает и обрабатывает ошибки.

Код

function ob_handler($context) {
   preg_replace(...);
   ...
   return $context;
}
ob_start('ob_handler');

Это ###код по Котерову. Он подменяет текст отправляемый клиенту после завершения работы скрипта. Ни чего общего с обработкой ошибок он не имеет.

О чем тут еще можно спорить?

Добавлено через 51 секунду
По понятным причинам второй пример никогда не используется грамотными программистами на продакшене. 
PM MAIL   Вверх
Simpliest
Дата 18.12.2009, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(sTa1kEr @  18.12.2009,  19:26 Найти цитируемый пост)
Он подменяет текст отправляемый клиенту после завершения работы скрипта. Ни чего общего с обработкой ошибок он не имеет.

Ты бы код глянул, а потом бы пузыри пускал про подменяет smile У меня ничего там не подменяется вовсе smile

Из минусов - вижу проблему с множественными редиректами и усложнение логики программы. Это куда важнее выдуманной тобой подмены чего-то там.

Из плюсов - полную изоляцию произвольного скрипта от приложения.

Таким способом можно свободно интегрировать произвольные модули сторонних разработчиков не беспокоясь что они обвалят тебе всю страницу.
Впрочем, этого же эффекта можно достичь применением аякса, SOAP/RPC. Естественно платить будем производительностью во всех случаях.

Вобщем, спасибо, и тебе и Ипатьеву и двум топикстартерам smile Дали возможность подумать над вопросом smile


--------------------
user posted image
PM   Вверх
capitan
Дата 18.12.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Все это хорошо, но как я понял вся соль в памяти. Её может и не хватить просто.

Цитата

Нужно понимать, что этот метод работает при условии, что память закончилась при выделении достаточно крупного куска (в нашем случае - 10К). В противном случае PHP может не хватить ресурсов даже на то, чтобы просто инициировать запуск обработчика выходного потока. 

PM MAIL WWW ICQ   Вверх
sTa1kEr
Дата 18.12.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(Simpliest @  18.12.2009,  22:03 Найти цитируемый пост)
Ты бы код глянул

Ну что-ж. Ты сам попросил smile 

Глянул. Беру свои слова назад, у Котерова не ###код smile 
Ответь мне, пожалуйста, что произойдет если:
  • В коде встретится
    Код

    ob_flush();
  • Или
    Код

    session_write_close();
  • Или
    Код

    echo $undefined_variable;
  • Код

    trigger_error(...);
  • Нужно обработать различные ошибки
  • Скрипт работает через CLI (cron'овский скрипт)
В общем, за изобретение пять, а по предмету два smile

Добавлено через 8 минут и 41 секунду
И потом, что-бы и как бы ты не наворотил с буферизацией - это не решит основную проблему:
Цитата(sTa1kEr @  18.12.2009,  17:45 Найти цитируемый пост)
продолжить выполнение программы


PM MAIL   Вверх
Simpliest
Дата 19.12.2009, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(sTa1kEr @  18.12.2009,  21:57 Найти цитируемый пост)
Глянул. Беру свои слова назад, у Котерова не ###код 

Я смотрю, ты по прежнему думать не хочешь и продолжаешь упорствовать вместо признания поражения smile

Вот, кстати, эк меня утерли smile на http://www.php.ru/forum/viewtopic.php?p=192997#192997
http://php.net/manual/en/function.set-erro...ndler.php#88401
http://php.net/register_shutdown_function

Вполне можно использовать вместо ob_handler для обработки фатальной ошибки.

Теперь, что касается пузырьков...

Цитата(sTa1kEr @  18.12.2009,  21:57 Найти цитируемый пост)
ob_flush();

А что изменится? Я в любом случае делаю редирект. Более того, ob_start могут быть вложенными.

Цитата(sTa1kEr @  18.12.2009,  21:57 Найти цитируемый пост)
session_write_close();

Очередное буквоедство smile ай-яй-яй ;)
Да, абсолютно, плевать что будет с сессией, я лишь использовал ее в качестве промежуточного звена. 
Это может быть и временный файл, и GET параметры и БД, и мемкеш.
Специально же в один из редиректов засунул GET параметр в качестве примера другого способа.

Но пятница... я понимаю smile
Более того...  никто ведь не помешает мне сделать  session_start(); еще раз непосредственно в обработчике.

Цитата(sTa1kEr @  18.12.2009,  21:57 Найти цитируемый пост)
echo $undefined_variable;

Цитата(sTa1kEr @  18.12.2009,  21:57 Найти цитируемый пост)
trigger_error(...);

С этим справится стандартный обработчик.

Цитата(sTa1kEr @  18.12.2009,  21:57 Найти цитируемый пост)
Скрипт работает через CLI (cron'овский скрипт)

И? Будет лишь другой способ передачи сообщений и управления между компонентами приложения. Суть не измениться.

Я смотрю, в хайлоаде работают исключительно с маленькими скриптами и монолитными приложениями состоящими из одного файла? Мысль о том, что приложение может состоять из нескольких частей ты упорно отвергаешь? smile

Изнасилованный твоим буквоедством исходник smile
http://simpliest.co.cc/provider.phps
Добавлены вызовы функций из твоего списка.
Для проверки разницы работы между ob_handler и register_shutdown_function - нужно закомментировать строку
Код

register_shutdown_function('my_shutdown');


Цитата(sTa1kEr @  18.12.2009,  21:57 Найти цитируемый пост)
И потом, что-бы и как бы ты не наворотил с буферизацией - это не решит основную проблему:
Цитата(sTa1kEr @  18.12.2009,  17:45 )
продолжить выполнение программы


Фронтэнд
http://simpliest.co.cc/consumer.phps
остался без изменений

Все работает. Даже после падения части приложения в виде provider.php

Что-то твои "сухие факты" перешли  в разряд фантазий ;) 

Как итог - Фатальные ошибки несомненно могут быть перехвачены и обработаны при модульной архитектуре приложения и изоляции процесса выполнения отдельных модулей. В качестве метода инстанцирования модуля может использоваться fork, redirect, ajax-request, SOAP/RPC запрос. Способов - миллион. Равно как и методов передачи сообщений между отдельными частями приложения.

Это сообщение отредактировал(а) Simpliest - 19.12.2009, 00:53


--------------------
user posted image
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1830 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.