Wie drucke ich ein Debug-Protokoll?

129

Ich würde gerne PHP-Code debuggen, aber ich denke, das Drucken eines Protokolls auf einen Bildschirm oder eine Datei ist für mich in Ordnung.

Wie soll ich ein Protokoll in PHP-Code drucken?

Das übliche print/printf scheint zur HTML-Ausgabe zu gehen, nicht zur Konsole.

Ich habe einen Apache-Server, der den PHP-Code ausführt.

Eugen
quelle
Läuft Ihr Skript in einem Webbrowser oder in einer Konsole (auch bekannt als mit php.exe anstatt mit apache / iis analysiert)?
Danielrsmith
Sie sollten sich diese Frage ansehen, hat ein paar
Ben
Aus welcher Sprache kommst du? Nur damit Sie PHP ist ganz anders als andere kompilierte Sprachen
Ibu
1
@lbu: ja .. Ich habe nicht erwartet, printfFrage würde sich dies viele upvotes ...
eugene
error_log ($ string);
Thewebus

Antworten:

186

Ein weniger bekannter Trick ist, dass mod_php stderr dem Apache-Protokoll zuordnet. Und dafür gibt es einen Stream, der file_put_contents('php://stderr', print_r($foo, TRUE))den Wert von gut $fooin das Apache-Fehlerprotokoll einfügt.

chx
quelle
1
+ oned für die Erwähnung, dass Sie übrigens auch den Wert von error_log auf 'php: // stdout' setzen können, wenn Sie eine Konsolen-App debuggen und die Fehlermeldungen direkt auf der Konsole erscheinen lassen, dh: error_log ("Sie haben es vermasselt!", 3 , "php: // stdout");
Stefgosselin
4
+1 Ich habe zu lange gebraucht, um diese Antwort zu finden. Das ist alles, wonach ich wirklich gesucht habe. Ich konnte nicht herausfinden, wie ich sehen konnte, was mein Array enthielt (funktioniert in Drupal).
SteveS
Ich würde auch vorschlagen, var_export($foo, true)anstelle von zu verwenden, print_r($foo, true)wenn Sie print_rnicht die Typinformationen erhalten, die Sie benötigen.
Ben
Wäre das nicht dasselbe wie error_log (print_r ($ foo))? ?
Brunis
143
error_log(print_r($variable, TRUE)); 

könnte nützlich sein

Olivier Berger
quelle
2
Leider ist dies die bequemste Lösung. Xdebug ist zu schwer, um es die ganze Zeit laufen zu lassen. Für Sie gewählt
Phung D. An
26

Sie können error_log verwenden , um eine Fehlerprotokolldatei an Ihren Server zu senden (oder eine optionale andere Datei, wenn Sie möchten).

pthurlow
quelle
21

Wenn Sie unter Linux arbeiten:

file_put_contents('your_log_file', 'your_content');

oder

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

und dann in der Konsole

tail -f your_log_file

Dies zeigt kontinuierlich die letzte Zeile in der Datei an.

user3029507
quelle
9

Sie müssen Ihre Einstellung ändern. Sie schreiben PHP, nicht was auch immer Sie gewohnt sind zu schreiben. Das Debuggen in PHP erfolgt nicht in einer Konsolenumgebung.

In PHP gibt es drei Kategorien von Debugging-Lösungen:

  1. Ausgabe auf eine Webseite (siehe dBug-Bibliothek für eine schönere Ansicht der Dinge).
  2. Schreiben Sie in eine Protokolldatei
  3. Beim Debuggen von Sitzungen mit xDebug

Lernen Sie, diese zu verwenden, anstatt zu versuchen, PHP dazu zu bringen, sich wie jede andere Sprache zu verhalten, die Sie gewohnt sind.

Sylverdrag
quelle
31
Als jemand, der viel Zeit damit verbringt, Konsolen-Apps und verschiedene Nicht-Web- Skripte zu schreiben , werde ich dem höflich widersprechen.
Stefgosselin
Ich arbeite viel daran, Konsolenanwendungen zu warten und zu entwickeln, und in meiner schlechten englischen Interpretation der Frage war davon ausgegangen worden, dass er eine Konsolenanwendung debuggen wollte. Xdebug ist in Ordnung und sehr praktisch, obwohl ich gerne Informationen direkt in meinem Editor
debugge
1
@Stefgosselin: Netbeans macht so ziemlich das Gleiche, obwohl das Beste, was ich mit xDebug gesehen habe, mit Aptana war.
Sylverdrag
1
Ich benutze xDebug auf Netbeans und es funktioniert die meiste Zeit gut. Es gibt jedoch Situationen, in denen Sie Daten in einer Datei protokollieren müssen.
Cosan
Probieren Sie diese auch aus. Sie werden mehr tun können! stackoverflow.com/a/44050914/2053479
Ganesh
5

