Как я могу написать на консоль в PHP?

324

Можно ли написать строку или войти в консоль?

Что я имею в виду

Как и в JSP, если мы напечатаем что-то вроде этого system.out.println("some"), оно будет там, на консоли, а не на странице.

Лабиб Панампуллан
источник

Ответы:

145

Fire Fox

В Firefox вы можете использовать расширение под названием FirePHP, которое позволяет регистрировать и выгружать информацию из ваших PHP-приложений на консоль. Это дополнение к удивительному расширению веб-разработки Firebug .

Хром

Однако, если вы используете Chrome, есть инструмент отладки PHP, называемый Chrome Logger или webug (у webug есть проблемы с порядком журналов).

В последнее время Clockwork находится в активной разработке, которая расширяет Инструменты разработчика, добавляя новую панель для предоставления полезной информации об отладке и профилировании. Он обеспечивает готовую поддержку Laravel 4 и Slim 2, а также может быть добавлена ​​поддержка с помощью расширяемого API.

Использование Xdebug

Лучший способ отладить ваш PHP - использовать Xdebug . Большинство браузеров предоставляют вспомогательные расширения, которые помогут вам передать требуемую строку cookie / строки запроса для инициализации процесса отладки.

Малахия
источник
5
Также есть расширение Safari для отладки PHP под названием Xdebug Helper. Я установил его с этой страницы: extensions.apple.com/#tab
Марк Маккельви
3
Fire PHP ссылка мертва
Брайан Лейшман
9
echo "<script> console.log ('PHP:',", get_option ("slides_data"), "); </ script>";
Азмат Карим Хан
4
ОП заявляет, что он хотел печатать в стандартный вывод, а не в консоль html / js.
beppe9000
6
FirePHP официально мертв.
TimSparrow
407

Или вы используете трюк из PHP Debug для консоли .

Для начала вам понадобится небольшая вспомогательная функция PHP

function debug_to_console($data) {
    $output = $data;
    if (is_array($output))
        $output = implode(',', $output);

    echo "<script>console.log('Debug Objects: " . $output . "' );</script>";
}

Тогда вы можете использовать это так:

debug_to_console("Test");

Это создаст вывод как это:

Debug Objects: Test
Senador
источник
5
В FireFox v27 это выводит"Debug Objects: " . $data . ""
Mawg говорит восстановить Monica
Единственный способ сделать это более полезным - сделать пару переменных $ name: 'data' в журнале. Хорошая функция, хотя.
императив
10
@ Mawg (и люди, которые проголосовали за этот комментарий): Если $dataв выводе появляется, то вы не ввели функцию точно так, как показано. Внимательно посмотрите на одинарные и двойные кавычки, чтобы убедиться, что они соответствуют приведенному выше коду. $dataпеременная php; ко времени отправки страницы в браузер эта переменная php будет заменена на параметр, переданный в debug_to_console. Браузер никогда не должен видеть $data. (Если вы посмотрите page sourceв браузере, это не должно сказать $data.)
ToolmakerSteve
1
Спасибо за подсказку к моему посту. Но время и знания изменились, функция также;) У меня есть это обновление сейчас.
Bueltge
3
Итак, другими словами, ответ таков: echo "<script> console.log ('Debug Objects:". $ Output. "'); </ Script>";
Кристина
69

Если вы ищете простой подход, используйте JSON:

<script>
    console.log(<?= json_encode($foo); ?>);
</script>
Travis
источник
4
Это добавляет немного больше контекста:function debug_log( $object=null, $label=null ){ $message = json_encode($object, JSON_PRETTY_PRINT); $label = "Debug" . ($label ? " ($label): " : ': '); echo "<script>console.log(\"$label\", $message);</script>"; }
robrecord
ОП заявляет, что он хотел печатать в стандартный вывод, а не в консоль html / js.
beppe9000
@ beppe9000 Это неправильно. ОП спрашивает, может ли он писать из PHP на консоль. Цитата: "Можно ли написать строку или войти в консоль?"
Доусон Ирвин
с этим вы можете избежать var_dumps и тому подобное. Прекрасно работает, и консоль позволяет вам переключать JSON хорошим способом.
Mbotet
41

