Можно ли написать строку или войти в консоль?
Что я имею в виду
Как и в JSP, если мы напечатаем что-то вроде этого system.out.println("some")
, оно будет там, на консоли, а не на странице.
Можно ли написать строку или войти в консоль?
Как и в JSP, если мы напечатаем что-то вроде этого system.out.println("some")
, оно будет там, на консоли, а не на странице.
Ответы:
Fire Fox
В Firefox вы можете использовать расширение под названием FirePHP, которое позволяет регистрировать и выгружать информацию из ваших PHP-приложений на консоль. Это дополнение к удивительному расширению веб-разработки Firebug .
Хром
Однако, если вы используете Chrome, есть инструмент отладки PHP, называемый Chrome Logger или webug (у webug есть проблемы с порядком журналов).
В последнее время Clockwork находится в активной разработке, которая расширяет Инструменты разработчика, добавляя новую панель для предоставления полезной информации об отладке и профилировании. Он обеспечивает готовую поддержку Laravel 4 и Slim 2, а также может быть добавлена поддержка с помощью расширяемого API.
Использование Xdebug
Лучший способ отладить ваш PHP - использовать Xdebug . Большинство браузеров предоставляют вспомогательные расширения, которые помогут вам передать требуемую строку cookie / строки запроса для инициализации процесса отладки.
Или вы используете трюк из 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
"Debug Objects: " . $data . ""
$data
в выводе появляется, то вы не ввели функцию точно так, как показано. Внимательно посмотрите на одинарные и двойные кавычки, чтобы убедиться, что они соответствуют приведенному выше коду. $data
переменная php; ко времени отправки страницы в браузер эта переменная php будет заменена на параметр, переданный в debug_to_console
. Браузер никогда не должен видеть $data
. (Если вы посмотрите page source
в браузере, это не должно сказать $data
.)
Если вы ищете простой подход, используйте JSON:
<script>
console.log(<?= json_encode($foo); ?>);
</script>
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>"; }
По умолчанию отправляются все выходные данные stdout
, то есть HTTP-ответ или консоль, в зависимости от того, запускается ли ваш скрипт Apache или вручную в командной строке. Но вы можете использовать error_log
для регистрации, и различные потоки ввода / вывода могут быть записаны с fwrite
.
error_log
это то , что мне нужно было вывести на терминал через встроенный веб-сервер PHP
Попробуйте следующее. Это работает:
echo("<script>console.log('PHP: " . $data . "');</script>");
echo
"<div display='none'>
<script type='text/javascript'>
console.log('console log message');
</script>
</div>";
Создает
<div>
с
display="none"
так что div не отображается, но
console.log()
Функция создана в JavaScript. Таким образом, вы получите сообщение в консоли.
div
. если у вас просто есть <script>
блок, в браузере ничего не будет отображаться.
json.encode
кавычки не ломали вашу строку кода. Например:echo "<script>console.log(".json_encode($msg).")</script>";
Как автор связанной веб-страницы в популярном ответе , я хотел бы добавить свою последнюю версию этой простой вспомогательной функции. Это гораздо прочнее.
Я использую 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);`
Также простой пример, как изображение, понять его гораздо проще:
Я думаю, что это может быть использовано -
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"]}
Некоторые отличные ответы, которые добавляют больше глубины; но мне нужно было что-то более простое и более похожее на console.log()
команду JavaScript .
Я использую PHP во многих «сбора данных и превращения в XML» в приложениях Ajax. JavaScript console.log
не работает в этом случае; это нарушает вывод XML.
У Xdebug и т. Д. Были похожие проблемы.
Мое решение в Windows:
.txt
файл, который довольно легко получить и записатьerror_log
переменную PHP в .ini
файле для записи в этот файлerror_log('myTest');
PHP для отправки сообщенийЭто простое решение и большую часть времени отвечает моим потребностям. Стандартный PHP, и панель предварительного просмотра автоматически обновляется каждый раз, когда PHP пишет в него.
json_encode
также решить проблему? Если это так, то, возможно, кавычки в сообщении помешали кавычкам в скрипте. (например:) echo "<script>console.log(".json_encode($msg).")</script>";
. Если нет, мне любопытно, в чем проблема, которая вызвала сбой скрипта console.log, и как / почему ваше решение это исправило. Ваше решение хорошо - я просто пытаюсь узнать больше об условиях, которые привели к console.log
сбою вывода xml. Во многих случаях журнал ошибок, как вы сделали, намного лучше, чем быстрый console.log
.
$variable = "Variable";
echo "<script>console.log('$variable');</script>";
Взаимодействие PHP и JavaScript.
Я считаю это полезным:
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 не отображается
$output = '<script>console.log("' . str_repeat(" ", $priority-1)
и . '");</script>';
. Только implode(",", $data)
и $data
отличается.
Короткий и простой, для массивов, строк или также объектов.
function console_log( $data ) {
$output = "<script>console.log( 'PHP debugger: ";
$output .= json_encode(print_r($data, true));
$output .= "' );</script>";
echo $output;
}
function phpconsole($label='var', $x) {
?>
<script type="text/javascript">
console.log('<?php echo ($label)?>');
console.log('<?php echo json_encode($x)?>');
</script>
<?php
}
Если вы хотите писать в лог-файл PHP, а не в консоль JavaScript, вы можете использовать это:
error_log("This is logged only to the PHP log")
Ссылка: error_log
Для 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 .
Вывод может выглядеть так:
"ccampbell/chromephp": "*"
Существует также отличное расширение Google Chrome, PHP Console , с библиотекой PHP, которая позволяет:
error file:line
в ваш текстовый редактор.Я искал способ отладки кода в плагине 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
файл дочерней темы и затем вызываться в любом месте кода.
Я отказался от всего вышесказанного в пользу Debugger & Logger . Я не могу похвалить это достаточно!
Просто нажмите на одну из вкладок в правом верхнем углу или нажмите здесь, чтобы развернуть / скрыть.
Обратите внимание на различные «категории». Вы можете щелкнуть любой массив, чтобы развернуть / свернуть его.
С веб-страницы
Основные характеристики:
- Показывать глобальные переменные ($ GLOBALS, $ _POST, $ _GET, $ _COOKIE и т. Д.)
- Показать версию PHP и загруженные расширения
- Замените PHP встроенный обработчик ошибок
- Журнал SQL-запросов
- Отслеживать время выполнения кода и SQL-запросов
- Проверьте переменные на предмет изменений
- Отслеживание вызовов функций
- Анализ покрытия кода, чтобы проверить, какие строки скрипта были выполнены
- Дамп всех типов переменных
- Инспектор файлов с подсветкой кода для просмотра исходного кода
- Отправлять сообщения в консоль JavaScript (только Chrome), для сценариев Ajax
С 2017 года Firebug и, следовательно, FirePHP был отключен .
Я написал несколько небольших изменений в инструменте ChromePHP, чтобы обеспечить плавный переход с FirePHP на Firebug для отладки через консоль.
Эта статья объясняет в простых простых шагах
Миграция с FirePHP на ChromePHP за 5 минут (без нарушения существующего кода)
Для вызовов Ajax или ответов XML / JSON, когда вы не хотите связываться с телом, вам нужно отправлять журналы через заголовки HTTP, а затем добавлять их в консоль с веб-расширением. Вот как FirePHP (больше не доступен) и QuantumPHP (форк ChromePHP) делают это в Firefox.
Если у вас есть терпение, лучше использовать x-debug - вы получите более глубокое понимание PHP с возможностью приостановить выполнение сценария, посмотреть, что происходит, а затем возобновить выполнение сценария.
Я мог бы опоздать на вечеринку, но я искал реализацию функции регистрации, которая:
console.log()
,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);
?>
Вот мое решение, хорошо то, что вы можете передать столько параметров, сколько захотите.
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);
Теперь вы должны видеть вывод в своей консоли, счастливое кодирование :)
Использование:
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));
}
Вот удобная функция. Он очень прост в использовании, позволяет передавать любое количество аргументов любого типа и отображает содержимое объекта в окне консоли браузера, как если бы вы вызывали 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 за один вызов функции.
Хотя это старый вопрос, я искал это. Вот моя компиляция некоторых решений, на которые даны ответы здесь, и некоторые другие идеи, найденные в других местах, чтобы получить универсальное решение для всех.
КОД:
// 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 ) вместо всплывающих предупреждений. Это довольно круто и возможности безграничны, вы можете играть в свои любимые мелодии и сделать кодирование менее напряженным.