Jak wydrukować dziennik debugowania?

129

Chciałbym zdebugować kod PHP, ale wydaje mi się, że wydrukowanie dziennika na ekranie lub do pliku jest dla mnie w porządku.

Jak wydrukować dziennik w kodzie PHP?

Zwykłe print/ printfwydaje się iść do wyjścia HTML, a nie do konsoli.

Mam serwer Apache wykonujący kod PHP.

eugene
źródło
Czy Twój skrypt działa w przeglądarce internetowej lub na konsoli (czyli jest analizowany przy użyciu php.exe zamiast apache / iis)?
danielrsmith
Powinieneś spojrzeć na to pytanie, ma trochę przydatnego kodu do logowania: stackoverflow.com/questions/5769537/ ...
Ben
z jakiego języka pochodzisz? Tak więc twój php jest zupełnie inny niż inne języki kompilowane
Ibu
1
@lbu: rzeczywiście ... nie spodziewałem się, printfpytanie dostanie tyle pozytywnych głosów ...
eugene
error_log ($ string);
Thewebus

Odpowiedzi:

186

Mniej znaną sztuczką jest to, że mod_php mapuje stderr do dziennika Apache. I jest do tego strumień, więc file_put_contents('php://stderr', print_r($foo, TRUE))ładnie zrzuci wartość $foodo dziennika błędów Apache.