По умолчанию отправляются все выходные данные stdout, то есть HTTP-ответ или консоль, в зависимости от того, запускается ли ваш скрипт Apache или вручную в командной строке. Но вы можете использовать error_logдля регистрации, и различные потоки ввода / вывода могут быть записаны с fwrite.

nikc.org
источник
8
Спасибо, error_logэто то , что мне нужно было вывести на терминал через встроенный веб-сервер PHP
Мартин Колл
37

Попробуйте следующее. Это работает:

echo("<script>console.log('PHP: " . $data . "');</script>");
Мэнди
источник
5
Это не очень реальное время, так как php отправляет всю страницу после завершения обработки. Кроме того, если в php-файле есть ошибка, вы не увидите ни одного из журналов, потому что он вернет только страницу с ошибкой, игнорируя тем самым ваши предыдущие отпечатки.
Миро Маркараванес
1
Я хотел бы отметить, что @MiroMarkaravanes абсолютно корректен - фатальные ошибки могут помешать выводу console.log, если вы не уверены, что обработали / перехватили каждую возможную ошибку. Особенно при использовании буферизации вывода - если ваш буфер не попадает на экран, не выводится и ваш файл console.log. Это то, о чем нужно помнить.
whoshotdk
1
ОП заявляет, что он хотел печатать в стандартный вывод, а не в консоль html / js.
beppe9000
19
echo 
"<div display='none'>
    <script type='text/javascript'>
        console.log('console log message');
    </script>
</div>";

Создает

<div>

с

display="none"

так что div не отображается, но

console.log()

Функция создана в JavaScript. Таким образом, вы получите сообщение в консоли.

Нео
источник
3
Технически это правильный ответ на первоначальный вопрос - как написать в консоль браузера из PHP. Но я думаю, что автор пытается отладить PHP, поэтому есть лучшие варианты. Это не должно быть опущено, хотя, строго говоря, это правильный ответ.
Рольф
1
я конечно только нашел это невероятно полезным!
Альберт
Сохраняя это простым, это решение прекрасно, потому что самоочевидно. Особенно, когда тебе нужно много разжевать одновременно с тем, что я переживаю сейчас.
Олу Адабонян
2
Я не понимаю, зачем тебе это вообще нужно div. если у вас просто есть <script>блок, в браузере ничего не будет отображаться.
Кодос Джонсон
1
Кроме того, если ваше сообщение об ошибке хранится в переменной, или если оно содержит кавычки, вам лучше обернуть сообщение в вызов, чтобы json.encodeкавычки не ломали вашу строку кода. Например:echo "<script>console.log(".json_encode($msg).")</script>";
SherylHohman
18

Как автор связанной веб-страницы в популярном ответе , я хотел бы добавить свою последнюю версию этой простой вспомогательной функции. Это гораздо прочнее.

Я использую json_encode()для проверки, если тип переменной не является необходимым, а также добавить буфер для решения проблем с фреймворками. Там нет твердого возврата или чрезмерного использования header().

/**
 * Simple helper to debug to the console
 *
 * @param $data object, array, string $data
 * @param $context string  Optional a description.
 *
 * @return string
 */
function debug_to_console($data, $context = 'Debug in Console') {

    // Buffering to solve problems frameworks, like header() in this and not a solid return.
    ob_start();

    $output  = 'console.info(\'' . $context . ':\');';
    $output .= 'console.log(' . json_encode($data) . ');';
    $output  = sprintf('<script>%s</script>', $output);

    echo $output;
}

использование

