Debug PHP - Come eseguire il debug del codice PHP (tecniche di debug di Drupal incluse!)
Pubblicato: 2019-09-03Il debug non è qualcosa che noi sviluppatori non vediamo l'ora. Gli sviluppatori detestano i bug, ma per essere in grado di creare un software di buona qualità, il debug è una parte indispensabile della vita di uno sviluppatore. Ogni sviluppatore PHP ha uno stile e metodi diversi per eseguire il debug del codice. Questo dipende dalla loro esperienza, dal loro approccio alla risoluzione dei problemi e, soprattutto, dalla quantità di tempo che hanno a disposizione!
Quanto è importante il debug e perché è necessario eseguire il debug del codice?
Il debug è parte integrante di un ciclo di vita dello sviluppo software che garantisce risultati di qualità.
Immagina questo: la base di codice è grande, sei nuovo del progetto, non hai molti dettagli del progetto/funzionalità. Ma dovresti correggere un bug. Da dove cominciamo? Iniziamo analizzando il codice passo dopo passo per capire cosa è stato fatto e dove le cose stanno andando male. Questo, amici miei, è il debug. Il debug è un'arte che può migliorare con la pratica e l'esperienza.
Come eseguire il debug del codice PHP
Ok, ecco un caso in cui mi sono imbattuto nella mia carriera di sviluppo. C'è un sito commerciale costruito su Wordpress in cui il processo di checkout richiedeva circa 5-8 minuti e mi è stato chiesto di risolverlo. In questo caso, non ho molta conoscenza di come funzionano le cose con Wordpress. Quindi ho iniziato spuntando le opzioni dall'elenco una per una, ad esempio (a) È a causa di qualche plugin? (b) È correlato a un tema? (c) È una base di codice personalizzata? eccetera.
Lo strumento che mi ha aiutato nel debug php e nella risoluzione di questo caso è Blackfire. Questo ti dà un'opzione più leggibile dall'utente della traccia dello stack di tutte le funzioni, il tempo impiegato per ciascuna funzione nell'intero processo. Usando questo, ho trovato la funzione che sta divorando il processo di checkout. Tutto ciò di cui hai bisogno è una configurazione per aggiungere la chiave alla tua base di codice e sei pronto per analizzare qualsiasi funzionalità utilizzando la documentazione.
Quindi, puoi risolvere i bug se hai conoscenza su più metodi di debug php.
Tecniche di debug del codice
Permettetemi di parlare di alcune tecniche che ho utilizzato per il debug di PHP.
Un modo semplice e più comune per verificare se la funzione o il metodo che hai scritto viene richiamato, scrivere un'uscita. Non ci sarebbe nessuno sviluppatore che non l'abbia usato!
Per controllare il valore di alcune variabili, print_r(), var_dump(), var_export(). Ok, vediamo la differenza.
Esempio:
Assumi un array $a = array( 1, array( "a", "b") ); print_r($a);
Vettore ( [ 0 ] => 1 [ 1 ] => Matrice ( [ 0 ] => 'un' [ 1 ] => 'b' ) ) |
Questo fornisce un formato leggibile dall'uomo e informazioni sulla variabile. Inoltre, possiamo memorizzarlo in una variabile con print_r($var, true).
var_dump( $a );
matrice ( 3 ) { [ 0 ]=> intero( 1 ) [ 1 ]=> matrice ( 2 ) { [ 0 ]=> stringa( 1 ) "un" [ 1 ]=> stringa( 1 ) "b" } } |
Questo stampa insieme al tipo e alla lunghezza di ciascun valore. E questo è più veloce rispetto a print_r()
var_export( $a );
matrice ( 0 => 1 , 1 => matrice ( 0 => 'un' , 1 => 'b' , ), ) |
Questo stampa insieme al tipo e alla lunghezza di ciascun valore. E questo è più veloce rispetto a print_r()
var_export( $a );
Questo restituisce php valido, se la variabile esiste, altrimenti restituisce false. Ciò significa che l'output di var_export può essere utilizzato direttamente in un file php.
Hai mai fatto uso di debug ($ var, NULL, TRUE) fornito da Drupal core? Questo usa print_r() o var_export in base agli argomenti passati alla funzione di debug php.
Che dire degli avvertimenti come di seguito, di cui non hai idea di quale riga di codice stia causando un tale avviso.
avviso: argomento non valido fornito per foreach() in /modules/node/node.module sulla riga 485 .
Sappiamo che ci sono così tanti posti in cui verrà chiamato il modulo del nodo. Allora, come lo risolvi? Un modo più veloce senza utilizzare altre risorse esterne è utilizzare la funzione PHP debug_backtrace() . Vai a "drupal_set_message", perché sai, questo è il metodo che sta stampando l'avviso. Metti la riga sotto, in quella funzione
debug_backtrace();
Produzione:
Vettore ![]() argomento fornito per foreach() in /modules/node/node.module sulla riga 504. |
Questa funzione mostra lo stack di tutte le funzioni che vengono chiamate nel processo di causare l'avviso. Assicurati di limitare il limite, altrimenti PHP mostra un messaggio di "memoria esaurita" se lo stack impiega troppo tempo per essere visualizzato.
Debug tramite CLI:
Ho sentito parlare di phpdbg ! Sì, esiste un'estensione php disponibile da PHP 5.6+ che viene utilizzata per eseguire il debug di un file php dalla riga di comando.
Apri il tuo terminale, inserisci "phpdbg". Questo avvia una shell debugger php interattiva. Puoi anche usare i breakpoint! Provalo: il modo nascosto di eseguire il debug di PHP.
L'unico problema è: dovrai abituarti ai comandi di phpdbg per sfruttarlo al meglio.
Debug tramite Drupal:
Devel Kint: Gli sviluppatori Drupal lo usano abbastanza spesso. Kint è un sottomodulo del modulo Devel che può essere utilizzato per eseguire il debug dei modelli twig di Drupal 8 insieme a dump();
DB Log: Chi non è a conoscenza di questo modulo Drupal?! In D7 è watchdog() e D8 è il servizio logger.
\Drupal::logger( 'my_module' )->debug($message);
Ma l'unico motivo per cui non incoraggiamo l'uso di questo modulo anche se ne siamo innamorati è che il messaggio di registro viene scritto ogni volta nel database!
E immagina se si tratta di un enorme database, questo sarebbe anche peggio e influirà sulle prestazioni. Questo è il motivo, non è consigliabile utilizzare il modulo DBLOG sui siti di produzione.
Vuoi ancora utilizzare DBLog, modulare e ridurre gli impatti sulle prestazioni? C'è una soluzione anche per questo: DBlog Filter. Questo è un modulo contribuito che aiuta a limitare il tipo di log da scrivere nel database. Ad esempio, se si desidera archiviare solo i registri di gravità "errore", è possibile configurarli con questo modulo. Quindi non devi eliminare completamente il modulo Dblog . Oh sì, e questo modulo è stato contribuito da me ;)
Profiler web
Web profiler è un modulo fornito ancora una volta da Devel. Una volta abilitato il modulo, vedrai un rapporto nella parte inferiore della finestra. Ogni volta che viene caricata una pagina, questo rapporto ci fornisce il tempo di caricamento della pagina, il numero di query in esecuzione nella pagina, il numero di moduli, il numero di file js/css, ecc. in quella pagina.

Sì, questo offre anche i dettagli di ciascuna sezione facendo clic su di essi. Ad esempio, l'immagine seguente mostra le query nella home page.

XDebug - Debug tramite IDE:
Il modo migliore e più intuitivo per eseguire il debug che la maggior parte delle persone preferisce se utilizzano un IDE per la codifica è utilizzare XDebug. XDebug è un'estensione PHP che aiuta nello sviluppo e nel debug e fornisce un debugger in un unico passaggio che puoi utilizzare con un IDE come PHPStorm. Ovviamente per ottenere i migliori risultati, devi fare uno sforzo maggiore per installare e configurare l'estensione con l'IDE che stai utilizzando.

