Ejemplo n.º 1
0
 /**
  * Конструктор
  *
  * Парсим параметры, проверяем право запуска, выполняем, что требуется
  *
  * @param array $params параметры вызова Консоли
  */
 public function __construct(array $params)
 {
     if (!isConsoleInterface()) {
         exit('Ошибка. Допустим запуск только из консоли.');
     }
     $key = $this->parseParams($params);
     $this->checkAccess($key);
     $this->script ? $this->fireup() : $this->scriptsList();
 }
Ejemplo n.º 2
0
 /**
  * Короткий вызвов для дампа переменной через kira\utils\Dumper::dump()
  *
  * Упростил себе жизнь. Заколебался писать FQN-путь к методу. Теперь вызов простой: dd($var1, $var2, ...);
  */
 function dd()
 {
     foreach (func_get_args() as $var) {
         if (isConsoleInterface()) {
             echo kira\utils\Dumper::dumpAsString($var, 10, 0) . PHP_EOL;
         } else {
             kira\utils\Dumper::dump($var);
         }
     }
 }
Ejemplo n.º 3
0
 /**
  * Перехват ошибок PHP
  *
  * Свое оформление, трассировка и логирование. Если текущий тип ошибки отключен в error_reporting, то пишем
  * ее в temp-каталог приложения, в kira_php_error.log. Иначе - выдаем в браузер.
  *
  * Согласно мануала, такая функция вызывается независимо от настройки error_reporting. Поэтому проверяем, требуется
  * ли сообщать о полученной ошибке. Если да - рисуем ответ, иначе скидываем сообщение в лог. Обычно бывает так:
  * на локалке/деве всё включено - будут валиться сообщения в браузер. На проде все отключено - логируем.
  *
  * Опять же по мануалу, если этот обработчик не прервет выполнение вызвав die(), то программа продолжится. Если
  * вернет FALSE - ошибку получит стандартный обработчик и мы увидим еще и его сообщение. Поэтому делаем так:
  * если код соответствует какой-то ERROR - выходим; иначе возвращаем TRUE, чтоб стандартный обработчик
  * не дублировал сообщение в своем стиле.
  *
  * В случае фатальных ошибок трассировка вызовов уже неважна. К тому же я не могу ее получить почему-то. Поэтому
  * в таких сообщениях не будет стека вызовов.
  *
  * По константам кодов см. {@see http://php.net/manual/ru/errorfunc.constants.php}
  * Ликбез: {@link https://habrahabr.ru/post/134499/}
  *
  * @param int    $code уровень ошибки в виде целого числа
  * @param string $msg  сообщение об ошибке в виде строки
  * @param string $file имя файла, в котором произошла ошибка
  * @param int    $line номер строки, в которой произошла ошибка
  * @return bool
  */
 public static function errorHandler($code, $msg, $file, $line)
 {
     $codes = [1 => 'FATAL ERROR', 2 => 'WARNING', 4 => 'PARSE ERROR', 8 => 'NOTICE', 16 => 'CORE ERROR', 32 => 'CORE WARNING', 64 => 'COMPILE ERROR', 128 => 'COMPILE WARNING', 256 => 'USER ERROR', 512 => 'USER WARNING', 1024 => 'USER NOTICE', 2048 => 'STRICT', 4096 => 'RECOVERABLE ERROR', 8192 => 'DEPRECATED', 16384 => 'USER DEPRECATED'];
     $codeTxt = $codes[$code];
     $file = str_replace(ROOT_PATH, '', $file);
     $stack_html = $stack_console = '';
     if (($code & (E_ERROR | E_PARSE | E_COMPILE_ERROR)) == 0) {
         $trace = array_reverse(debug_backtrace());
         array_pop($trace);
         foreach ($trace as $step) {
             $where = isset($step['file']) ? str_replace(ROOT_PATH, '', $step['file']) . ':' . $step['line'] : '';
             $func = isset($step['class']) ? $step['class'] . $step['type'] . $step['function'] : $step['function'];
             if (isset($step['args'])) {
                 $args = $step['args'];
                 array_walk($args, function (&$i) {
                     if (is_string($i)) {
                         $i = "'{$i}'";
                     } elseif (is_array($i)) {
                         $i = '[array]';
                     } elseif (is_bool($i)) {
                         $i = $i ? 'true' : 'false';
                     } elseif (is_object($i)) {
                         $i = get_class($i);
                     }
                 });
                 $args = implode(', ', $args);
             } else {
                 $args = '';
             }
             $stack_html .= "<tr><td class='php-err-txtright'>{$where}</td><td>{$func}({$args})</td></tr>" . PHP_EOL;
             $stack_console .= "{$where} > {$func}({$args})" . PHP_EOL;
         }
         $stack_html = "\n                <p>Стек вызова в хронологическом порядке:</p>\n                <table class = 'php-err-stack'>\n                    {$stack_html}\n                </table>\n            ";
     }
     $rn = PHP_EOL;
     if (error_reporting() & $code) {
         if (isConsoleInterface()) {
             echo "{$rn}{$codeTxt}{$rn}{$rn}\t{$msg}{$rn}{$rn}" . "Стек вызовов:{$rn}{$rn}" . $stack_console . "{$rn}";
         } else {
             if (!headers_sent()) {
                 header('500 Internal Server Error');
                 header('Content-Type: text/html; charset=UTF-8');
             }
             $msg = nl2br(htmlspecialchars($msg, ENT_QUOTES, 'UTF-8'));
             echo Render::fetch('error_handler.htm', compact('codeTxt', 'msg', 'file', 'line', 'stack_html'));
         }
     } else {
         $info = "{$codeTxt}{$rn}{$rn}\t{$msg}{$rn}{$rn}" . 'в ' . date('Y.m.d. H:i:s') . "{$rn}{$rn}" . "Стек вызовов:{$rn}{$rn}" . $stack_console . "{$rn}---{$rn}{$rn}";
         file_put_contents(TEMP_PATH . 'kira_php_error.log', $info, FILE_APPEND);
         return false;
     }
     if ($code & (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR)) {
         exit;
     } else {
         return true;
     }
 }