Come stampare un registro di debug?


129

Vorrei eseguire il debug del codice PHP, ma immagino che stampare un registro su schermo o file vada bene per me.

Come devo stampare un registro nel codice PHP?

Il solito print/ printfsembra andare all'output HTML non alla console.

Ho un server Apache che esegue il codice PHP.


Lo script è in esecuzione in un browser Web o in una console (ovvero analizzato utilizzando php.exe anziché apache / iis)?
danielrsmith,

Dovresti dare un'occhiata a questa domanda, ha un po 'di utile codice di registrazione: stackoverflow.com/questions/5769537/…
Ben

da quale lingua vieni? Solo così il tuo php è molto diverso dagli altri linguaggi compilati
Ibu,

1
@lbu: anzi .. non mi aspettavo, printfdomanda otterrebbe questo molti upvotes ...
eugene

error_log ($ string);
Thewebus,

Risposte:


186

Un trucco meno noto è che mod_php associa stderr al registro di Apache. E c'è un flusso per questo, quindi file_put_contents('php://stderr', print_r($foo, TRUE))scaricherà bene il valore $foonel registro degli errori di Apache.


1
+ per averlo menzionato, tra l'altro puoi anche impostare il valore di error_log su 'php: // stdout' quando esegui il debug di un'app console e fai apparire i messaggi di errore direttamente sulla console, ovvero: error_log ("Hai incasinato!", 3 , "php: // stdout");
stefgosselin,

4
+1 Mi ci è voluto troppo tempo per trovare questa risposta. Questo è tutto ciò che stavo davvero cercando. Non riuscivo a capire come vedere cosa conteneva il mio array (lavorando in Drupal).
SteveS,

Vorrei anche suggerire di utilizzare var_export($foo, true)invece di print_r($foo, true)se print_rnon ottieni le informazioni sul tipo di cui hai bisogno.
Ben

Non sarebbe lo stesso di error_log (print_r ($ foo)); ?
Brunis,

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

potrebbe essere utile


2
Sfortunatamente, questa è la soluzione più conveniente. Xdebug è troppo pesante per eseguirlo tutto il tempo. Votato per te
Phung D. An il

26

È possibile utilizzare error_log per inviare al file di registro errori del server (o un altro file facoltativo, se lo si desidera)


21

Se sei su Linux:

file_put_contents('your_log_file', 'your_content');

o

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

e poi in console

tail -f your_log_file

Questo mostrerà continuamente l'ultima riga inserita nel file.


9

Devi cambiare il tuo stato d'animo. Stai scrivendo PHP, non qualsiasi altra cosa tu sia abituato a scrivere. Il debug in PHP non viene eseguito in un ambiente console.

In PHP, hai 3 categorie di soluzioni di debug:

  1. Uscita su una pagina Web (vedere la libreria dBug per una visione migliore delle cose).
  2. Scrivi in ​​un file di registro
  3. Durante il debug della sessione con xDebug

Impara a usare quelli invece di cercare di far comportare PHP come qualsiasi altra lingua a cui sei abituato.


31
Come uno che passa molto tempo a scrivere app per console e vari script non web , sarò educatamente in disaccordo con quello.
stefgosselin,

Lavoro molto mantenendo e sviluppando le applicazioni console e nella mia cattiva interpretazione inglese della domanda avevo ipotizzato che stesse cercando di eseguire il debug di un'app console. Xdebug è perfetto e molto utile anche se mi piacciono le informazioni di debug nel mio editor
stefgosselin,

1
@Stefgosselin: Netbeans fa praticamente lo stesso, anche se il migliore che ho visto con xDebug è stato con Aptana.
Sylverdrag,

1
Uso xDebug su Netbeans e funziona bene per la maggior parte del tempo. Ma ci sono momenti in cui è necessario registrare elementi su un file.
cosan

prova anche questi .. sarai in grado di fare di più! stackoverflow.com/a/44050914/2053479
ganesh,

5

Stai eseguendo il debug su console? Esistono varie opzioni per il debug di PHP. La funzione più comune utilizzata per il debug rapido e sporco è var_dump .

Detto questo e fuori mano, anche se var_dump è fantastico e molte persone fanno tutto con quello, ci sono altri strumenti e tecniche che possono rendere un po 'più piccante.

Cose da aiutare se si esegue il debug in una pagina Web, avvolgere i <pre> </pre>tag attorno all'istruzione di dump per fornire una formattazione corretta su array e oggetti.

Vale a dire:

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

Infine, assicurati che il debug della gestione degli errori sia impostato per visualizzare gli errori. L'aggiunta nella parte superiore dello script potrebbe essere necessaria se non è possibile accedere alla configurazione del server per farlo.

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

In bocca al lupo!


2

Se non si desidera integrare un framework come Zend , è possibile utilizzare il metodo trigger_error per accedere al registro degli errori php.


2

Semplicemente è trigger_error:

 trigger_error("My error");

ma non è possibile inserire matrici o oggetti quindi utilizzare

var_dump

trigger_error è probabilmente il modo migliore per scrivere nei log degli errori. Ti ringrazierai quando vuoi modificare dica le righe del log con alcuni dati personalizzati in seguito.
Anshul,

2

Puoi anche scrivere su un file come questo:

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

Assicurati che siano impostate le autorizzazioni appropriate in modo che php possa accedere e scrivere nel file ( 775).


1

È possibile utilizzare il modulo php curl per effettuare chiamate a http://liveoutput.com/ . Funziona alla grande in un ambiente aziendale sicuro in cui esistono alcune restrizioni in php.ini che ne limitano l'utilizzo file_put_contents.


1

Questo è un ottimo strumento per il debug e la registrazione di PHP: PHP Debugger & Logger

Funziona subito con solo 3 righe di codice. Può inviare messaggi alla console js per il debug di ajax e può sostituire il gestore degli errori. Scarica anche informazioni su variabili come var_dump () e print_r (), ma in un formato più leggibile. Strumento molto bello!


1

Ho usato molti di questi, ma dal momento che di solito ho bisogno di eseguire il debug durante lo sviluppo e da quando sviluppo su localhost, ho seguito i consigli di altri e ora scrivo sulla console di debug JavaScript del browser (vedi http: //www.codeforest. net / debugging-php-in-browsers-javascript-console ).

Ciò significa che posso guardare la pagina Web che il mio PHP sta generando nel mio browser e premere F12 per mostrare / nascondere rapidamente qualsiasi traccia di debug.

Dal momento che sono costantemente alla ricerca degli strumenti di sviluppo per debugger, layout CSS, ecc., Ha senso guardare lì il mio accesso PHP.

Se qualcuno ci decide quel codice, ho fatto una piccola modifica. Dopo

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

Ho aggiunto

$name = 'PHP: ' . $name;

Questo perché PHP sul mio server genera HTML conatining JavaScript e trovo utile distinguere l'output da PHP e JS.

(Nota: lo sto attualmente aggiornando per permettermi di accendere e spegnere diversi tipi di output: da PHP, da JS e accesso al database)


1

Uso cakephp quindi uso:

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

0

Puoi usare:

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

2
questo ha molte spese generali. perché invocare javascript per un semplice output di errore?
clockw0rk,

-8

Puoi usare

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

o se vuoi stampare quella dichiarazione in un registro che puoi usare

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

8
AddLog? Questa non è una funzione nativa.
stefgosselin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.