Чи можливо написати рядок або увійти в консоль?
Що я маю на увазі
Як і в JSP, якщо ми надрукуємо щось подібне system.out.println("some")
, воно буде там на консолі, а не на сторінці.
Чи можливо написати рядок або увійти в консоль?
Як і в JSP, якщо ми надрукуємо щось подібне system.out.println("some")
, воно буде там на консолі, а не на сторінці.
Відповіді:
Firefox
У Firefox ви можете використовувати розширення під назвою FirePHP, яке дозволяє вести журнал та скидання інформації з ваших програм PHP на консоль. Це доповнення до дивовижного розширення веб-розробки Firebug .
Хром
Однак якщо ви використовуєте Chrome, є інструмент налагодження PHP під назвою Chrome Logger або webug (у Webug є проблеми з порядком журналів).
Зовсім недавно Clockwork знаходиться в активному розвитку, який розширює Інструменти для розробників, додаючи нову панель для надання корисної інформації про налагодження та профілювання. Він надає підтримку Laravel 4 і Slim 2 з прямої коробки, а підтримку можна додати через її розширюваний API.
Використання Xdebug
Кращим способом налагодження PHP було б через Xdebug . Більшість браузерів надають допоміжні розширення, які допоможуть вам передати необхідний рядок файлів cookie / запитів для ініціалізації процесу налагодження.
Або ви використовуєте фокус від налагодження PHP для консолі .
Для початку вам потрібно трохи помічників 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>";
Створює a
<div>
з
display="none"
щоб дів не відображався, а
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"]}
Деякі чудові відповіді, що додають більше глибини; але мені було потрібно щось простіше і більше, як команда JavaScript console.log()
.
Я використовую 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 , з бібліотекою 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
файлі дочірньої теми, а потім її можна буде викликати в будь-якому місці коду.
Я відмовився від усього вищесказаного на користь налагоджувача та реєстратора . Я не можу його досить похвалити!
Просто натисніть на одну з вкладок вгорі праворуч або на "натисніть тут", щоб розгорнути / приховати.
Зауважте різні "категорії". Ви можете натиснути будь-який масив, щоб розгорнути / згорнути його.
З веб-сторінки
Основні риси:
- Показати глобальні змінні ($ 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 ) замість спливаючих повідомлень. Це досить круто і можливостей нескінченно, ви можете грати улюблені мелодії і робити кодування менш напруженим.