chx
źródło
1
+ jeden za wspomnienie o tym, przy okazji możesz również ustawić wartość error_log na 'php: // stdout' podczas debugowania aplikacji konsolowej i sprawić, by komunikaty o błędach pojawiały się bezpośrednio na konsoli, np .: error_log ("Spieprzyłeś!", 3 , „php: // stdout”);
stefgosselin
4
+1 Znalezienie tej odpowiedzi zajęło mi zbyt dużo czasu. To wszystko, czego naprawdę szukałem. Nie mogłem dowiedzieć się, jak sprawdzić, co zawiera moja tablica (działa w Drupalu).
SteveS
Sugerowałbym również użycie var_export($foo, true)zamiast print_r($foo, true)if print_rnie zapewnia informacji o typie, których potrzebujesz.
Ben
Czy nie byłoby to to samo, co error_log (print_r ($ foo)); ?
Brunis
143
error_log(print_r($variable, TRUE)); 

może się przydać

Olivier Berger
źródło
2
Niestety jest to najwygodniejsze rozwiązanie. Xdebug jest zbyt ciężki, aby go używać przez cały czas. Głosował na ciebie
Phung D. An
26

Możesz użyć error_log, aby wysłać do swojego serwera plik dziennika błędów (lub opcjonalnie innego pliku, jeśli chcesz)

pthurlow
źródło
21

Jeśli używasz Linuksa:

file_put_contents('your_log_file', 'your_content');

lub

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

a potem w konsoli

tail -f your_log_file

Spowoduje to ciągłe wyświetlanie ostatniej linii umieszczonej w pliku.

user3029507
źródło
9

Musisz zmienić swoje nastawienie. Piszesz PHP, a nie cokolwiek innego, do czego przywykłeś. Debugowanie w PHP nie odbywa się w środowisku konsoli.

W PHP masz 3 kategorie rozwiązań do debugowania:

  1. Wyjście na stronę internetową (zobacz bibliotekę dBug, aby uzyskać lepszy widok).
  2. Zapisz do pliku dziennika
  3. Debugowanie w sesji za pomocą xDebug

Naucz się ich używać zamiast próbować sprawić, by PHP zachowywało się jak każdy inny język, do którego jesteś przyzwyczajony.

Sylverdrag
źródło
31
Jako osoba, która spędza dużo czasu na pisaniu aplikacji konsolowych i różnych skryptów innych niż internetowe , grzecznie się z tym nie zgodzę.
stefgosselin
Dużo pracuję, utrzymując i rozwijając aplikacje konsolowe, aw mojej złej angielskiej interpretacji pytania zakładałem, że szukał debugowania aplikacji konsolowej. Xdebug jest w porządku i bardzo przydatny, chociaż lubię debugować informacje bezpośrednio w moim edytorze
stefgosselin
1
@Stefgosselin: Netbeans robi prawie to samo, chociaż najlepsze, jakie widziałem z xDebug, było z Aptaną.
Sylverdrag
1
Używam xDebug na Netbeans i przez większość czasu działa dobrze. Ale są chwile, kiedy trzeba rejestrować rzeczy w pliku.
cosan
spróbuj też tego… będziesz mógł zrobić więcej! stackoverflow.com/a/44050914/2053479
ganesh
5

Czy debugujesz na konsoli? Istnieją różne opcje debugowania PHP. Najpopularniejszą funkcją używaną do szybkiego i brudnego debugowania jest var_dump .

To powiedziawszy i nie na marginesie, chociaż var_dump jest niesamowity i wiele osób robi wszystko z tym właśnie, istnieją inne narzędzia i techniki, które mogą trochę urozmaicić.

Rzeczy, które mogą pomóc w przypadku debugowania na stronie internetowej, wrap <pre> </pre> tagi wokół instrukcji dump, aby zapewnić odpowiednie formatowanie tablic i obiektów.

To znaczy:

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

I na koniec upewnij się, że debugowanie obsługi błędów jest ustawione na wyświetlanie błędów. Dodanie tego na początku skryptu może być potrzebne, jeśli nie możesz uzyskać dostępu do konfiguracji serwera, aby to zrobić.

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

Powodzenia!

stefgosselin
źródło
2

Jeśli nie chcesz integrować frameworka takiego jak Zend , możesz użyć metody trigger_error , aby zalogować się do dziennika błędów php.

jopke
źródło
2

Po prostu sposób to trigger_error:

 trigger_error("My error");

ale nie możesz umieścić tablic lub obiektów, dlatego użyj

var_dump
Danzan
źródło
trigger_error to prawdopodobnie najlepszy sposób zapisu w dziennikach błędów. Będziesz wdzięczny sobie, jeśli zechcesz później zmodyfikować, powiedzmy wiersze dziennika, niektóre niestandardowe dane.
Anshul
2

Możesz także pisać do takiego pliku:

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

Upewnij się, że ustawione są odpowiednie uprawnienia, aby php mógł uzyskać dostęp i zapisywać do pliku ( 775).

nieorganik
źródło
1

Możesz użyć modułu php curl, aby wywoływać http://liveoutput.com/ . Działa to świetnie w bezpiecznym środowisku korporacyjnym, w którym istnieją pewne ograniczenia w php.ini, które ograniczają użycie file_put_contents.

Steve K.
źródło
1

To świetne narzędzie do debugowania i logowania php: PHp Debugger & Logger

Działa od razu po wyjęciu z pudełka z zaledwie 3 liniami kodu. Może wysyłać komunikaty do konsoli js w celu debugowania Ajax i może zastąpić obsługę błędów. Zrzuca również informacje o zmiennych, takich jak var_dump () i print_r (), ale w bardziej czytelnym formacie. Bardzo fajne narzędzie!

Charlie
źródło
1

Używałem wielu z nich, ale ponieważ zwykle muszę debugować podczas programowania, a ponieważ programuję na localhost, postępowałem zgodnie z radami innych i teraz piszę do konsoli debugowania JavaScript w przeglądarce (patrz http: //www.codeforest. net / debugging-php-in-browserers-javascript-console ).

Oznacza to, że mogę spojrzeć na stronę internetową, którą moje PHP generuje w mojej przeglądarce i nacisnąć F12, aby szybko pokazać / ukryć wszelkie ślady debugowania.

Ponieważ ciągle patrzę na narzędzia programistyczne dla debuggera, układu CSS itp., Warto spojrzeć tam na mój loggon PHP.

Jeśli ktoś zdecyduje się na ten kod, wprowadziłem jedną drobną zmianę. Po

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

dodałem

$name = 'PHP: ' . $name;

Dzieje się tak, ponieważ PHP po stronie mojego serwera generuje HTML zawierający JavaScript i uważam, że przydatne jest rozróżnianie danych wyjściowych z PHP i JS.

(Uwaga: obecnie aktualizuję to, aby umożliwić mi włączanie i wyłączanie różnych typów danych wyjściowych: z PHP, z JS i dostępu do bazy danych)

Mawg mówi, że przywróć Monikę
źródło
1

Używam cakephp, więc używam:

$this->log(YOUR_STRING_GOES_HERE, 'debug');
mmv_sat
źródło
0

Możesz użyć:

<?php
echo '<script>console.log("debug log")</script>';
?>
steffanjj
źródło
2
to ma dużo narzutów. po co wywoływać javascript w celu uzyskania prostego wyniku błędu?
clockw0rk
-8

Możesz użyć

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

lub jeśli chcesz wydrukować to oświadczenie w dzienniku, którego możesz użyć

AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);
Szorstki
źródło
8
AddLog? To nie jest funkcja natywna.
stefgosselin