Как распечатать журнал отладки?


129

Я хотел бы отладить некоторый PHP-код, но, думаю, мне подойдет вывод журнала на экран или в файл.

Как мне распечатать журнал в PHP-коде?

Обычный print/, printfпохоже, идет на вывод HTML, а не на консоль.

У меня есть сервер Apache, выполняющий код PHP.


Ваш скрипт запущен в веб-браузере или в консоли (он же анализируется с помощью php.exe, а не apache / iis)?
danielrsmith

Вам следует взглянуть на этот вопрос, есть немного полезного кода для ведения журнала: stackoverflow.com/questions/5769537/…
Бен

с какого ты языка? Просто ваш php сильно отличается от других компилируемых языков
Ibu

1
@lbu: действительно .. Я не ожидал, printfвопрос был бы получить это много upvotes ...
Эжен

error_log ($ строка);
Thewebus

Ответы:


186

Менее известный трюк заключается в том, что mod_php отображает stderr в журнал Apache. И для этого есть поток, поэтому он file_put_contents('php://stderr', print_r($foo, TRUE))будет $fooзаписывать значение в журнал ошибок Apache.


1
+ Следует упомянуть, что, кстати, вы также можете установить значение error_log равным 'php: // stdout' при отладке консольного приложения, и сообщения об ошибках будут выводиться прямо на консоль, то есть: error_log («Вы напортачили!», 3 , "php: // stdout");
stefgosselin

4
+1 Я долго искал этот ответ. Это все, что я действительно искал. Я не мог понять, как увидеть, что содержится в моем массиве (работая в Drupal).
SteveS

Я также предлагаю использовать var_export($foo, true)вместо print_r($foo, true)if print_rне дает вам нужную информацию о типе.
Бен

Разве это не то же самое, что error_log (print_r ($ foo)); ?
Брунис

143
error_log(print_r($variable, TRUE)); 

может быть полезно


2
К сожалению, это наиболее удобное решение. Xdebug слишком тяжело запускать его все время. Проголосовал за вас
Phung D. An

26

Вы можете использовать error_log для отправки на ваш сервер файла журнала ошибок (или необязательного другого файла, если хотите)


21

Если вы используете Linux:

file_put_contents('your_log_file', 'your_content');

или

error_log ('your_content', 3, 'your_log_file');

а затем в консоли

tail -f your_log_file

Это будет постоянно показывать последнюю строку, помещенную в файл.


9

Вам нужно изменить свое настроение. Вы пишете PHP, а не то, что вы привыкли писать. Отладка в PHP не выполняется в консольной среде.

В PHP есть 3 категории решений для отладки:

  1. Вывод на веб-страницу (см. Библиотеку dBug для лучшего обзора).
  2. Запись в файл журнала
  3. При отладке сеанса с помощью xDebug

Научитесь использовать их вместо того, чтобы пытаться заставить PHP вести себя как любой другой язык, к которому вы привыкли.


31
Как человек, который тратит много времени на написание консольных приложений и различных не веб- скриптов, я вежливо не согласен с этим.
stefgosselin

Я много работаю, поддерживая и разрабатывая консольные приложения, и в моей плохой английской интерпретации вопроса предполагал, что он искал отладку консольного приложения. Xdebug прекрасен и очень удобен, хотя мне нравится отлаживать информацию прямо в моем редакторе
stefgosselin

1
@Stefgosselin: Netbeans делает почти то же самое, хотя лучшее, что я видел с xDebug, было с Aptana.
Sylverdrag

1
Я использую xDebug в Netbeans, и большую часть времени он работает нормально. Но бывают случаи, когда вам нужно записывать данные в файл.
cosan

попробуйте и это ... вы сможете больше! stackoverflow.com/a/44050914/2053479
ganesh

5

Вы отлаживаете на консоли? Существуют различные варианты отладки PHP. Самая распространенная функция, используемая для быстрой и грязной отладки, - это var_dump .

Об этом говорится и в стороне, хотя var_dump потрясающий, и многие люди делают все с его помощью, есть другие инструменты и методы, которые могут немного оживить его.

Вещи, которые могут помочь при отладке на веб-странице, оберните <pre> </pre>теги вокруг оператора дампа, чтобы обеспечить правильное форматирование массивов и объектов.

То есть:

<div> some html code ....
      <a href="<?php $tpl->link;?>">some link to test</a>
</div>

      dump $tpl like this:

    <pre><?php var_dump($tpl); ?></pre>

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

error_reporting(E_ALL);
ini_set('display_errors', '1');

Удачи!


2

Если вы не хотите интегрировать фреймворк, такой как Zend , вы можете использовать метод trigger_error для входа в журнал ошибок php.


2

Проще говоря, trigger_error:

 trigger_error("My error");

но вы не можете помещать массивы или объекты, поэтому используйте

var_dump

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

2

Вы также можете записать в такой файл:

$logFilePath = '../logs/debug.text';
ob_start();

// if you want to concatenate:
if (file_exists($logFilePath)) {
    include($logFilePath);
}
// for timestamp
$currentTime = date(DATE_RSS);

// echo log statement(s) here
echo "\n\n$currentTime - [log statement here]";

$logFile = fopen($logFilePath, 'w');
fwrite($logFile, ob_get_contents());
fclose($logFile);
ob_end_flush();

Убедитесь, что установлены правильные разрешения, чтобы php мог получить доступ и записать в файл ( 775).


1

Вы можете использовать модуль php curl для звонков на http://liveoutput.com/ . Это отлично работает в безопасной корпоративной среде, где существуют определенные ограничения в php.ini, которые ограничивают использование file_put_contents.


1

Это отличный инструмент для отладки и регистрации php: PHp Debugger & Logger

Он работает сразу после установки всего в 3 строчки кода. Он может отправлять сообщения на консоль js для отладки ajax и может заменить обработчик ошибок. Он также выводит информацию о таких переменных, как var_dump () и print_r (), но в более читаемом формате. Очень красивый инструмент!


1

Я использовал многие из них, но поскольку мне обычно требуется отладка при разработке, и поскольку я разрабатываю на localhost, я последовал советам других и теперь пишу в консоль отладки JavaScript браузера (см. Http: //www.codeforest. net / debugging-php-in-browsers-javascript-console ).

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

Поскольку я постоянно смотрю на инструменты разработчика для отладчика, верстки CSS и т. Д., Имеет смысл посмотреть там мой логон PHP.

Если кто-то решит нам этот код, я внес одно небольшое изменение. После

function debug($name, $var = null, $type = LOG) {

я добавил

$name = 'PHP: ' . $name;

Это связано с тем, что мой серверный PHP генерирует HTML, содержащий JavaScript, и я считаю полезным различать вывод PHP и JS.

(Примечание: в настоящее время я обновляю это, чтобы позволить мне включать и выключать различные типы вывода: из PHP, из JS и доступа к базе данных)


1

Я использую cakephp, поэтому использую:

$this->log(YOUR_STRING_GOES_HERE, 'debug');

0

Ты можешь использовать:

<?php
echo '<script>console.log("debug log")</script>';
?>

2
у этого много накладных расходов. зачем вызывать javascript для простого вывода ошибок?
clockw0rk

-8

Ты можешь использовать

<?php
{
    AddLog("anypage.php","reason",ERR_ERROR);
}
?>

или если вы хотите распечатать этот оператор в журнале, вы можете использовать

AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);

8
AddLog? Это не встроенная функция.
stefgosselin
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.