Можно ли написать строку или войти в консоль?
Что я имею в виду
Как и в JSP, если мы напечатаем что-то вроде system.out.println("some")
, оно будет там, на консоли, а не на странице.
Можно ли написать строку или войти в консоль?
Как и в JSP, если мы напечатаем что-то вроде system.out.println("some")
, оно будет там, на консоли, а не на странице.
Firefox
В Firefox вы можете использовать расширение FirePHP, которое позволяет регистрировать и выгружать информацию из ваших PHP-приложений в консоль. Это дополнение к удивительному расширению для веб-разработки Firebug.
Chrome
Однако, если вы используете 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
Если вы ищете простой подход, эхо как JSON:
<script>
console.log(<?= json_encode($foo); ?>);
</script>
По умолчанию весь вывод идет на stdout
, который является ответом HTTP или консолью, в зависимости от того, выполняется ли ваш script Apache или вручную в командной строке. Но вы можете использовать error_log
для ведения журнала и различные потоки ввода-вывода можно записать с помощью fwrite
.
Попробуйте следующее. Это работает:
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. Таким образом, вы получите сообщение в консоли.
Как автор связанной веб-страницы в популярном ответе, я хотел бы добавить свою последнюю версию этой простой вспомогательной функции. Это гораздо прочнее.
Я использую 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"]}
Некоторые отличные ответы, которые добавляют больше глубины; но мне нужно было нечто более простое и более похожее на команду JavaScript console.log()
.
Я использую PHP во многих "сбора данных и превращения в XML" в приложениях Ajax. JavaScript console.log
не работает в этом случае; это нарушает вывод XML.
У Xdebug и т.д. Были похожие проблемы.
Мое решение в Windows:
.txt
, в который легко попасть и который можно записатьerror_log
в файле .ini
для записи в этот файлerror_log('myTest');
для отправки сообщенийЭто простое решение и большую часть времени отвечает моим потребностям. Стандартный PHP, и панель предварительного просмотра автоматически обновляется каждый раз, когда PHP пишет в него.
Я считаю это полезным:
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.
$variable = "Variable";
echo "<script>console.log('$variable');</script>";
PHP и JavaScript взаимодействие.
Короткий и простой, для массивов, строк или объектов.
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
Существует также отличное расширение Google Chrome, PHP Console, с библиотекой PHP, которое позволяет:
error file:line
в текстовом редакторе.Для 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.
Вывод может выглядеть следующим образом:
Я отказался от всего вышеперечисленного в пользу Debugger & Logger. Я не могу похвалить это достаточно!
Просто нажмите на одну из вкладок в правом верхнем углу или нажмите "здесь", чтобы развернуть/скрыть.
Обратите внимание на разные "категории". Вы можете щелкнуть любой массив, чтобы развернуть/свернуть его.
С веб-страницы
Main features:
- Показывать глобальные переменные ($ GLOBALS, $ _POST, $ _GET, $ _COOKIE и т.д.)
- Показать версию PHP и загруженные расширения
- Замените PHP встроенный обработчик ошибок
- Журнал SQL-запросов
- Отслеживать время выполнения кода и SQL-запросов
- Проверять переменные на предмет изменений
- Отслеживание вызовов функций
- Анализ покрытия кода, чтобы проверить, какие строки скрипта были выполнены
- Дамп всех типов переменных
- Инспектор файлов с подсветкой кода для просмотра исходного кода
- Отправка сообщений в консоль JavaScript (только Chrome) для сценариев Ajax
Я искал способ отладки кода в плагине 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
дочерней темы и затем вызывать в любом месте кода.
С 2017 года Firebug и, следовательно, FirePHP отключены.
Я написал несколько небольших изменений в инструменте ChromePHP, чтобы обеспечить плавный переход с FirePHP на Firebug для отладки через консоль.
Эта статья объясняет простым и понятным образом
Миграция с FirePHP на ChromePHP за 5 минут (без нарушения существующего кода)
Для вызовов Ajax или ответов XML/JSON, когда вы не хотите связываться с телом, вам нужно отправлять журналы через заголовки HTTP, а затем добавлять их в консоль с веб-расширением. Именно так FirePHP (больше не доступен) и QuantumPHP (форк ChromePHP) делают это в Firefox.
Если у вас есть терпение, лучше использовать x-debug - вы получите более глубокое представление о PHP с возможностью приостановить выполнение сценария, посмотреть, что происходит, а затем возобновить выполнение сценария.
Любой из этих двух работает:
<?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>");
?>
Использование:
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 из одного вызов функции.