Debuggen Sie auf der Konsole? Es gibt verschiedene Optionen zum Debuggen von PHP. Die am häufigsten verwendete Funktion für das schnelle und fehlerhafte Debuggen ist var_dump .

Davon abgesehen und aus dem Weg, obwohl var_dump großartig ist und viele Leute alles damit machen, gibt es andere Tools und Techniken , die es ein bisschen aufpeppen können.

<pre> </pre>Um das Debuggen auf einer Webseite zu erleichtern, wickeln Sie Tags um Ihre Dump-Anweisung, um eine korrekte Formatierung für Arrays und Objekte zu erhalten.

Dh:

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

Stellen Sie zu guter Letzt sicher, dass beim Debuggen der Fehlerbehandlung Fehler angezeigt werden. Das Hinzufügen am oberen Rand Ihres Skripts kann erforderlich sein, wenn Sie dazu nicht auf die Serverkonfiguration zugreifen können.

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

Viel Glück!

stefgosselin
quelle
2

Wenn Sie ein Framework wie Zend nicht integrieren möchten, können Sie die Methode trigger_error verwenden, um sich im PHP-Fehlerprotokoll anzumelden.

jopke
quelle
2

Einfach so ist trigger_error:

 trigger_error("My error");

Sie können jedoch keine Arrays oder Objekte verwenden

var_dump
Danzan
quelle
trigger_error ist wahrscheinlich der beste Weg, um in Ihre Fehlerprotokolle zu schreiben. Sie werden sich bedanken, wenn Sie später die Protokollzeilen mit einigen benutzerdefinierten Daten ändern möchten.
Anshul
2

Sie können auch in eine Datei wie diese schreiben:

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

Stellen Sie sicher, dass die richtigen Berechtigungen festgelegt sind, damit PHP auf die Datei zugreifen und in sie schreiben kann ( 775).

anorganik
quelle
1

Sie können das PHP Curl-Modul verwenden, um Anrufe an http://liveoutput.com/ zu tätigen . Dies funktioniert hervorragend in einer sicheren Unternehmensumgebung, in der bestimmte Einschränkungen in der php.ini vorhanden sind, die die Verwendung von einschränken file_put_contents.

Steve K.
quelle
1

Dies ist ein großartiges Tool zum Debuggen und Protokollieren von PHP: PHP Debugger & Logger

Es funktioniert sofort mit nur 3 Codezeilen. Es kann Nachrichten zum Ajax-Debugging an die js-Konsole senden und den Fehlerbehandler ersetzen. Es gibt auch Informationen zu Variablen wie var_dump () und print_r () aus, jedoch in einem besser lesbaren Format. Sehr schönes Werkzeug!

Charlie
quelle
1

Ich habe viele davon verwendet, aber da ich normalerweise beim Entwickeln debuggen muss und da ich auf localhost entwickle, habe ich die Ratschläge anderer befolgt und schreibe jetzt in die JavaScript-Debug-Konsole des Browsers (siehe http: //www.codeforest). net / debugging-php-in-browser-javascript-konsole ).

Das bedeutet, dass ich auf die Webseite schauen kann, die mein PHP in meinem Browser generiert, und F12 drücken kann, um Debug-Trace schnell ein- / auszublenden.

Da ich ständig nach Entwicklertools für Debugger, CSS-Layout usw. suche, ist es sinnvoll, dort mein PHP-Loggon zu betrachten.

Wenn uns jemand diesen Code beschließt, habe ich eine kleine Änderung vorgenommen. Nach dem

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

Ich fügte hinzu

$name = 'PHP: ' . $name;

Dies liegt daran, dass mein serverseitiges PHP HTML generiert, das JavaScript enthält, und ich finde es nützlich, zwischen der Ausgabe von PHP und JS zu unterscheiden.

(Hinweis: Ich aktualisiere dies derzeit, damit ich verschiedene Ausgabetypen ein- und ausschalten kann: über PHP, über JS und über den Datenbankzugriff.)

Mawg sagt, Monica wieder einzusetzen
quelle
1

Ich benutze Cakephp, also benutze ich:

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

Sie können verwenden:

<?php
echo '<script>console.log("debug log")</script>';
?>
steffanjj
quelle
2
Das hat viel Aufwand. Warum Javascript für eine einfache Fehlerausgabe aufrufen?
clockw0rk
-8

Sie können verwenden

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

oder wenn Sie diese Anweisung in einem Protokoll drucken möchten, können Sie sie verwenden

AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);
Hart
quelle
8
AddLog? Dies ist keine native Funktion.
Stefgosselin