php.ini<\/em>.<\/p>\n\n\n\n[XDebug] ; Path of XDebug's extension extension=php_xdebug.dll xdebug.remote_enable=On xdebug.remote_host=localhost xdebug.remote_port=17869 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.profiler_enable=1 xdebug.profiler_output_dir=\"j:\\xdebug\\profiling\"<\/pre>\n\n\n\nListing 1. Configurazione di XDebug nel php.ini<\/p>\n\n\n\n
Esempi pratici<\/h3>\n\n\n\n Il primo esempio che andremo a vedere \u00e8 la gestione dell\u2019opzione di visualizzazione degli errori (Listing 2).<\/p>\n\n\n\n
if (!xdebug_is_enabled()) xdebug_enable();\/\/ Abilito la visualizzazione degli errori<\/em> echo \"Visualizzazione errori: <strong>\" . ((xdebug_is_enabled() == 1) ? \"ON\" : \"OFF\") . \"<\/strong>\\n\";<\/pre>\n\n\n\nListing 2. Visualizzazione degli errori\u00a0Andiamo ad analizzare il codice l\u2019istruzione\u00a0xdebug_is_enabled<\/em>\u00a0restituisce un valore (1 o 0) in base allo stato di attivazione della visualizzazione degli errori, le funzioni\u00a0xdebug_enable<\/em>\u00a0e\u00a0xdebug_disable<\/em>\u00a0abilitano e disabilitano la visualizzazione. Il secondo esempio permette la visualizzazione dello stack di memoria relativo alle variabili utilizzare nello script (Listing 3).<\/p>\n\n\n\nclass strings { static function fix_strings($a, $b) { foreach ($b as $item) { } var_dump(xdebug_get_declared_vars()); } } strings::fix_strings(array(1,2,3), array(4,5,6));<\/pre>\n\n\n\nListing 3. Esempio sullo stack di memoria\u00a0La funzione\u00a0xdebug_get_declared_vars<\/em>\u00a0restituisce tutte le variabili utilizzate nello script con alcune informazioni su di esse. Il terzo esempio ci consente di catturare tutte le informazioni riguardo una chiamata a funzione (Listing 4).<\/p>\n\n\n\nfunction esempio($a) { echo \"Chiamata @ \" . xdebug_call_file() . \":\" . xdebug_call_line() . \" da \" . xdebug_call_function(); } $value = esempio(array('XDebug'));<\/pre>\n\n\n\nListing 4. Gestione delle chiamate\u00a0Analizzando il codice vengono utilizzate 3 funzioni native di XDebug:\u00a0xdebug_call_file<\/em>,\u00a0xdebug_call_line<\/em>,\u00a0xdebug_call_function<\/em>, rispettivamente svolgono i seguenti compiti:<\/p>\n\n\n\n\nla prima, restituisce il file da cui si effettua la chiamata;<\/li>\n la seconda, restituisce la linea da cui si effettua la chiamata;<\/li>\n la terza, restituisce la funzione da cui si effettua la chiamata.<\/li>\n<\/ul>\n\n\n\nPossiamo capire meglio il funzionamento attraverso lo studio dell\u2019output prodotto dallo script:<\/p>\n\n\n\n
Chiamata @ \/path\/to\/Apache\/htdocs\/xdebug\/call_methods.php:7 da {main}<\/pre>\n\n\n\nUn caso reale<\/h3>\n\n\n\n Adesso passiamo a qualcosa di pi\u00f9 sostanzioso ed utile, l\u2019utilizzo di XDebug su una classe che gestisce le informazioni di una rubrica. Diamo per scontato di avere la classe rubrica, che consente di aggiungere\/modifica\/eliminare i contatti ed inoltre consente la ricerca di quest\u2019ultimi. Nel Listing 5 possiamo vedere come vengono gestite le informazioni dei contatti:<\/p>\n\n\n\n
\/\/ faccio partire il code-coverage del codice xdebug_start_code_coverage(); \/\/ creo l'istanza della classe require 'class.rubrica.php'; $rub = new rubrica(); \/\/ aggiungo alcuni contatti $rub->addContact(0, \"Mario\", \"Rossi\", \"012345678\", \"9876543210\"); $rub->addContact(1, \"Mattxeo\", \"Bianchi\", \"123456789\", \"8765432109\"); $rub->addContact(2, \"Alfredo\", \"Neri\", \"234567890\", \"7654321098\"); $rub->addContact(3, \"Martina\", \"Rossi\", \"345678901\", \"6543210987\"); \/\/ modifico il contatto n\u00b01 $rub->modContact(1, \"Matteo\", \"Bianchi\", \"123456789\", \"8765432109\"); \/\/ elimino il contatto n\u00b02 $rub->delContact(2); \/\/ cerco tutti quelli che hanno come cognome Bianchi var_dump($rub->search(\"Rossi\", \"cognome\")); var_dump(xdebug_get_code_coverage());<\/pre>\n\n\n\nListing 5. XDebug applicato ad una rubrica\u00a0Il codice da analizzare \u00e8 molto semplice, dopo aver inizializzato la classe\u00a0rubrica<\/em>\u00a0inseriamo al suo interno alcuni contatti, ne modifichiamo il 2\u00b0 poich\u00e9 \u00e8 errato, ed eliminiamo il contatto n\u00b0 3. Dopodich\u00e9 ricerco all\u2019interno tutti quelli che hanno come cognome \u201cRossi\u201d. Attraverso le istruzioni\u00a0xdebug_start_code_coverage<\/em>\u00a0e\u00a0xdebug_get_code_coverage<\/em>, che abbiamo gi\u00e0 visto precedentemente, riesco a capire le istruzioni che sono ripetute pi\u00f9 volte, e cercando di ottimizzarle riduco il tempo di esecuzione dello script. Analizziamo il risultato del profiling del codice con WinCacheGrind (Fig. 1).\u00a0<\/p>\n\n\n\n <\/figure>\n\n\n\n\u00a0Fig.1\u00a0possiamo notare che il software mostra il tempo di esecuzione totale e parziale delle istruzioni, nonch\u00e9 il numero di chiamate ad esse.<\/p>\n\n\n\n
Riassunto<\/h3>\n\n\n\n Il nostro articolo \u00e8 giunto al termine, ma nonostante ci\u00f2 XDebug non si limita soltanto alle funzioni visionate, ma ne ha un set composto da molte istruzioni che spaziano dal trace delle istruzioni eseguite al dumping delle variabile e delle funzioni, passando dalla gestione dello stack al code-coverage.<\/p>\n","protected":false},"excerpt":{"rendered":"
XDebug ci aiuta nel debugging dei nostri script, permettendoci anche di migliorare le prestazioni. Cos\u2019\u00e8 XDebug Xdebug \u00e8 una libreria professionale che consente di effettuare sia il profiling che il debug delle applicazioni web. Questo utilissimo strumento consente ai programmatori di risparmiare molto tempo nel testing del codice alla ricerca di errori; ma non svolge […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","footnotes":""},"categories":[37],"tags":[35,23,11,20,36,38,39],"aioseo_notices":[],"author_meta":{"display_name":"fabio","author_link":"https:\/\/fabiocicerchia.it\/author\/fabio"},"featured_img":null,"coauthors":[],"tax_additional":{"categories":{"linked":["Programming<\/a>"],"unlinked":["Programming<\/span>"]},"tags":{"linked":["benchmark<\/a>"," debug<\/a>"," italian<\/a>"," php<\/a>"," profiling<\/a>"," tutorial<\/a>"," xdebug<\/a>"],"unlinked":["benchmark<\/span>","debug<\/span>","italian<\/span>","php<\/span>","profiling<\/span>","tutorial<\/span>","xdebug<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 16 years ago","modified":"Updated 16 years ago"},"absolute_dates":{"created":"Posted on September 8, 2008","modified":"Updated on September 8, 2008"},"absolute_dates_time":{"created":"Posted on September 8, 2008 5:55 pm","modified":"Updated on September 8, 2008 5:55 pm"},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/fabiocicerchia.it\/wp-json\/wp\/v2\/posts\/462"}],"collection":[{"href":"https:\/\/fabiocicerchia.it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabiocicerchia.it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabiocicerchia.it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabiocicerchia.it\/wp-json\/wp\/v2\/comments?post=462"}],"version-history":[{"count":0,"href":"https:\/\/fabiocicerchia.it\/wp-json\/wp\/v2\/posts\/462\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabiocicerchia.it\/wp-json\/wp\/v2\/media?parent=462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabiocicerchia.it\/wp-json\/wp\/v2\/categories?post=462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabiocicerchia.it\/wp-json\/wp\/v2\/tags?post=462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}