За последние 24 часа нас посетили 30488 программистов и 1808 роботов. Сейчас ищут 822 программиста ...

Поругать идею.

Тема в разделе "Прочее", создана пользователем Simpliest, 18 дек 2009.

  1. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Пока вижу один недостаток: это не фича, это баг. Он не документирован, значит его могут исправить в любой момент

    Ну а во-вторых существует очень удобной механизм Exception'ов, зачем городить огород?
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Это не баг, это фича: если включено отображение ошибок, то сначала происходит output, а потом - завершение работы скрипта (иначе кто будет делать output?) Если поток вывода передается пользователькой функции, то логично, что она будет выполнена.
    Экспешены рулят, но фаталы они не перехватывают.
    Вопрос в другом - зачем перехватывать фаталы, если есть удобные логи?
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    1. фатальные ошибки не ловятся обычными методами.

    2. Exception да, но речь идет именно о изоляции разнородных модулей, т.е. тех же плагинов сторонних разработчиков :)
    Я бы не сильно доверял людям.

    Да бог с ним с логом.
    Если собирать монолитную систему то из-за одного модуля (например, погоды) у тебя упадет вся страница. Хотя показать есть что :)

    А так, тут основной момент не столько в обработке именно ob_handler'ом, сколько изолированное выполнение части системы.
    Т.е. тот же AJAX, SOAP, RPC дадут ровно такую же возможность. Естественно за счет деградации производительности.
     
  5. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    На то они и фатальные, это не E_NOTICE. Если уж мы стараемся E_NOTICE не допускать то что же скажем о fatal error?

    Перехватка фатальной ошибки не поможет, например:
    1. Запускаем головную программу, лимитированную скажем 8мб-ми.
    2. Подключаем плагин, который, зараза съедает все 8мб.
    3. Вызывается Fatal-error
    4. Перехватываем его.

    Теперь вопрос, сколько у нас осталось оперативной памяти и что мы можем с ней сделать?

    Возможно гибридный вариант будет подходящим решением. Есть доверенные плагины, подключаемые инклудом, есть "защищенный режим" (SOAP и все остальное)
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Ты не обратил внимания (блин, посмотри код :) ). Плагину выделяются все 8мб минус немного на обработку (собственно надо всего лишь запомнить информацию об ошибке).

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

    Вопрос в том что при наличии 20 модулей это будут 20 редиректов :) С другой стороны аякс запросов тоже было бы 20 :) как я и говорил производительность деградирует.
     
  7. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Simpliest
    Все модули в один ajax-зарос?
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Угу, чтобы рухнул один какой-нибудь модуль-партизан и мы вообще нихрена не получили бы :)

    Тогда уж все инклюдами в основном файле :) :) и идею в топку :)
     
  9. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    у меня есть некоторая изоляция. Из шаблонов могу дергать блоки. Если в этом блоке будет фатальная ошибка - основная страница отрендерится, но без этого блока.

    Но думаю, что этого недостаточно. А делать серьезней - лень.
     
  10. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Simpliest
    Блин, а как WordPress со своей тучей плагинов работает? Ничего? Хорошо? вот и ладненько.

    Если кто вдруг хочет изолированный процесс, то вариант один: fork, и не важно как он будет сделан. И быстродействия можно добиться нормального, конечно не так шелково как несколько инклудов, но достаточно оперативно. У нас уже есть прослойки nginx + apache + fastcgi, потери между общением этих процессов ( по сравнению с общей производительностью скриптов ) минимальны

    А абьюзить баги (фичи) в php это не выход. Они на корню могут убить проект при переходе на очередную версию. При этом получим мифическое быстродействие, кучу головной боли в виде разруливания архитектуры и псевдобезопасность кода.
     
  11. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Что ты делаешь в своих шаблонах, что может вызвать фатальную ошибку? Наркотики перевозишь?

    Чушь

    Извините за категоричность.

    Далее: модуль паразит может съесть 7.5 мб оперативной памяти
    следующий по списку модуль вылетает с ошибкой
    мы редиректим страницу с именем второго модуля
    модуль паразит опять съедает 7.5 мб памяти
    ...
     
  12. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ну, например, из шаблона я вызываю показ менюшки на основе структуры страниц. Там че-то пошло не так и...
    Вообще я не знаю, у меня все нормально, фаталов в продакшене нету. Ха-ха!
     
  13. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1.  
    2. <?php
    3.     error_reporting(E_ALL);
    4.     ini_set('display_errors', 0);
    5.  
    6.     function shutdown(){
    7.         $isError = false;
    8.         if ($error = error_get_last()){
    9.             switch($error['type']){
    10.                 case E_ERROR:
    11.                 case E_CORE_ERROR:
    12.                 case E_COMPILE_ERROR:
    13.                 case E_USER_ERROR:
    14.                     $isError = true;
    15.                     break;
    16.             }
    17.         }
    18.  
    19.         if ($isError){
    20.             echo "Script execution halted ({$error['message']})";
    21.         } else {
    22.             echo "Script completed";
    23.         }
    24.     }
    25.  
    26.     register_shutdown_function('shutdown');
    27. ?>
    28.  
    Перехватывает фатальные ошибки
    https://php.ru/manual/function.set-error-handler.html#88401

    PS> 80% моих аргументов растворились :)
     
  14. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Мда. :) еще один способ. В принципе - любопытно.
    Впрочем, вопрос был не только в перехвате :)

    Upd: надо будет ее помучать на досуге
     
  15. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Simpliest
    Имхо спокойно перехватывай фатальные ошибки. С отключением модуля вызвавшего ошибку, логированием её и посылкой письма. Первый клиент, который сгенерирует может увидеть 500 (хотя и не обязательно это будет 500, вполне вероятно что был вызов неопределенной функции, без которой остальные модули продолжат выполнять свои действия). Остальные пользователи ничего не почувствуют, кроме отсутствующего информера о погоде. Сложнее дело обстоит когда модуль является основным контентом
     
  16. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    ну, идеальных решений не бывает :)

    впрочем я не работаю с плагинами сторонних разработчиков, так что данный топик был больше разминкой для ума :)
     
  17. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    а зачем вообще перехватывать фатальные ошибки? из-за плагинов? так нафиг такие плагины нужны тогда...
    я лично юзаю такую штуку для фатальных ошибок:
    PHP:
    1. <?php
    2. ini_set('display_errors', 'off');
    3. ini_set('html_errors', 'off');
    4. ini_set('log_errors', 'on');
    5. ini_set('error_log', LOG_FILE);
    6. ini_set('ignore_repeated_errors', 'off');
    7. ini_set('ignore_repeated_source', 'on');
    8.  
    Всё остальное ловлю "перехватчиками"
     
  18. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Гм. Выдумывать "зачем" - можно бесконечно :)

    Например тот же ресайз картинок может обломаться даже если ты проверяешь размер изображения, только потому, что, как справедливо заметил выше topas, какая-то другая часть приложения съела нужную память :)

    Т.е. если у тебя отдельные части не изолированы друг от друга и выполняются в одном адресном пространстве тебе таки надо что-то делать с фатальными ошибками, которые могут возникнуть как результат синергии :)

    Но речь, вобщем-то, не столько о перехвате :) я уже писал. Просто мысль родилась как раз из топиков о перехвате фатальных ошибок. Но сама мысль - о изоляции отдельных процессов в приложении :)
     
  19. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    это наверняка навеяно гугл хромом, в котором вкладки в отдельных процессах выполняются. =)
     
  20. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Хром скомуниздил эту идею у IE, впрочем как и многое другое :)
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ресурсозатратно, нафигнужноеслимногобольшихприложений работает отлично и так :)
     
  22. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    говнокод какой то

    почему переносов так мало, отступы непонятно как стоят. читать код невозможно

    и вообще, где ЗендФреймвок?
     
  23. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Бгг :)

    С кодом тебе не повезло, ты наблюдал его после изнасилования придирками Sta1ker'a :)
     
  24. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    использовал идею автора, теперь крит.ошибки выводятся нормальным сообщением.

    кст, не в курсе, если в этом операторе освободить часть памяти, по-unset-ив некоторые классы - туда вызов функции можно будет впихнуть?
     
  25. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Я впихивал. Но не факт что это всегда сработает.

    Ты почитай весь топик, там topas нашел более кошерный вариант.