Форум русской поддержки Joomla!® CMS
17.08.2017, 21:35:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Основной курс по Joomla
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор

отображение ошибок на php7

 (Прочитано 448 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« : 27.07.2017, 20:11:27 »

Доброго.

Чистая голая установка 3.7.4, независимо от настройки "Сообщения об ошибках" (Нет, Максимум, Для разработчиков и т.п.) при фатальных ошибках всегда показывается текст ошибки, и не показывается ни файл, ни строка. Например

Показать текстовый блок

У меня у одного, или что то поломалось?
Записан
ProtectYourSite
Живу я здесь
******

Репутация: +51/-4
Offline Offline

Сообщений: 838



« Ответ #1 : 27.07.2017, 20:16:35 »

А делал включить, что покажет?
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #2 : 27.07.2017, 20:17:58 »

Всегда одно и тоже, на настройку "Сообщения об ошибках" никакой реакции нет вообще. Только если включить Отладку в настройках, то можно увидеть стек ошибок, и там будет и имена файлов, и номера строк. Но во-первых держать отладку открытой не всегда удобно, а во-вторых меня откровенно говоря больше волнует вопрос, почему в принципе текст ошибки виден, если в настройках задано Нет.
Записан
ProtectYourSite
Живу я здесь
******

Репутация: +51/-4
Offline Offline

Сообщений: 838



« Ответ #3 : 27.07.2017, 20:18:54 »

Дебаг, телефон гад исправил, трассировки ошибки должно  выдать.
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #4 : 27.07.2017, 20:22:45 »

Понятно. Автозамена задолбала реально, отрубаю ее всегда. Будем считать что я прочел мысль Azn По дебагу сам написал выше.
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Online Online

Пол: Мужской
Сообщений: 2123



« Ответ #5 : 27.07.2017, 21:49:27 »

Это кривой темплейт error.php
Лечиться дабвленем этого
Код
if ( version_compare(phpversion(), '7.0.0', '>=') )
{
   // Add the file and line at which the error occured
   $error_file = $this->error->getFile();
   $error_line = $this->error->getLine();
   if ( $error_file )
   {
       echo '<pre>' .$error_file .':'. $error_line . '</pre>';
   }
}
Записан
vipiusss
Профи
********

Репутация: +324/-10
Offline Offline

Пол: Мужской
Сообщений: 5844


Skype: renor_


« Ответ #6 : 27.07.2017, 22:24:20 »

А почему у меня таких нет ошибок? 2 раза чистую 3.7.4 ставил.
Или ошибка возникает из-за чего-то?
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Online Online

Пол: Мужской
Сообщений: 2123



« Ответ #7 : 27.07.2017, 22:44:04 »

А почему у меня таких нет ошибок? 2 раза чистую 3.7.4 ставил.
Или ошибка возникает из-за чего-то?
Суть в возникновении ошибки. А в ее отображение. Хз с какйо версии я заметил только 3.7.2 во фронте fatal error выдоиться в шаблоне и без указания имени файла и строчки
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #8 : 27.07.2017, 22:46:36 »

Это кривой темплейт error.php
Лечиться дабвленем этого
та понятно, да. но во-первых в админке тоже самое, и если на фронте шаблон все равно переделывать, то в админке как бы... а во-вторых опять таки, больше даже интересует вопрос почему нет реакции на настройку "Сообщения об ошибках".

Хз с какйо версии я заметил только 3.7.2 во фронте fatal error выдоиться в шаблоне и без указания имени файла и строчки
админка тоже. и важна именно версия php, не Joomla. на php5 все будет обычно. связано я так понимаю с изменениями с перехватом ошибок.
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Online Online

Пол: Мужской
Сообщений: 2123



« Ответ #9 : 27.07.2017, 23:01:43 »

та понятно, да. но во-первых в админке тоже самое, и если на фронте шаблон все равно переделывать, то в админке как бы... а во-вторых опять таки, больше даже интересует вопрос почему нет реакции на настройку "Сообщения об ошибках".
админка тоже. и важна именно версия php, не Joomla. на php5 все будет обычно. связано я так понимаю с изменениями с перехватом ошибок.
Ну это я нашел в баг репорте, так что надеюсь починять. В админке кстати вроде была строка.. Ну а если нет то лечиться так же. Просто я первый раз с этим на фронте столкнулся. А про версии php вкурсе, там на нее собсвенно проверка. Насчет реакции на параметр вроде все верно. fatal То при любом варианте должен выводиться, хотя мб еще настройки php важны
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #10 : 27.07.2017, 23:10:23 »

Насчет реакции на параметр вроде все верно. fatal То при любом варианте должен выводиться, хотя мб еще настройки php важны
Неа, не при любом. Раньше был например просто белый экран, если показ ошибок был выключен. А если включен - то выводился как обычно файл, номер строки, описание ошибки. А уже детализация (простой, максимум, для разработчиков) играла роль что именно показывать, какой уровень - только error, или и warning, или и notice, и т.д. А сейчас всегда выводится описание ошибки, даже если Сообщения об ошибках - Нет.
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Online Online

Пол: Мужской
Сообщений: 2123



« Ответ #11 : 27.07.2017, 23:28:11 »

Неа, не при любом. Раньше был например просто белый экран, если показ ошибок был выключен. А если включен - то выводился как обычно файл, номер строки, описание ошибки. А уже детализация (простой, максимум, для разработчиков) играла роль что именно показывать, какой уровень - только error, или и warning, или и notice, и т.д. А сейчас всегда выводится описание ошибки, даже если Сообщения об ошибках - Нет.
Ну раньше все белого экрана боялись. вот и сделали чтобы не писали типа белый экран... Ну да это уже фруд. Баг репорт на эту тему я видел, вроде.
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #12 : 27.07.2017, 23:38:12 »

не этот случайно https://issues.joomla.org/tracker/joomla-cms/10732 закрытый? Azn
Записан
ProtectYourSite
Живу я здесь
******

Репутация: +51/-4
Offline Offline

Сообщений: 838



« Ответ #13 : 28.07.2017, 00:18:44 »

ТОже не сразу понял, что хотелось.
ТС хочет не отображения строк и файла, а чтобы при выставлении показа ошибок на "Нет", ошибка вообще не показывалась.
И я поддерживаю это, посторонним не за чем смотреть лишнюю информацию.
Надо бы посмотреть как формируется $this->error->getMessage()
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Online Online

Пол: Мужской
Сообщений: 2123



« Ответ #14 : 28.07.2017, 00:31:27 »

не этот случайно https://issues.joomla.org/tracker/joomla-cms/10732 закрытый? Azn
Он самый.
ТОже не сразу понял, что хотелось.
ТС хочет не отображения строк и файла, а чтобы при выставлении показа ошибок на "Нет", ошибка вообще не показывалась.
И я поддерживаю это, посторонним не за чем смотреть лишнюю информацию.
Надо бы посмотреть как формируется $this->error->getMessage()
Разговор о фатальных ошибках notice при 'нет' не выводятся. Суть в том чтобы при 'нет' заместо фатальных ошибок выходил белый экран
А вообще можно пока что в переопредилении сделать как хочеться.
Записан
Филипп Сорокин
Практически профи
*******

Репутация: +139/-4
Offline Offline

Пол: Мужской
Сообщений: 1824


« Ответ #15 : 28.07.2017, 03:28:59 »

В php7 обработчик ошибок, который задаётся при помощи функции set_exception_handler, принимает экземпляры классов Error и Exception, которые, в свою очередь, наследуют интерфейс Throwable. Это новая фича PHP7, с помощью которой фатальные ошибки можно улавливать и грациозно парировать. В PHP5 нет интерфейса Throwable и класса Error -- есть лишь класс Exception. Поэтому фатальную ошибку в PHP5 нельзя отловить -- она будет вызывать белый экран. Проблема заключается в том, что возможность в PHP есть, а реализации правильной её в Joomla! нет.

Я как-то переписывался с разработчиками на GitHub, они не хотят менять это поведение (я им предлагал вернуть белый экран, пока они не довели до ума обработчик ошибок). Сошлись на том, что обработчик ошибок должен быть переписан. Когда это будет -- никто не знает. Это, естественно, напрягает. Решение этой проблемы заключается в том, чтобы переопределить обработчик ошибок на свой. Я это сделал в моём плагине SEF Wizard, где фатальные ошибки обрабатываются согласно установленным директивам PHP и Runtime настройкам.
« Последнее редактирование: 28.07.2017, 03:42:15 от Филипп Сорокин » Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #16 : 28.07.2017, 09:58:20 »

Суть в том чтобы при 'нет' заместо фатальных ошибок выходил белый экран
та дело даже не столько в белом экране. пусть будет любая страница, хотя такая как сейчас, главное чтобы Нет означало Нет. а то сейчас оно означает Нет, но все таки чуть-чуть да Azn короче, да, чтобы никакой информации об ошибке не выводилось, если Нет установлено.

Проблема заключается в том, что возможность в PHP есть, а реализации правильной её в Joomla! нет.
да, все верно, так и есть. я вчера уже ночью долез по коду, разобрался. короче, пока сделал в error.php так
Код
<?php if (JFactory::getConfig()->get('error_reporting')!== 'none') { ?>
<p><?php echo JText::_('JERROR_LAYOUT_PLEASE_CONTACT_THE_SYSTEM_ADMINISTRATOR'); ?></p>
<blockquote>
<span class="label label-inverse"><?php echo $this->error->getCode(); ?></span> <?php echo htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8');?> in <b><?php echo htmlspecialchars($this->error->getFile(), ENT_QUOTES, 'UTF-8');?></b> on line <b><?php echo htmlspecialchars($this->error->getLine(), ENT_QUOTES, 'UTF-8');?></b>
</blockquote>
<?php } ?>
Записан
ProtectYourSite
Живу я здесь
******

Репутация: +51/-4
Offline Offline

Сообщений: 838



« Ответ #17 : 28.07.2017, 10:50:41 »

короче, пока сделал в error.php так
Ещё надо и title подправлять - там тоже выводится ошибка.
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #18 : 28.07.2017, 11:08:46 »

о, точно, спасибо.
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Online Online

Пол: Мужской
Сообщений: 2123



« Ответ #19 : 28.07.2017, 11:44:51 »

Я это сделал в моём плагине SEF Wizard, где фатальные ошибки обрабатываются согласно установленным директивам PHP и Runtime настройкам
У меня это выбивало белый экрана даже при полном выводе ошибок.  Я думаю в J4 поправят
да, все верно, так и есть. я вчера уже ночью долез по коду, разобрался. короче, пока сделал в error.php так
А проверку на версию php
Записан
Филипп Сорокин
Практически профи
*******

Репутация: +139/-4
Offline Offline

Пол: Мужской
Сообщений: 1824


« Ответ #20 : 28.07.2017, 12:10:01 »

У меня это выбивало белый экрана даже при полном выводе ошибок.

За вывод ошибок отвечают 2 директивы: error_reporting и display_errors. Они могут быть заданы как в конфигурационных файлах сервера, так и во время исполнения. При этом можно сделать так, что невозможно будет изменить вывод во время исполнения (PHP_ADMIN_VALUE).

Если error_reporting установлен в определённое значение, а display_errors выключен, то ошибки на экран не выводятся -- вместо этого логируются в серверные логи. Если же display_errors включён, ошибки и логируются, и выводятся на экран. При настройке в глобальной конфигурации "По умолчанию для системы" так и происходит. Если же выбирается "Простой, Максимум, для разработчиков" и тп, Joomla пытается задавать директивы error_reporting и display_errors во время исполнения (только пытается).

Однако фатальная ошибка на данный момент показывается даже тогда, когда в настройках отключён вывод ошибок. Почему? Потому что сам по себе этот факт не влияет на отлавливание исключения в функции-обработчике ошибок. Именно её необходимо изменить, чтобы добиться желаемого результата. Здесь 2 варианта:

1. Заново повесить обработчик при помощи set_exception_handler
2. Переопределить defines.php и загрузить переделанный класс с тем же именем раньше (более агрессивный способ)
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Online Online

Пол: Мужской
Сообщений: 2123



« Ответ #21 : 28.07.2017, 12:27:46 »

За вывод ошибок отвечают 2 директивы: error_reporting и display_errors. Они могут быть заданы как в конфигурационных файлах сервера, так и во время исполнения. При этом можно сделать так, что невозможно будет изменить вывод во время исполнения (PHP_ADMIN_VALUE).

Если error_reporting установлен в определённое значение, а display_errors выключен, то ошибки на экран не выводятся -- вместо этого логируются в серверные логи. Если же display_errors включён, ошибки и логируются, и выводятся на экран. При настройке в глобальной конфигурации "По умолчанию для системы" так и происходит. Если же выбирается "Простой, Максимум, для разработчиков" и тп, Joomla пытается задавать директивы error_reporting и display_errors во время исполнения (только пытается).

Однако фатальная ошибка на данный момент показывается даже тогда, когда в настройках отключён вывод ошибок. Почему? Потому что сам по себе этот факт не влияет на отлавливание исключения в функции-обработчике ошибок. Именно её необходимо изменить, чтобы добиться желаемого результата. Здесь 2 варианта:

1. Заново повесить обработчик при помощи set_exception_handler
2. Переопределить defines.php и загрузить переделанный класс с тем же именем раньше (более агрессивный способ)
И третий вариант просто отрубить обработчик в SEF wizard ибо все равно для разработки красивый вывод ошибок не нужен
Записан
capricorn
Практически профи
*******

Репутация: +107/-1
Offline Offline

Сообщений: 1741


« Ответ #22 : 28.07.2017, 12:35:42 »

Я так понимаю, что писать специальный обработчик для Joomla, означает тщательно его протестировать на все виды ошибок.
https://issues.joomla.org/tracker/joomla-cms/10732#event-173325

Что собственно сейчас не устраивает? Чувствительная информация ведь не отображается, а логгируется.

Код:
2017-07-28T07:15:10+00:00 WARNING 46.249.28.173 assets No asset found for com_content.category.root, falling back to com_content
2017-07-28T07:15:10+00:00 CRITICAL 46.249.28.173 error Uncaught Exception of type JException thrown. Stack trace: #0 /var/www/html/***/htdocs/libraries/legacy/error/error.php(277): JError::raise(1, 404, '\xD0\x9A\xD0\xB0\xD1\x82\xD0\xB5\xD0\xB3\xD0\xBE\xD1\x80\xD0...', NULL, true)
#1 /var/www/html/***/htdocs/libraries/legacy/view/category.php(132): JError::raiseError(404, '\xD0\x9A\xD0\xB0\xD1\x82\xD0\xB5\xD0\xB3\xD0\xBE\xD1\x80\xD0...')
#2 /var/www/html/***/htdocs/components/com_content/views/category/view.html.php(72): JViewCategory->commonCategoryDisplay()
#3 /var/www/html/***/htdocs/libraries/legacy/controller/legacy.php(671): ContentViewCategory->display()
#4 /var/www/html/***/htdocs/components/com_content/controller.php(113): JControllerLegacy->display(true, Array)
#5 /var/www/html/***/htdocs/libraries/legacy/controller/legacy.php(709): ContentController->display()
#6 /var/www/html/***/htdocs/components/com_content/content.php(39): JControllerLegacy->execute(NULL)
#7 /var/www/html/***/htdocs/libraries/cms/component/helper.php(389): require_once('/var/www/html/z...')
#8 /var/www/html/***/htdocs/libraries/cms/component/helper.php(364): JComponentHelper::executeComponent('/var/www/html/z...')
#9 /var/www/html/***/htdocs/libraries/cms/application/site.php(191): JComponentHelper::renderComponent('com_content')
#10 /var/www/html/***/htdocs/libraries/cms/application/site.php(230): JApplicationSite->dispatch()
#11 /var/www/html/***/htdocs/libraries/cms/application/cms.php(265): JApplicationSite->doExecute()
#12 /var/www/html/***/htdocs/index.php(49): JApplicationCms->execute()
#13 {main}
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #23 : 28.07.2017, 12:43:09 »

Однако фатальная ошибка на данный момент показывается даже тогда, когда в настройках отключён вывод ошибок. Почему? Потому что сам по себе этот факт не влияет на отлавливание исключения в функции-обработчике ошибок. Именно её необходимо изменить, чтобы добиться желаемого результата.
и согласен, и нет. вы правы в том, что опция не влияет на отлов ошибки. но при чем тут показ? имхо fatal нужно поймать, но не показывать саму ошибку, показать просто страничку шаблонную красиво оформленную, говорящую юзеру о том, что ошибка имеет место быть, и все. сам по себе белый экран тоже ж ничего хорошего. поэтому я не против отлова ошибки, с ним имхо лучше чем было без него, я против именно отсутствия реакции на показ ошибок Azn а отлов это только плюс. например можно админу письмо отправлять об обшибке, и т.п.

И третий вариант просто отрубить обработчик в SEF wizard ибо все равно для разработки красивый вывод ошибок не нужен
и 4-й вариант - сделать в error.php вывод в зависимости от настройки Azn я еще добавил
Цитировать
<?php if ($this->debug || JFactory::getConfig()->get('error_reporting') === 'development') : ?>
чтобы стек видно было не включая debug, и вообще все гут. адинка конечно страдает по прежнему, но там я переживу.
Записан
Филипп Сорокин
Практически профи
*******

Репутация: +139/-4
Offline Offline

Пол: Мужской
Сообщений: 1824


« Ответ #24 : 28.07.2017, 12:43:40 »

Цитировать
И третий вариант просто отрубить обработчик в SEF wizard ибо все равно для разработки красивый вывод ошибок не нужен
Для фатальных там нет красивого вывода -- parse, syntax, type и др. ошибки передаются стандартному обработчику PHP и исключаются из программной обработки полностью.

Цитировать
Что собственно сейчас не устраивает? Чувствительная информация ведь не отображается, а логгируется.
В связи с тем, что объекты, унаследовавшие интерфейс Throwable попадают в произвольный обработчик ошибок, заданный при помощи set_exception_handler, фатальные ошибки вообще не логируются. Вместо этого они "под одну гребёнку" с исключениями типа 404 передаются в рендерер ошибок Joomla! и показываются как есть любому желающему Azn
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #25 : 28.07.2017, 12:45:04 »

Что собственно сейчас не устраивает?
больше всего то, что с отключенным показом ошибки все равно какая то часть ошибки показывается.
Записан
capricorn
Практически профи
*******

Репутация: +107/-1
Offline Offline

Сообщений: 1741


« Ответ #26 : 28.07.2017, 12:48:41 »

Цитировать
больше всего то, что с отключенным показом ошибки все равно какая то часть ошибки показывается.

Да, но она ничего не значит без путь/файл. Можете попробовать свой обработчик сделать, если будете PR оформлять, оставьте ссылку.
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #27 : 28.07.2017, 12:58:11 »

не значит, но например название таблиц показывает, название классов, и т.п.
Записан
dmitry_stas
Профи
********

Репутация: +935/-6
Offline Offline

Сообщений: 9969



« Ответ #28 : 28.07.2017, 13:01:37 »

В связи с тем, что объекты, унаследовавшие интерфейс Throwable попадают в произвольный обработчик ошибок, заданный при помощи set_exception_handler, фатальные ошибки вообще не логируются.
ха, точно. ну вот еще одна причина. но тут уже придется выбирать... либо либо по старинке белый экран, но с логами, либо красиво оформленную, но в лог придется писать самому...
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Online Online

Пол: Мужской
Сообщений: 2123



« Ответ #29 : 28.07.2017, 13:03:34 »

Для фатальных там нет красивого вывода -- parse, syntax, type и др. ошибки передаются стандартному обработчику PHP и исключаются из программной обработки полностью.
Ну хз, в общем разбираться мне было лень, я просто вырубил и все =) мб потом разберусь.
Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet