WSOD отладка

Главные вкладки

Аватар пользователя One_Two One_Two 28 июня 2018 в 17:23

Всем привет!

Частенько сталкиваюсь с тем, что при переходе на некоторые страницы сайта вываливается WSOD (white screen of death). Такое бывает когда захожу например на системные страницы "admin/config/system/cron", "admin/reports/status", а сейчас и не могу разлогиниться, "/user/logout" тоже не срабатывает. Раза с 10 страница может загрузиться в итоге.
Есть ли какой-нибудь способ, вывести сообщения какой модуль отрабатывает в момент перехода на wsod страницу в виде:
"Start $module";
$module. '_' . "$hook finished";
"$module finished";

Хочу точно знать в каком модуле, на какой функции всё стопиться. Логи пишутся на сервер в файл и не всегда могу выкачать их, а так хоть на странице буду видеть.
Нашел примерно то что нужно:
https://stackoverflow.com/questions/12171838/drupal-7-user-edit-white-sc...

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

Комментарии

Аватар пользователя Semantics Semantics 28 июня 2018 в 17:54

А чем вам не нравится вариант посмотреть логи сервера и/или включить вывод ошибок PHP?
Полный backtrace по-умолчанию, конечно, там не показывает, но для решения большинства проблем достаточно.

Аватар пользователя gun_dose gun_dose 28 июня 2018 в 20:06

Модулями 500-е ошибки залогировать не получится, это всё равно, что попросить человека описать свои ощущения после выстрела в голову.

И да, показывать стэктрэйс на WSOD крайне несекьюрно.

Аватар пользователя One_Two One_Two 29 июня 2018 в 14:12

Всё же сделал как на стековерфлоу поделился человек:

<?phpfunction module_invoke_all($hook) {
  $args = func_get_args();
  // Remove $hook from the arguments.
  unset($args[0]);
  $return = array();
  foreach (module_implements($hook) as $module) {

        print "Starting loading $module <br />";

        $function = $module . '_' . $hook;
        if (function_exists($function)) {
          $result = call_user_func_array($function, $args);
          if (isset($result) && is_array($result)) {
            $return = array_merge_recursive($return, $result);
          }
          elseif (isset($result)) {
            $return[] = $result;
          }
        }

        print "Finished loading $module <br />";

  }

  return $return;
}?>

Эта функция оказывается лежит в ядре, include/module.inc.
Проблема оказалась в модуле nodejs, пока отключил и все страницы стали нормально открываться.
Осталось разобраться в чем конфликт.
Всем спасибо за помощь!