Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Consigli per debug in PHP

    Ciao, ho creato un file di debug per facilitarmi notevolmente la vita quando programmo in PHP, che fa un po' di cosette che vi elencherò. Vorrei dei consigli su quali funzionalità potrei aggiungere e quali modificare per migliorarlo ancora, sia dal punto di vista dell'efficienza sia dal punto di vista della comodità di scrivere (la comodità prima di tutto ). Sicuramente "voi programmatori" avete un'idea di com'è un debug fatto bene Stavo pensando di aggiungere -ad esempio- qualcosa di simile ai "breakpoint", ma non riesco bene a immaginare quale utilità potrebbe avere e come implementarlo.


    Allora, il mio file ha una funzione debug [ debug($command, $arg1, $arg2, ...); ] che riceve i seguenti comandi:
    - write / writeln: stampa del testo e/o dei parametri (esattamente come echo);
    - watch: mostra il valore di uno o più parametri, indicando quali parametri sta mostrando;
    - call: chiama una funzione, indicando quando viene chiamata, gli argomenti passati alla funzione, quando si conclude e il valore ritornato;
    - enable_log / disable_log: abilita/disabilita il log del debug: se il log è disattivato, stampa tutto a video, altrimenti salva in un file (o nel database, a piacimento).

    Una differenza tra questo e il debug normale con var_dump, print_r ecc. è che basta mettere il valore di una costante a false per spegnere l'intero debug senza modificare niente .

    Script di esempio:
    Codice PHP:
    function ordina($numeri$direzione 'crescente'){

        
    debug(watch$numeri); // <-

        
    $tot count($numeri);
        for(
    $i=0$i<$tot$i++){
            
    $min_max $i;
            for(
    $j=$i+1$j<$tot$j++)
                if(((
    $direzione == 'crescente') && ($numeri[$j] < $numeri[$min_max])) || (($direzione == 'decrescente') && ($numeri[$j] > $numeri[$min_max])))
                    
    $min_max $j;
            if(
    $min_max != $i){
                
    $tmp $numeri[$min_max];
                
    $numeri[$min_max] = $numeri[$i];
                
    $numeri[$i] = $tmp;
            }
            
    $min_max $i;
            
    debug(watch$i$numeri[$min_max], $numeri); // <-
        
    }
        return 
    $numeri;
    }

    debug(writeln'Esempio: Ordinamento di un vettore di numeri'); // <-
    debug(writeln);                                                 // <-

    for($i=0$i<7$i++)
        
    $numeri[] = rand(0,50);
        
    $numeri debug(callordina$numerirand(0,1)?'crescente':'decrescente'); // <-

    print_r($numeri); 
    Questo è un semplice programma che ordina un vettore di numeri in ordine crescente o decrescente. (Ho indicato con le freccette i punti in cui fa debug.)
    Questo è l'output (ret indica il punto in cui la funzione ritorna e contiene gli stessi argomenti della call corrispondente):
    codice:
    Esempio: Ordinamento di un vettore di numeri
    
    call ordina(array(0=>32,1=>34,2=>1,3=>39,4=>23,5=>5,6=>37),"decrescente");
    watch $numeri: Array
    (
        [0] => 32
        [1] => 34
        [2] => 1
        [3] => 39
        [4] => 23
        [5] => 5
        [6] => 37
    )
    watch $i: int(0)
    watch $numeri[$min_max]: int(39)
    watch $numeri: Array
    (
        [0] => 39
        [1] => 34
        [2] => 1
        [3] => 32
        [4] => 23
        [5] => 5
        [6] => 37
    )
    watch $i: int(1)
    watch $numeri[$min_max]: int(37)
    watch $numeri: Array
    (
        [0] => 39
        [1] => 37
        [2] => 1
        [3] => 32
        [4] => 23
        [5] => 5
        [6] => 34
    )
    watch $i: int(2)
    watch $numeri[$min_max]: int(34)
    watch $numeri: Array
    (
        [0] => 39
        [1] => 37
        [2] => 34
        [3] => 32
        [4] => 23
        [5] => 5
        [6] => 1
    )
    watch $i: int(3)
    watch $numeri[$min_max]: int(32)
    watch $numeri: Array
    (
        [0] => 39
        [1] => 37
        [2] => 34
        [3] => 32
        [4] => 23
        [5] => 5
        [6] => 1
    )
    watch $i: int(4)
    watch $numeri[$min_max]: int(23)
    watch $numeri: Array
    (
        [0] => 39
        [1] => 37
        [2] => 34
        [3] => 32
        [4] => 23
        [5] => 5
        [6] => 1
    )
    watch $i: int(5)
    watch $numeri[$min_max]: int(5)
    watch $numeri: Array
    (
        [0] => 39
        [1] => 37
        [2] => 34
        [3] => 32
        [4] => 23
        [5] => 5
        [6] => 1
    )
    watch $i: int(6)
    watch $numeri[$min_max]: int(1)
    watch $numeri: Array
    (
        [0] => 39
        [1] => 37
        [2] => 34
        [3] => 32
        [4] => 23
        [5] => 5
        [6] => 1
    )
    ret ordina(array(0=>32,1=>34,2=>1,3=>39,4=>23,5=>5,6=>37),"decrescente");
    return value: Array
    (
        [0] => 39
        [1] => 37
        [2] => 34
        [3] => 32
        [4] => 23
        [5] => 5
        [6] => 1
    )
    Array
    (
        [0] => 39
        [1] => 37
        [2] => 34
        [3] => 32
        [4] => 23
        [5] => 5
        [6] => 1
    )
    Se imposto DEBUG = false, invece stamperà solo l'ultimo array (quello del print_r).

    Poi, per comodità, ho fatto in modo che se creo una funzione ad esempio
    Codice PHP:
    function call(){
        return 
    debug(__FUNCTION__func_get_args());

    se la chiamo è come se chiamassi debug(call, ecc.), e quindi il codice di prima può diventare:
    Codice PHP:
    function ordina($numeri$direzione 'crescente'){

        
    watch($numeri); // <-
        
    [...] // blabla
            
    watch($i$numeri[$min_max], $numeri); // <-
        
    }
        return 
    $numeri;
    }

    writeln('Esempio: Ordinamento di un vettore di numeri'); // <-
    writeln();                                                 // <-

    for($i=0$i<7$i++)
        
    $numeri[] = rand(0,50);
        
    $numeri call(ordina$numerirand(0,1)?'crescente':'decrescente'); // <-

    print_r($numeri); 
    che fa esattamente la stessa cosa ma che abbrevia la scrittura.

    Suggerimenti?

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    L'idea del breakpoint mi sembra difficile da realizzare in quanto sospende l'esecuzione dello script ma non lo ferma sempre permettendo di visualizzare i valori delle variabili, etc... La vedo dura come funzione php richiamata da un browser.

    Per un altro linguaggio che uso al lavoro avevo pensato ad una serie di funzioni che avrebbero soltanto riempito un file di log solo per essere sicuri che tutte le parti del programma siano state testate. Ad esempio :

    Codice PHP:
    if ($a == 1) {
      
    log("prima di calcola_1()");
      
    calcola_1();
    } else {
      
    log("prima di calcola_2()");
      
    calcola_2();

    Puo' sembrare stupido, ma dopo un certo numero di righe e/o di condizioni non si puo' essere sicuri che tutte le righe del programma siano state testate e questo fa si che alcuni bug possono scattare dopo anni e anni di uso senza alcun problema.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Quote Originariamente inviata da badaze Visualizza il messaggio
    L'idea del breakpoint mi sembra difficile da realizzare in quanto sospende l'esecuzione dello script ma non lo ferma sempre permettendo di visualizzare i valori delle variabili, etc... La vedo dura come funzione php richiamata da un browser.
    Infatti la mia idea di breakpoint era di stoppare lo script e basta, per vedere se "fin lì" funziona Forse un'eventuale "breakpoint" potrebbe semplicemente stampare la riga del file al quale si ferma, ed eventualmente anche il nome di una funzione se si trova al suo interno.
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Per un altro linguaggio che uso al lavoro avevo pensato ad una serie di funzioni che avrebbero soltanto riempito un file di log solo per essere sicuri che tutte le parti del programma siano state testate. Ad esempio :

    Codice PHP:
    if ($a == 1) {
      
    log("prima di calcola_1()");
      
    calcola_1();
    } else {
      
    log("prima di calcola_2()");
      
    calcola_2();

    Puo' sembrare stupido, ma dopo un certo numero di righe e/o di condizioni non si puo' essere sicuri che tutte le righe del programma siano state testate e questo fa si che alcuni bug possono scattare dopo anni e anni di uso senza alcun problema.
    Capisco cosa vuoi dire Potrebbe essere un'idea riconoscere le varie parti di un file e vedere quali sono state toccate dallo script a run-time, il che non è difficilissimo da fare: l'ideale sarebbe aggiungere una chiamata alla funzione di log (come nel tuo esempio) automaticamente (Lo stesso algoritmo potrebbe anche rilevare eventuali modifiche allo script, se ne memorizzasse la struttura , velocizzando il debug.)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.