Як надрукувати журнал налагодження?


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 ($ string);
Thewebus

Відповіді:


186

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


1
+ oned, щоб згадати про це, btw ви також можете встановити значення error_log на 'php: // stdout' під час налагодження програми консолі, і повідомлення про помилки з’являться прямо до консолі, тобто: error_log ("Ви заплуталися!", 3 , "php: // stdout");
stefgosselin

4
+1 Мені знадобилося занадто багато часу, щоб знайти цю відповідь. Це все, що я насправді шукав. Я не міг зрозуміти, як бачити мій масив (працюючи в Drupal).
SteveS

Я б також запропонував використовувати var_export($foo, true)замість того, print_r($foo, true)якщо print_rви не отримаєте потрібну інформацію про тип.
Бен

Чи не це буде те саме, що помилка_log (print_r ($ foo)); ?
Бруніс

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

може бути корисним


2
На жаль, це найзручніше рішення. Xdebug важкий, щоб запускати його весь час. Проголосували за вас
Phung D.

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.
Сільвердраг

1
Я використовую xDebug на Netbeans, і він працює чудово більшу частину часу. Але бувають випадки, коли вам потрібно записати матеріал у файл.
козан

спробуйте також ... ви зможете зробити більше! stackoverflow.com/a/44050914/2053479
Ганеш

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 , ви можете скористатися методом тригер__помилки для входу в журнал помилок php.


2

Простий спосіб - це запускати_помилка:

 trigger_error("My error");

але ви не можете ставити масиви або об'єкти, тому використовуйте

var_dump

Тригер_еррор - це, мабуть, найкращий спосіб запису до ваших журналів помилок. Ви будете вдячні, коли пізніше ви хочете змінити, наприклад, рядки журналу з деякими спеціальними даними.
Аншул

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-browser-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.