// $data is the example variable, object; here an array.
$data = [ 'foo' => 'bar' ];
debug_to_console($data);`

Скриншот результата

Также простой пример, как изображение, понять его гораздо проще:

Введите описание изображения здесь

bueltge
источник
В то время как я сделать , как эту идею, вы могли бы подтвердить , что он не подходит для Ajax запросов?
Mawg говорит восстановить Monica
1
Да, это чистый статический php, а не Ajax.
Bueltge
Но, похоже, он добавляет HML / JS-код в тело страницы - и мой Ajax не возвращает тела страницы. Извините, но я не понимаю и не пытаюсь помочь мне,
говорит Моуг, восстановите Монику
1
Вы должны вызвать вспомогательную функцию перед запросом вызова ajax, затем вы получите также результат в консоли.
Bueltge
Поэтому я поместил туда переменную, и каждый персонаж оказался в отдельной строке. Довольно любопытно, почему он это делает? Никогда не использовал console.info
yardpenalty.com
17

Я думаю, что это может быть использовано -

function jsLogs($data) {
    $html = "";
    $coll;

    if (is_array($data) || is_object($data)) {
        $coll = json_encode($data);
    } else {
        $coll = $data;
    }

    $html = "<script>console.log('PHP: ${coll}');</script>";

    echo($html);
    # exit();
}

# For String
jsLogs("testing string"); #PHP: testing string

# For Array
jsLogs(array("test1", "test2")); # PHP: ["test1","test2"]

# For Object
jsLogs(array("test1"=>array("subtest1", "subtest2"))); #PHP: {"test1":["subtest1","subtest2"]}
Панкадж Бишт
источник
3
Очень сложный. Спасибо @Pankaj Бишт
Викар
2
Объяснение будет в порядке.
Питер Мортенсен
14

Некоторые отличные ответы, которые добавляют больше глубины; но мне нужно было что-то более простое и более похожее на console.log()команду JavaScript .

Я использую PHP во многих «сбора данных и превращения в XML» в приложениях Ajax. JavaScript console.logне работает в этом случае; это нарушает вывод XML.

У Xdebug и т. Д. Были похожие проблемы.

Мое решение в Windows:

  • Установить .txtфайл, который довольно легко получить и записать
  • Установите error_logпеременную PHP в .iniфайле для записи в этот файл
  • Откройте файл в проводнике Windows и откройте для него панель предварительного просмотра.
  • Используйте команду error_log('myTest');PHP для отправки сообщений

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

Klompenrunner
источник
Будет ли перенос сообщения json_encodeтакже решить проблему? Если это так, то, возможно, кавычки в сообщении помешали кавычкам в скрипте. (например:) echo "<script>console.log(".json_encode($msg).")</script>";. Если нет, мне любопытно, в чем проблема, которая вызвала сбой скрипта console.log, и как / почему ваше решение это исправило. Ваше решение хорошо - я просто пытаюсь узнать больше об условиях, которые привели к console.logсбою вывода xml. Во многих случаях журнал ошибок, как вы сделали, намного лучше, чем быстрый console.log.
SherylHohman
13
$variable = "Variable";
echo "<script>console.log('$variable');</script>";

Взаимодействие PHP и JavaScript.

0DAYanc
источник
Объяснение будет в порядке. Можете ли вы уточнить ( редактируя свой ответ , а не отвечая в комментариях)?
Питер Мортенсен
11

Я считаю это полезным:

function console($data, $priority, $debug)
{
    if ($priority <= $debug)
    {
        $output = '<script>console.log("' . str_repeat(" ", $priority-1) . (is_array($data) ? implode(",", $data) : $data) . '");</script>';

        echo $output;
    }
}

И используйте это как:

<?php
    $debug = 5; // All lower and equal priority logs will be displayed
    console('Important', 1 , $debug);
    console('Less Important', 2 , $debug);
    console('Even Less Important', 5 , $debug);
    console('Again Important', 1 , $debug);
?>

Какие выходы в консоли:

Important
 Less Important
     Even Less Important
Again Important

И вы можете отключить менее важные журналы, ограничив их с помощью значения $ debug.

зет
источник
так что если вы позвоните, console('Even Less Important' ,6 , $debug);это не будет отображаться в консоли? почему так? ничего выше 5 не отображается
HattrickNZ
2
@HattrickNZ Это позволяет вам иметь разные уровни сообщений журнала. Если вы выполняете отладку, вы можете захотеть показать очень болтливый поток сообщений с большим количеством информации, однако во время обычной работы вы можете установить отладку на 1, чтобы отображались только самые важные ошибки / элементы журнала. Вам решать, какие элементы важны при написании кода.
Тоби Аллен
ОП заявляет, что он хотел печатать в стандартный вывод, а не в консоль html / js.
beppe9000
1
Да, но повторный код (избыточность) - должен быть реорганизован: $output = '<script>console.log("' . str_repeat(" ", $priority-1)и . '");</script>';. Только implode(",", $data)и $dataотличается.
Питер Мортенсен
1
@ Питер Мортенсен - правдивая история! Отредактировал этот пост за 4 года! :)
Зи
7

Короткий и простой, для массивов, строк или также объектов.

function console_log( $data ) {
  $output  = "<script>console.log( 'PHP debugger: ";
  $output .= json_encode(print_r($data, true));
  $output .= "' );</script>";
  echo $output;
}
Карлос Луго
источник
1
ОП заявляет, что он хотел печатать на серверный терминал / стандартный вывод, а не на консоль html / js.
beppe9000
7
function phpconsole($label='var', $x) {
    ?>
    <script type="text/javascript">
        console.log('<?php echo ($label)?>');
        console.log('<?php echo json_encode($x)?>');
    </script>
    <?php
}
Ашраф Мухаммед
источник
1
ОП заявляет, что он хотел печатать на серверный терминал / стандартный вывод, а не на консоль html / js.
beppe9000
7

Если вы хотите писать в лог-файл PHP, а не в консоль JavaScript, вы можете использовать это:

error_log("This is logged only to the PHP log")

Ссылка: error_log

Дэн Грин-Лейпцигер
источник
Тогда просто прыгайте в ssh и следите за журналом
Hayden Thring
6

Для Chrome есть расширение Chrome Logger, позволяющее регистрировать сообщения PHP.

Firefox DevTools даже имеет встроенную поддержку протокола Chrome Logger .

Чтобы включить ведение журнала, вам просто нужно сохранить файл «ChromePhp.php» в вашем проекте. Тогда это можно использовать так:

include 'ChromePhp.php';
ChromePhp::log('Hello console!');
ChromePhp::log($_SERVER);
ChromePhp::warn('something went wrong!');

Пример взят со страницы GitHub .

Вывод может выглядеть так:

Журнал сервера в Firefox DevTools

Себастьян Зартнер
источник
Вы также можете установить его через композитора:"ccampbell/chromephp": "*"
padawanTony
5

Существует также отличное расширение Google Chrome, PHP Console , с библиотекой PHP, которая позволяет:

  • Смотрите ошибки и исключения в консоли Chrome JavaScript и во всплывающих уведомлениях.
  • Дамп любого типа переменной.
  • Выполнять код PHP удаленно.
  • Защитите доступ паролем.
  • Групповые журналы консоли по запросу.
  • Перейти error file:lineв ваш текстовый редактор.
  • Скопируйте данные об ошибках / отладке в буфер обмена (для тестеров).
barbushin
источник
1
Мой предпочтительный метод записи ошибок PHP, исключений и пользовательских отладочных выводов на консоль JS. Я использую его годами - очень надежный и постоянно обновляющийся с ревизиями PHP. Я бы не использовал ничего другого.
Velojet
3

Я искал способ отладки кода в плагине WordPress, который я разрабатывал, и наткнулся на этот пост.

Я взял фрагменты кода, наиболее подходящие для меня, из других ответов и объединил их в функцию, которую я могу использовать для отладки WordPress. Функция:

function debug_log($object=null, $label=null, $priority=1) {
    $priority = $priority<1? 1: $priority;
    $message = json_encode($object, JSON_PRETTY_PRINT);
    $label = "Debug" . ($label ? " ($label): " : ': ');
    echo "<script>console.log('" . str_repeat("-", $priority-1) . $label . "', " . $message . ");</script>";
}

Использование заключается в следующем:

$txt = 'This is a test string';
$sample_array = array('cat', 'dog', 'pig', 'ant', 'fly');
debug_log($txt, '', 7);
debug_log($sample_array);

Если эта функция используется при разработке WordPress, она должна быть помещена в functions.phpфайл дочерней темы и затем вызываться в любом месте кода.

Клинтон
источник
2

Я отказался от всего вышесказанного в пользу Debugger & Logger . Я не могу похвалить это достаточно!

Просто нажмите на одну из вкладок в правом верхнем углу или нажмите здесь, чтобы развернуть / скрыть.

Обратите внимание на различные «категории». Вы можете щелкнуть любой массив, чтобы развернуть / свернуть его.

С веб-страницы

Основные характеристики:

  • Показывать глобальные переменные ($ GLOBALS, $ _POST, $ _GET, $ _COOKIE и т. Д.)
  • Показать версию PHP и загруженные расширения
  • Замените PHP встроенный обработчик ошибок
  • Журнал SQL-запросов
  • Отслеживать время выполнения кода и SQL-запросов
  • Проверьте переменные на предмет изменений
  • Отслеживание вызовов функций
  • Анализ покрытия кода, чтобы проверить, какие строки скрипта были выполнены
  • Дамп всех типов переменных
  • Инспектор файлов с подсветкой кода для просмотра исходного кода
  • Отправлять сообщения в консоль JavaScript (только Chrome), для сценариев Ajax

Введите описание изображения здесь

Mawg говорит восстановить Монику
источник
Здравствуй. Существует ли новейшая вилка или аналогичный инструмент, более современный и поддерживаемый в настоящее время?
Метафаниэль
Я не кодировал его, так что для новейшего форка, я думаю, просто перейти на GitHub? По поводу альтернатив обращайтесь по адресу softwarerecs.stackexchange.com, и мы вам поможем.
Mawg говорит восстановить Monica
1
@ MawgHi, спасибо. Я спросил, потому что phptoolcase Github и перечисленные там форки не обновлялись в течение 5 лет. Спасибо за другой сайт StackExchange. Я только что нашел Заводной . Интересно, похоже это или лучше ...
Метафаниэль
И спасибо вам за Заводной. Это выглядит превосходно (просто жаль, что я не использую ни одну из этих платформ (мне интересно, может ли он таким образом выводить запросы к базе данных - перехватывая фреймворк)). Стоит исследовать. (+1)
Mawg говорит восстановить Monica
2

С 2017 года Firebug и, следовательно, FirePHP был отключен .

Я написал несколько небольших изменений в инструменте ChromePHP, чтобы обеспечить плавный переход с FirePHP на Firebug для отладки через консоль.

Эта статья объясняет в простых простых шагах

Миграция с FirePHP на ChromePHP за 5 минут (без нарушения существующего кода)

Кудехинбу Олувапонле
источник
2

Для вызовов Ajax или ответов XML / JSON, когда вы не хотите связываться с телом, вам нужно отправлять журналы через заголовки HTTP, а затем добавлять их в консоль с веб-расширением. Вот как FirePHP (больше не доступен) и QuantumPHP (форк ChromePHP) делают это в Firefox.

Если у вас есть терпение, лучше использовать x-debug - вы получите более глубокое понимание PHP с возможностью приостановить выполнение сценария, посмотреть, что происходит, а затем возобновить выполнение сценария.

Фрэнк Форте
источник
2

Я мог бы опоздать на вечеринку, но я искал реализацию функции регистрации, которая:

  • принимает переменное количество аргументов, разделенных запятыми, так же, как javascript console.log(),
  • дает форматированный вывод (не только сериализованную строку),
  • отличается от обычного JavaScript console.log().

Итак, результат выглядит так:

введите описание изображения здесь

(Фрагмент ниже тестируется на php 7.2.11. Я не уверен в его обратной совместимости с php. Это может быть проблемой и для javascript (в терминах старых браузеров), потому что он создает запятую после console.log()аргументов - что не является законно пока ES 2017.)

<?php

function console_log(...$args)
{
    $args_as_json = array_map(function ($item) {
        return json_encode($item);
    }, $args);

    $js_code = "<script>console.log('%c 💬 log from PHP: ','background: #474A8A; color: #B0B3D6; line-height: 2',";
    foreach ($args_as_json as $arg) {
        $js_code .= "{$arg},";
    }
    $js_code .= ")</script>";

    echo $js_code;
}

$list = ['foo', 'bar'];
$obj = new stdClass();
$obj->first_name = 'John';
$obj->last_name = 'Johnson';

echo console_log($list, 'Hello World', 123, $obj);

?>
HynekS
источник
Этот фрагмент спас меня. :) Мне нужно было внести некоторые изменения в производственный код без доступа к реальным серверам, и это было прекрасно, чтобы обойти это. Спасибо!
Рафаэль Алейшо
Я рад, что смог помочь.
HynekS
1

Любой из этих двух работает:

<?php
    $five = 5;
    $six = 6;
?>
<script>
    console.log(<?php echo $five + $six ?>);
</script>


<?php
    $five = 5;
    $six = 6;
    echo("<script>console.log($five + $six);</script>");
?>
roybraym
источник
1

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

function console_log()
{
    $js_code = 'console.log(' . json_encode(func_get_args(), JSON_HEX_TAG) .
        ');';
    $js_code = '<script>' . $js_code . '</script>';
    echo $js_code;
}

Назови это так

console_log('DEBUG>>', 'Param 1', 'Param 2');
console_log('Console DEBUG:', $someRealVar1, $someVar, $someArray, $someObj);

Теперь вы должны видеть вывод в своей консоли, счастливое кодирование :)

Имран Захур
источник
0

Использование:

function console_log($data) {
    $bt = debug_backtrace();
    $caller = array_shift($bt);

    if (is_array($data))
        $dataPart = implode(',', $data);
    else
        $dataPart = $data;

    $toSplit = $caller['file'])) . ':' .
               $caller['line'] . ' => ' . $dataPart

    error_log(end(split('/', $toSplit));
}
btm1
источник
1
Вы должны добавить подсказку о вашей идее и решении. Также у источника есть неиспользованный источник.
Bueltge
0

Вот удобная функция. Он очень прост в использовании, позволяет передавать любое количество аргументов любого типа и отображает содержимое объекта в окне консоли браузера, как если бы вы вызывали console.log из JavaScript - но из PHP

Обратите внимание, что вы также можете использовать теги, передавая «TAG-YourTag», и он будет применяться до тех пор, пока не будет прочитан другой тег, например, «TAG-YourNextTag».

/*
 *  Brief:         Print to console.log() from PHP
 *
 *  Description:   Print as many strings,arrays, objects, and
 *                 other data types to console.log from PHP.
 *
 *                 To use, just call consoleLog($data1, $data2, ... $dataN)
 *                 and each dataI will be sent to console.log - note
 *                 that you can pass as many data as you want an
 *                 this will still work.
 *
 *                 This is very powerful as it shows the entire
 *                 contents of objects and arrays that can be
 *                 read inside of the browser console log.
 *
 *                 A tag can be set by passing a string that has the
 *                 prefix TAG- as one of the arguments. Everytime a
 *                 string with the TAG- prefix is detected, the tag
 *                 is updated. This allows you to pass a tag that is
 *                 applied to all data until it reaches another tag,
 *                 which can then be applied to all data after it.
 *
 *                 Example:
 *
 *                 consoleLog('TAG-FirstTag', $data, $data2, 'TAG-SecTag, $data3);
 *
 *                 Result:
 *                     FirstTag '...data...'
 *                     FirstTag '...data2...'
 *                     SecTag   '...data3...'
 */
function consoleLog(){
    if(func_num_args() == 0){
        return;
    }

    $tag = '';
    for ($i = 0; $i < func_num_args(); $i++) {
        $arg = func_get_arg($i);
        if(!empty($arg)){
            if(is_string($arg) && strtolower(substr($arg, 0, 4)) === 'tag-'){
                $tag = substr($arg, 4);
            }else{
                $arg = json_encode($arg, JSON_HEX_TAG | JSON_HEX_AMP );
                echo "<script>console.log('" . $tag . " " . $arg . "');</script>";
            }
        }
    }
}

ПРИМЕЧАНИЕ: func_num_args () и func_num_args () являются функциями PHP для чтения динамического числа входных аргументов и позволяют этой функции иметь бесконечно много запросов console.log за один вызов функции.

Крис Спраг
источник
0

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

КОД:

    // Post to browser console
    function console($data, $is_error = false, $file = false, $ln = false) {
        if(!function_exists('console_wer')) {
            function console_wer($data, $is_error = false, $bctr, $file, $ln) {
                echo '<div display="none">'.'<script type="text/javascript">'.(($is_error!==false) ? 'if(typeof phperr_to_cns === \'undefined\') { var phperr_to_cns = 1; document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ alert("Alert. see console."); }, 4000); });  }' : '').' console.group("PHP '.(($is_error) ? 'error' : 'log').' from "+window.atob("'.base64_encode((($file===false) ? $bctr['file'] : $file)).'")'.((($ln!==false && $file!==false) || $bctr!==false) ? '+" on line '.(($ln===false) ? $bctr['line'] : $ln).' :"' : '+" :"').'); console.'.(($is_error) ? 'error' : 'log').'('.((is_array($data)) ? 'JSON.parse(window.atob("'.base64_encode(json_encode($data)).'"))' : '"'.$data.'"').'); console.groupEnd();</script></div>'; return true;
            }
        }
        return @console_wer($data, $is_error, (($file===false && $ln===false) ? array_shift(debug_backtrace()) : false), $file, $ln);
    }

    //PHP Exceptions handler
    function exceptions_to_console($svr, $str, $file, $ln) {
        if(!function_exists('severity_tag')) {
            function severity_tag($svr) {
                $names = [];
                $consts = array_flip(array_slice(get_defined_constants(true)['Core'], 0, 15, true));
                foreach ($consts as $code => $name) {
                    if ($svr & $code) $names []= $name;
                }
                return join(' | ', $names);
            }
        }
        if (error_reporting() == 0) {
            return false;
        }
        if(error_reporting() & $svr) {
            console(severity_tag($svr).' : '.$str, true, $file, $ln);
        }
    }

    // Divert php error traffic
    error_reporting(E_ALL);  
    ini_set("display_errors", 1);
    set_error_handler('exceptions_to_console');

ИСПЫТАНИЯ И ИСПОЛЬЗОВАНИЕ:

Использование простое. Включите первую функцию для публикации на консоли вручную. Используйте вторую функцию для отклонения обработки исключений php. Следующий тест должен дать представление.

    // Test 1 - Auto - Handle php error and report error with severity info
    $a[1] = 'jfksjfks';
    try {
          $b = $a[0];
    } catch (Exception $e) {
          echo "jsdlkjflsjfkjl";
    }

    // Test 2 - Manual - Without explicitly providing file name and line no.
          console(array(1 => "Hi", array("hellow")), false);

    // Test 3 - Manual - Explicitly providing file name and line no.
          console(array(1 => "Error", array($some_result)), true, 'my file', 2);

    // Test 4 - Manual - Explicitly providing file name only.
          console(array(1 => "Error", array($some_result)), true, 'my file');

ОБЪЯСНЕНИЕ:

  • Функция console($data, $is_error, $file, $fn)принимает строку или массив в качестве первого аргумента и публикует их на консоли, используя вставки js.

  • Второй аргумент - это флаг, позволяющий отличить обычные журналы от ошибок. В случае ошибок мы добавляем прослушиватели событий, которые через оповещения сообщают нам, если возникли какие-либо ошибки, также выделяя их в консоли. Этот флаг по умолчанию имеет значение false.

  • Третий и четвертый аргументы являются явными объявлениями номеров файлов и строк, что необязательно. Если они отсутствуют, они по умолчанию используют предопределенную функцию php, debug_backtrace()чтобы получить их для нас.

  • Следующая функция exceptions_to_console($svr, $str, $file, $ln)имеет четыре аргумента в порядке, вызываемом обработчиком исключений php по умолчанию. Здесь первый аргумент - серьезность, которую мы дополнительно проверяем с помощью предопределенных констант, используя функцию, severity_tag($code)чтобы предоставить больше информации об ошибке.

УВЕДОМЛЕНИЕ

  • Приведенный выше код использует функции и методы JS, которые недоступны в старых браузерах. Для совместимости со старыми версиями требуется замена.

  • Выше код предназначен для тестирования сред, где у вас есть доступ к сайту. Не используйте это на живых (производственных) сайтах.

ПРЕДЛОЖЕНИЯ:

  • Первая функция console()выдавала некоторые уведомления, поэтому я поместил их в другую функцию и вызвал ее с помощью оператора контроля ошибок '@'. Этого можно избежать, если вы не возражаете против уведомлений.

  • И последнее, но не менее важное: всплывающие оповещения могут раздражать при кодировании. Для этого я использую этот звуковой сигнал (находится в решении: https://stackoverflow.com/a/23395136/6060602 ) вместо всплывающих предупреждений. Это довольно круто и возможности безграничны, вы можете играть в свои любимые мелодии и сделать кодирование менее напряженным.

Аджай Сингх
источник