Προφίλ και εντοπισμός σφαλμάτων εφαρμογών PHP χρησιμοποιώντας xhprof & FirePHP. Δημιουργία προφίλ εφαρμογών PHP με PhpStorm και Xdebug Profiling php

10.08.2022

Προφίλ κώδικα PHP

Αργά ή γρήγορα, ο καθένας από εμάς αντιμετωπίζει τον κώδικα παλαιού τύπου και τη βελτιστοποίησή του. Σε μια τέτοια κατάσταση, ένας εντοπιστής σφαλμάτων και ένας προγραμματιστής είναι οι καλύτεροι βοηθοί του προγραμματιστή. Όσοι εργάζονται με PHP, χάρη στον Derick Rethans, έχουν καλό εργαλείο- xDebug. Υπάρχουν πολλές πληροφορίες σχετικά με το xDebug ακόμη και στο RuNet, επομένως αυτό το άρθρο δεν θα αφορά αυτό.

Όταν έπεσα πάνω σε μια αναφορά για ένα προφίλ για PHP, σκέφτηκα αμέσως το xDebug (είχα ξεχάσει εδώ και πολύ καιρό τα ιδιόκτητα εργαλεία από το Zend), αλλά αυτή τη φορά έκανα λάθος - θα μιλήσουμε για το XHProf.
XHProf

Αυτό το profiler αναπτύχθηκε ειδικά για το Facebook και πηγήάνοιξε τον Μάρτιο του 2009.

Η εγκατάσταση έγινε αρκετά γρήγορα και ομαλά.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/extension/
phpize
./διαμόρφωση && πραγματοποίηση && εγκατάσταση
cd /usr/local/etc/php.d/
vim xhprof.ini
cd /usr/local/
vim header.php
vimfooter.php
vim etc/php.ini
/etc/init.d/php-fpm επανεκκίνηση
cp vhost.conf.template prof.my.conf
sed -i s/site/prof/ prof.my.conf
vim prof.my.conf
/etc/init.d/nginx επανεκκίνηση

Ας αναλύσουμε τις αναφερόμενες ρυθμίσεις

Xhprof.ini
extension=/usr/local/lib/php/extensions/no-debug-non-zts-20090626/xhprof.so
xhprof.output_dir="/home/max/www/profile/"

Prof.my.conf - Nginx config - το πιο τυπικό.

Διακομιστής (
ακούστε 80?
server_name prof.my;
σύνολο χαρακτήρων utf8;

Root /usr/local/src/xhprof-0.9.2/xhprof_html ;
τοποθεσία/(
ευρετήριο index.php;
}

Τοποθεσία ~ \.php$ (
fastcgi_pass 127.0.0.1:12000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/src/xhprof-0.9.2/xhprof_html/$fastcgi_script_name;
περιλαμβάνουν fastcgi_params?

Στο /usr/local/src/xhprof-0.9.2/xhprof_html υπάρχουν πηγές PHP που δημιουργούν ένα καλό WEBGUI για τον προγραμματιστή.

Λοιπόν για τα δύο κύρια αρχεία:

Header.php


include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php";
include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_runs.php";
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
}

Footer.php
if(isset($_COOKIE["xhprof"]))(
if (extension_loaded ("xhprof")) (
$profiler_namespace = "myapp"; // namespace για την εφαρμογή σας
$xhprof_data = xhprof_disable();
$xhprof_runs = νέο XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);

// url στις βιβλιοθήκες διεπαφής χρήστη XHProf (αλλάξτε το όνομα και τη διαδρομή του κεντρικού υπολογιστή)
$profiler_url = sprintf("http://prof.my/index.php?run=%s&source=%s", $run_id, $profiler_namespace);
ηχώ<<Έξοδος προφίλ
ΕΞΩ;
}
}

Τώρα εκτελούμε οποιοδήποτε σενάριο PHP μέσω του ιστού και βλέπουμε στην επάνω αριστερή γωνία έναν σύνδεσμο προς την έξοδο του profiler - για αυτό ακριβώς δημιουργήθηκε ο κεντρικός υπολογιστής prof.my

Παρακαλώ σημειώστε - χρησιμοποιώ τον έλεγχο COOKIE! Με έναν τέτοιο έλεγχο, μπορείτε να χρησιμοποιήσετε με ασφάλεια το προφίλ σε έναν διακομιστή παραγωγής - σε πραγματικά δεδομένα και πραγματικό φορτίο.

Η διεπαφή ιστού του profiler εμφανίζει πινακίδες με πληροφορίες για κάθε λειτουργία και αναφέρει τις ακόλουθες πληροφορίες:

  • Αριθμός κλήσεων σε κάθε λειτουργία
  • Χρόνος τοίχου, χρόνος εκτέλεσης λειτουργιών (συμπεριλαμβανομένης της αναμονής για απαντήσεις από πρίζες, σύστημα αρχείων κ.λπ.).
  • Χρόνος CPU, χρόνος εκτέλεσης λειτουργιών (εξαιρουμένης της αναμονής για απαντήσεις από πρίζες, σύστημα αρχείων κ.λπ.).
  • Χρήση μνήμης
  • Μέγιστη χρήση μνήμης

Είναι δυνατή η ταξινόμηση του πίνακα με οποιαδήποτε από τις παραμέτρους

Οι πληροφορίες για κάθε λειτουργία χωρίζονται σε δύο ακόμη τύπους: Συμπεριλαμβανομένης και Αποκλειστικής. Το Inclusive περιλαμβάνει τα ψηφία που χρησιμοποιούνται από τις παιδικές κλήσεις, ενώ το Exclusive δεν τα περιλαμβάνει. Είναι επίσης δυνατό να κάνετε κλικ στο όνομα μιας συνάρτησης για να δείτε πληροφορίες μόνο για αυτήν και τις συναρτήσεις από τις οποίες κλήθηκε και που κλήθηκαν από αυτήν.

Εάν το GraphViz είναι εγκατεστημένο στο σύστημα, ο προγραμματιστής θα σχεδιάσει ένα γράφημα κλήσης για εσάς.

ΥΣΤΕΡΟΓΡΑΦΟ. Χωρίς να παραβιάζω τις παραδόσεις: αυτή είναι η πρώτη μου ανάρτηση στο Habré.

UPD: αναδημοσιεύτηκε σε PHP.

Έδειχνε πώς να εγκαταστήσετε και να ρυθμίσετε το xdebug και κάλυπτε ορισμένες βασικές δυνατότητες, όπως τη βελτίωση της εξόδου της συνάρτησης var_dump() ή την εκτύπωση ενός ίχνους στοίβας κλήσεων όταν λαμβάνετε ένα μήνυμα σφάλματος. Στο δεύτερο μέρος εξετάσαμε αυτό το χαρακτηριστικό xdebug ως ανίχνευση. Το ίχνος περιέχει όλες τις κλήσεις σε λειτουργίες και μεθόδους στο πρόγραμμα, χρόνο εκκίνησης, προαιρετικά μέγεθος μνήμης, παραμέτρους που έχουν περάσει και επιστρέφονται. Ένα αρχείο καταγραφής ανίχνευσης μπορεί να σας βοηθήσει να κατανοήσετε τη διαδρομή εκτέλεσης ενός πολύπλοκου προγράμματος. Αντί να εισάγετε κώδικα εντοπισμού σφαλμάτων μέσα στο πρόγραμμα, ενεργοποιείτε ή απενεργοποιείτε την ανίχνευση όπου χρειάζεται και, στη συνέχεια, χρησιμοποιείτε βοηθητικά προγράμματα όπως το grep ή τις δικές σας εφαρμογές PHP για να αναλύσετε το αρχείο καταγραφής.

Σε αυτό το άρθρο θα εξετάσουμε το προφίλ. Με την πρώτη ματιά, το προφίλ είναι παρόμοιο με τον εντοπισμό. Το αρχείο καταγραφής προφίλ δεν προορίζεται για ανθρώπους, δεν προορίζεται για την οπτικοποίηση της ροής ενός προγράμματος, αλλά μας παρέχει δεδομένα για στατιστική ανάλυση ενός προγράμματος που εκτελείται.

Δημιουργία αρχείου καταγραφής προφίλ

Παρακάτω είναι ένα σύντομο απόσπασμα από το αρχείο καταγραφής προφίλ που δημιουργήθηκε από το xdebug:

fl=php:internal
fn=php::define
106 3

Fl=C:\www\drupal\includes\bootstrap.inc
fn=require_once::C:\www\drupal\includes\bootstrap.inc
1 648
cfn=php::define
κλήσεις=1 0 0
13 6
cfn=php::define
κλήσεις=1 0 0
18 4
cfn=php::define
κλήσεις=1 0 0
23 2


Όπως μπορείτε να δείτε, το αρχείο καταγραφής προφίλ δεν μπορεί να διαβαστεί απευθείας. Θα χρησιμοποιήσουμε πρόσθετα εργαλεία για να οπτικοποιήσουμε και να αναλύσουμε τα δεδομένα που λαμβάνονται. Έτσι, η δημιουργία προφίλ δείχνει πόσες φορές ξεκίνησε μια συγκεκριμένη γραμμή και πόσο χρόνο χρειάστηκε η εκτόξευση.
Η δημιουργία ενός αρχείου καταγραφής προφίλ υποβαθμίζει σημαντικά την απόδοση, παρόμοια με τη δημιουργία ενός αρχείου καταγραφής ίχνους, επειδή είναι απαραίτητο να περιγραφεί το πέρασμα κάθε γραμμής. Επομένως, όπως και στην περίπτωση της ανίχνευσης, μην εκτελείτε το προφίλ σε διακομιστές παραγωγής... Ωστόσο, υπάρχουν περιπτώσεις που το προφίλ πρέπει να εκτελεστεί σε ζωντανό σύστημα. Σε αυτήν την περίπτωση, να είστε προσεκτικοί σχετικά με την εκτέλεση του xdebug ταυτόχρονα με άλλες επεκτάσεις Zend, όπως φορτωτές, βελτιστοποιητές ή κρυφές μνήμες.
Για να ξεκινήσει το xdebug να καταγράφει αρχεία καταγραφής προφίλ, προσθέστε

Λάβετε υπόψη ότι δεν μπορείτε να εκτελέσετε το προφίλ κατά την εκκίνηση εκτελώντας μια εντολή.
Δεδομένου ότι το αρχείο καταγραφής προφίλ προορίζεται για ανάγνωση από προγράμματα αναλυτών, δεν υπάρχουν πρόσθετες ρυθμίσεις που να σας επιτρέπουν να εμφανίζετε πρόσθετες πληροφορίες, όπως συμβαίνει με το αρχείο καταγραφής ιχνών. Ωστόσο, υπάρχουν ορισμένες ρυθμίσεις που σας επιτρέπουν να διαμορφώσετε το προφίλ, παρόμοιες με αυτές που χρησιμοποιήσαμε κατά τη ρύθμιση της ανίχνευσης.
Πρώτον, το xdebug γράφει το αρχείο καταγραφής προφίλ στον κατάλογο /tmp από προεπιλογή. Εάν χρησιμοποιείτε Windows, πρέπει να διορθώσετε το php.ini, ως εξής:
xdebug.profiler_output_dir="c:\traces"

Από προεπιλογή, το xdebug αντικαθιστά το υπάρχον αρχείο καταγραφής προφίλ. Μπορείτε να το ρυθμίσετε ώστε να συμπληρώνει το υπάρχον προσθέτοντας την ακόλουθη εντολή

στο php.ini. Υπάρχουν περιπτώσεις που δεν θέλετε να δημιουργήσετε ένα αρχείο καταγραφής προφίλ για όλα τα αρχεία, αλλά ταυτόχρονα η ενεργοποίηση του προφίλ κατά τη διάρκεια εκτέλεσης είναι προβληματική. Αντί να ενεργοποιείτε και να απενεργοποιείτε περιοδικά το προφίλ, προσθέστε την εντολή
xdebug.profiler_enable_trigger=Ενεργό

στο php.ini. Τώρα μπορείτε να ενεργοποιήσετε και να απενεργοποιήσετε τη δημιουργία προφίλ μεταβιβάζοντας μια ειδική παράμετρο GET ή POST XDEBUG_PROFILE σε ένα σενάριο PHP. Αυτό θα επιτρέψει τη δημιουργία προφίλ μόνο για αυτό το σενάριο PHP. Δεν είναι απαραίτητο να ορίσετε την τιμή αυτής της παραμέτρου, απλώς θυμηθείτε να προσθέσετε αυτήν την παράμετρο στη διεύθυνση test.php?XDEBUG_PROFILE.

Όνομα αρχείου καταγραφής προφίλ

Το όνομα που εκχωρεί το xdebug στο αρχείο καταγραφής προφίλ από προεπιλογή είναι "cachegrind.out". συν αναγνωριστικό διαδικασίας. Όπως και στην περίπτωση του αρχείου καταγραφής ίχνους, μπορείτε να αλλάξετε τα ονόματα του αρχείου καταγραφής προσθέτοντας τις κατάλληλες ρυθμίσεις στο php.ini. Όνομα παραμέτρου xdebug.profiler_output_name. Το όρισμα είναι μια συμβολοσειρά. που μπορεί να περιέχει διάφορους τροποποιητές. Τα πιο σημαντικά είναι τα παρακάτω:

  • %p – αναγνωριστικό διεργασίας
  • %r – τυχαίος αριθμός
  • %u - χρόνος
  • %H – τιμή $_SERVER["HTTP_HOST"]
  • %R – τιμή $_SERVER["REQUEST_URI"]
  • %s – όνομα συμπεριλαμβανομένης της πλήρους διαδρομής, οι κάθετες μετατρέπονται σε κάτω παύλες
Λάβετε υπόψη ότι ο τροποποιητής %s χρησιμοποιείται μόνο για το xdebug.profiler_output_name. Εάν θέλετε να μάθετε το όνομα του αρχείου καταγραφής προφίλ, μπορείτε να καλέσετε τη συνάρτηση xdebug_get_profiler_filename().

Ανάλυση ημερολογίου προφίλ
Όπως αναφέρθηκε παραπάνω, για την ανάλυση του αρχείου καταγραφής προφίλ, απαιτούνται πρόσθετα προγράμματα για οπτικοποίηση δεδομένων. Όλα τα αρχεία καταγραφής προφίλ που δημιουργεί το xdebug είναι σε μορφή παρόμοια με τη μορφή Cachegrind. Το Cachegrind είναι ένας προγραμματιστής προφίλ που αποτελεί μέρος ενός πιο ισχυρού προγράμματος που ονομάζεται Valgrind, ενός προγράμματος εντοπισμού σφαλμάτων και προφίλ λογισμικού για Linux. Το Cachegrind σχεδιάστηκε για να αναλύει στατιστικά στοιχεία κρυφής μνήμης, χρήση μνήμης και εντολές προγράμματος. Ένα άλλο εργαλείο Valgrind, το Callgrind, σχεδιάζει γραφήματα κλήσεων. Όσον αφορά την PHP, μπορούμε να χρησιμοποιήσουμε αυτήν την εφαρμογή για να οπτικοποιήσουμε και να αναλύσουμε το αρχείο καταγραφής προφίλ.
Το εργαλείο που χρησιμοποιείται συνήθως για την ανάλυση του αρχείου καταγραφής προφίλ που δημιουργείται από το xdebug ονομάζεται . Το KCachegrind είναι ελεύθερο λογισμικό με άδεια χρήσης σύμφωνα με την GPL (λειτουργεί μόνο σε συστήματα Unix). Ωστόσο, υπάρχει ένα απλό πρόγραμμα για Windows, το οποίο είναι επίσης δωρεάν. Ας δούμε πρώτα την έκδοση των Windows.

WinCacheGrind: ανάλυση των αρχείων καταγραφής προφίλ στα Windows

Η τρέχουσα έκδοση (τη στιγμή που γράφτηκε από τον συγγραφέα αυτού του άρθρου) του WinCachegrind είναι η 1.0.0.12. Αυτή η έκδοση χρονολογείται από το 2005, πράγμα που σημαίνει ότι το WinCachegrind δεν έχει αναπτυχθεί εδώ και πολύ καιρό. Αν κοιτάξετε τις σημειώσεις έκδοσης, οι συγγραφείς γράφουν ότι το πρόγραμμα έχει σφάλματα που μερικές φορές το κάνουν να συμπεριφέρεται περίεργα.
Ως εκ τούτου, συνιστώ τη χρήση του KCachegrind, που ξεκίνησε με βάση μια εικονική μηχανή στην πιο πρόσφατη διανομή Linux, για παράδειγμα το Ubuntu (σημείωση του μεταφραστή, γενικά μιλώντας, μια περίεργη σύσταση· σε αυτήν την περίπτωση, θα συνιστούσα απλώς να εγκαταστήσετε το Linux και όχι να περιφράξετε ο κήπος των εικονικών μηχανών). Υπάρχει ένας τεράστιος αριθμός εικονικών μηχανών που διατίθενται στα Windows. Εάν δεν είναι δυνατή η χρήση Unix ή εικονικής μηχανής για κάποιο λόγο, μπορείτε να συνεχίσετε να χρησιμοποιείτε το WinCachegrind για απλή ανάλυση προφίλ καταγραφής. Το WinCachegrind δεν σχεδιάζει γραφήματα κλήσεων, σε αντίθεση με το KCachegrind.
Η εγκατάσταση του Wincachegrind είναι εξαιρετικά εύκολη. Εκτελέστε το πρόγραμμα εγκατάστασης, κάντε κλικ στο κουμπί για να αποδεχτείτε την άδεια και η εγκατάσταση ολοκληρώθηκε. Τώρα μπορείτε να εκτελέσετε το πρόγραμμα και να ανοίξετε ένα από τα αρχεία καταγραφής προφίλ cachegrind που δημιουργήθηκε από το xdebug.

Κάνοντας κλικ στο ρολόι ή στο εικονίδιο σίγμα, μπορείτε να κάνετε εναλλαγή μεταξύ εμφάνισης πληροφοριών σε απόλυτες τιμές και ποσοστά. Η ένδειξη ποσοστού δείχνει πόσος χρόνος, ως ποσοστό του συνολικού χρόνου, χρειάζεται για να καλέσετε μια συνάρτηση σε ένα δεδομένο μπλοκ.
Δύο χρήσιμες ρυθμίσεις είναι το Profiler -> Hide Fast Functions και το Profiler -> Hide Library Functions. Ο πρώτος διακόπτης κρύβει συναρτήσεις των οποίων η συμβολή χρόνου στο συνολικό χρόνο εκτέλεσης του προγράμματος είναι ασήμαντη.
Η δεύτερη ρύθμιση, Profiler -> Hide Library Functions, αποκρύπτει λειτουργίες που είναι ενσωματωμένες στην PHP από τη γενική ανάλυση. Όταν και οι δύο αυτές ρυθμίσεις είναι ενεργοποιημένες, βλέπετε λιγότερα δεδομένα, επιτρέποντάς σας να εστιάσετε σε περιοχές του κώδικά σας που χρειάζονται βελτιστοποίηση.
Το κύριο παράθυρο περιέχει δύο καρτέλες: Γραμμή προς γραμμή και Συνολικά. Και οι δύο καρτέλες εμφανίζουν τις ίδιες πληροφορίες, αλλά η καρτέλα Συνολικά συγκεντρώνει τις πληροφορίες για καλύτερη παρουσίαση. Self time εμφανίζει το χρόνο εκτέλεσης του κώδικα στο τρέχον μπλοκ, ενώ ο αθροιστικός χρόνος (Cum.) δείχνει τον συνολικό χρόνο εκτέλεσης των συναρτήσεων στο συγκεκριμένο μπλοκ.

KCacheGrind: ανάλυση των αρχείων καταγραφής προφίλ στο Unix

Η έκδοση Unix του KCachegrind παρέχει περισσότερη λειτουργικότητα από το WinCachegrind. Το KCachegrind οπτικοποιεί τα δεδομένα και δημιουργεί ένα γράφημα κλήσης.
Για να ξεκινήσετε να το χρησιμοποιείτε, πρέπει να εγκαταστήσετε το KCachegrind. Τρέχουσα έκδοση . Μια νεότερη έκδοση (0.10.1) είναι διαθέσιμη, αλλά αποτελεί μέρος του πακέτου Valgrind.
Εάν είναι δυνατόν, χρησιμοποιήστε έναν διαχειριστή πακέτων για να εγκαταστήσετε το πακέτο KCachegrind. Το KCachegrind χρησιμοποιεί το GraphViz για να σχεδιάσει γραφήματα κλήσεων, επομένως πρέπει επίσης να εγκαταστήσετε το πακέτο GraphViz εάν ο διαχειριστής πακέτων δεν εγκαθιστά αυτόματα εξαρτημένα πακέτα.
Εάν δεν βρείτε το δυαδικό πακέτο KCachegrind, θα χρειαστεί να μεταγλωττίσετε μόνοι σας το KCachegrind. Αφού κάνετε λήψη των πηγών, εκτελέστε

./configure --prefix=/opt/kde3
φτιαχνω, κανω
κάντε εγκατάσταση

Όπως μπορείτε να σημειώσετε, πρέπει να καθορίσετε τη διαδρομή προς την τρέχουσα εγκατάσταση της βιβλιοθήκης του KDE. Εάν δεν γνωρίζετε πού βρίσκονται οι βιβλιοθήκες του KDE στο σύστημά σας, χρησιμοποιήστε το

για να εμφανίσετε τη διαδρομή προς τις βιβλιοθήκες του KDE.
Μόλις εγκατασταθεί, μπορείτε να εκτελέσετε το KCacheGrind από τη γραμμή εντολών

Η εμφάνιση σε πίνακα των δεδομένων στο KCachegrind είναι πολύ παρόμοια με το WinCachegrind. Μπορείτε επίσης να κάνετε εναλλαγή μεταξύ απόλυτων και ποσοστιαίων τιμών. Ορισμένες δυνατότητες του KCachegrind δεν έχουν σχεδιαστεί για PHP. Η παρακάτω εικόνα δείχνει το γράφημα κλήσης του προγράμματος phpMyAdmin:


Όπως μπορείτε να δείτε, το μεγαλύτερο μέρος του χρόνου εκκίνησης ξοδεύτηκε στο common.inc.php. Το ακόλουθο στιγμιότυπο οθόνης δείχνει μια απεικόνιση των κλήσεων συναρτήσεων μέσα στο common.inc.php:

Αυτό το μπλοκ κώδικα εκτελεί δύο require_onces, που είναι ο μισός χρόνος που χρειάζεται για να τρέξει το common.inc.php. Κάνοντας διπλό κλικ σε οποιοδήποτε ορθογώνιο θα μεταφερθείτε βαθύτερα στην ανάλυση δεδομένων.

Βελτιστοποίηση κώδικα με βάση δεδομένα προφίλ

Πάντα να δημιουργείτε προφίλ στις εφαρμογές σας πριν από τη βελτιστοποίηση. Μπορείτε να ξεκινήσετε τη βελτιστοποίηση μόνοι σας, εκεί που σας φαίνεται ότι αυτή η βελτιστοποίηση θα έχει αποτέλεσμα, αλλά αυτό δεν ισχύει πάντα. Η βελτιστοποίηση έχει κυρίως αποτέλεσμα μόνο σε εκείνα τα μέρη που χρειάζονται περισσότερο χρόνο στη διαδικασία εκτέλεσης.
Εάν εκτελείτε πολλά αντίγραφα ενός προγράμματος ταυτόχρονα, ίσως χρειαστεί να βελτιστοποιήσετε το τμήμα του προγράμματός σας που καταλαμβάνει το μεγαλύτερο μέρος του χρόνου εκτέλεσης. Σε αυτήν την περίπτωση, η βελτιστοποίηση δεν θα κάνει την εξυπηρέτηση ενός μεμονωμένου αιτήματος πιο γρήγορη, αλλά θα επιτρέψει στον διακομιστή σας να χειρίζεται υψηλά φορτία ενώ καταναλώνει λιγότερους πόρους για την εξυπηρέτηση αυτών των αιτημάτων.
Όταν εξετάζετε τις διάρκειες εκτέλεσης του προγράμματος προφίλ, έχετε κατά νου ότι οι απόλυτες τιμές είναι λιγότερο σημαντικές από τις σχετικές τιμές. Μετρημένες σε διαφορετικά συστήματα, οι απόλυτες τιμές μπορεί να διαφέρουν. Ωστόσο, προτού ξεκινήσετε τη βελτιστοποίηση του κώδικά σας, λάβετε υπόψη τα ακόλουθα πράγματα.
Ένας σημαντικός κανόνας στη βελτιστοποίηση είναι η μείωση του αριθμού των λειτουργιών I/O. Ορισμένες λειτουργίες εισόδου/εξόδου είναι πολύ χρονοβόρες σε σύγκριση με τους υπολογισμούς. Η μείωση τέτοιων λειτουργιών μπορεί να είναι ένας πολύ αποτελεσματικός τρόπος για να επιταχύνετε το πρόγραμμά σας. Η κατάργηση μιας κλήσης I/O μπορεί να προσφέρει μια πιο αποτελεσματική βελτίωση από το να ξοδεύετε πολλές ώρες για τη βελτιστοποίηση του κώδικα. Επομένως, θα πρέπει πρώτα να εστιάσετε στις λειτουργίες I/O πριν ξεκινήσετε την κωδικοποίηση.
Μπορείτε επίσης να αυξήσετε τον αριθμό των διακομιστών σας πριν από τη βελτιστοποίηση. Μπορείτε να αγοράσετε ένα τεράστιο, το οποίο θα σας δώσει μια μικρή αύξηση στην παραγωγικότητα. Ο χρόνος ανάπτυξης είναι πιο ακριβός από την τιμή ενός νέου διακομιστή. Και αν αυξήσετε την ποσότητα του υλικού, μπορείτε να είστε σίγουροι ότι θα λάβετε την αύξηση αμέσως χωρίς καμία επίδραση στον κώδικα PHP. Όταν ένας προγραμματιστής ξοδεύει μία ή δύο ημέρες βελτιστοποιώντας τον κώδικα, δεν μπορείτε ποτέ να πείτε πόσο θα αυξηθεί η παραγωγικότητα. Και στο τέλος, δεν μπορείτε πλέον να είστε σίγουροι ότι η βελτιστοποίηση δεν θα επιφέρει σφάλματα.
Η μετατροπή ορισμένων σελίδων σε στατικές σελίδες είναι ένας τρόπος για να επιτύχετε καλύτερη απόδοση. Ας υποθέσουμε ότι υπάρχει ένας ιστότοπος με πολλή επισκεψιμότητα, όπου ένα σενάριο PHP δημιουργεί την πρώτη σελίδα για κάθε αίτημα, επιλέγοντας πληροφορίες από μια βάση δεδομένων ή ένα αρχείο XML. Εάν τα δεδομένα σε μια σελίδα αλλάζουν αρκετά συχνά, μπορείτε να δημιουργήσετε ξανά ένα στατικό αντίγραφό της. Εάν η μετατροπή σε στατική προβολή δεν είναι δυνατή για μια σελίδα (κάποια προσωπικά στοιχεία εμφανίζονται στη σελίδα), μπορείτε να μετατρέψετε ορισμένα μπλοκ σε στατική προβολή.
Ένα άλλο επίπεδο βελτιστοποίησης δεν απαιτεί αλλαγή του κώδικα PHP. Όπως γνωρίζουμε η PHP είναι μια διερμηνευμένη γλώσσα. Αυτό σημαίνει ότι οι εντολές του μεταφράζονται κατά το χρόνο εκτέλεσης σε ενδιάμεσο κώδικα. Η μετάδοση επαναλαμβάνεται κάθε φορά που εκτελείται το σενάριο. Αυτό κάνει την PHP πιο αργή σε σύγκριση με γλώσσες όπως η C ή η Java, οι οποίες δεν απαιτούν ανάλυση του κώδικα κάθε φορά που τον εκτελείτε. Για την PHP, μπορείτε να χρησιμοποιήσετε κρυφές μνήμες ενδιάμεσης αναπαράστασης (δείτε τη μετάφρασή μου...) για να αποθηκεύσετε και να επαναχρησιμοποιήσετε τον ενδιάμεσο κώδικα, γεγονός που καθιστά την εκκίνηση και την εκτέλεση ταχύτερη.
Όλα αυτά δεν σημαίνουν ότι δεν είναι η ώρα ή το μέρος για τη βελτιστοποίηση του κώδικα PHP. Ορισμένες βελτιστοποιήσεις κώδικα μπορούν να βελτιώσουν σημαντικά την απόδοση. Ωστόσο, να θυμάστε πάντα ότι η αλλαγή κώδικα ενέχει πάντα τον κίνδυνο εισαγωγής πρόσθετων σφαλμάτων και ζητημάτων ασφαλείας. Θυμηθείτε επίσης ότι η βελτιστοποίηση του κώδικά σας τον κάνει λιγότερο ευανάγνωστο.

συμπέρασμα

Η δημιουργία και η οπτικοποίηση ενός αρχείου καταγραφής προφίλ είναι μία από τις σημαντικές προϋποθέσεις για τη βελτιστοποίηση του κώδικα PHP. Πρέπει να γνωρίζετε ποια μέρη στο πρόγραμμα χρειάζονται περισσότερο χρόνο και από εκεί θα πρέπει να ξεκινήσετε τη βελτιστοποίηση.
Στο επόμενο άρθρο θα δούμε τον εντοπισμό σφαλμάτων χρησιμοποιώντας το xdebug. Το xdebug μπορεί να σας προσφέρει τη δυνατότητα να κάνετε απομακρυσμένο εντοπισμό σφαλμάτων. Χρησιμοποιώντας έναν υπολογιστή-πελάτη που έχει αυτή τη δυνατότητα, όπως το Eclipse PDT, μπορείτε να διορθώσετε τον κώδικά σας χωρίς να τον αλλάξετε, να ορίσετε σημεία διακοπής, να μεταβείτε σε ενότητες κώδικα και να δείτε πώς και πού αλλάζουν τιμές οι μεταβλητές.

Το προφίλ εφαρμογής είναι η συλλογή δεδομένων σχετικά με την ταχύτητα εκτέλεσης διαφόρων ενοτήτων προγράμματος (αρχεία και συναρτήσεις). Υπάρχουν πολλά διαθέσιμα εργαλεία διαμόρφωσης προφίλ PHP, αλλά δεν είναι όλα τα εργαλεία κατάλληλα για την εκτέλεση ανάλυσης απευθείας στην παραγωγή.

XHProf- ένα πολύ απλό πρόγραμμα προφίλ που συλλέγει στατιστικά άμεσα ενώ η εφαρμογή εκτελείται χωρίς σχεδόν κανένα κόστος.

Γιατί προφίλ;

Εάν μια εφαρμογή αρχίσει να εκτελείται αργά, η δημιουργία προφίλ μπορεί να σας βοηθήσει να μάθετε ποιο τμήμα είναι αργό. Το αποτέλεσμα της δημιουργίας προφίλ είναι συνήθως μια λίστα εκτελεσμένων συναρτήσεων και ο χρόνος εκτέλεσής τους.

Το προφίλ πρέπει να γίνεται πριν από οποιαδήποτε βελτιστοποίηση εφαρμογής. Διαφορετικά, θα καθοδηγηθείτε από εικασίες. Πιθανότατα λάθος.

Πρόβλημα Xdebug

Το Xdebug είναι μια ισχυρή λύση για την PHP. Αλλά η ίδια η πλατφόρμα Xdebug είναι τόσο βαριά που δεν μπορεί να χρησιμοποιηθεί σε ζωντανούς ιστότοπους. Το XDebug δημιουργεί σημαντικό φόρτο στους πόρους του διακομιστή και επιβραδύνει την εφαρμογή.

Από την άλλη πλευρά, τα προβλήματα σε μια ζωντανή τοποθεσία μπορεί να είναι εντελώς διαφορετικά από εκείνα σε ένα περιβάλλον ανάπτυξης. Η δημιουργία προφίλ μόνο σε υπολογιστές προγραμματιστών θα εμφανίσει μόνο ένα μέρος των προβλημάτων.

Γι' αυτό αναπτύχθηκε η λύση XHprof. Προορίζεται για χρήση σε εφαρμογές που εκτελούνται. Η κύρια ιδέα αυτού του προγράμματος προφίλ είναι να δημιουργήσει ένα ελάχιστο φορτίο στην εφαρμογή συλλέγοντας ταυτόχρονα όλα τα απαραίτητα δεδομένα για την ταχύτητα λειτουργίας. Η λύση αναπτύχθηκε από τα παιδιά από το Facebook και υποστηρίζεται από νέες εκδόσεις της PHP.

XHProf

Εγκατάσταση

Στο Debian, το XHprof είναι σε πακέτα sid, οπότε: apt-get εγκαταστήστε το xhprof

Μπορείτε επίσης να φτιάξετε μόνοι σας το XHprof.

Ενεργοποίηση προφίλ

Ας υποθέσουμε ότι έχουμε ένα σενάριο με τον ακόλουθο κώδικα:

εκτέλεση();

Ας πραγματοποιήσουμε τη δημιουργία προφίλ χρησιμοποιώντας το XHprof. Για να το κάνετε αυτό σε αυτή τη σελίδα χρειάζεστε:

  1. Ενεργοποιήστε το profiler από την αρχή.
  2. Στο τέλος του προγράμματος, σταματήστε το προφίλ και αποθηκεύστε τα ληφθέντα δεδομένα.

Θα μοιάζει με αυτό:

# Αρχικοποιήστε το προφίλxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); # Εκτελέστε το πρόγραμμα αφού ενεργοποιήσετε το προφίλεκτέλεση(); # Διακόψτε το προφίλ μετά την εκτέλεση του προγράμματος$xhprof_data = xhprof_disable();

# Αποθηκεύστε το αποτέλεσμα δημιουργίας προφίλ στη μεταβλητή $xhprof_data

  • Λειτουργία xhprof_enable()παίρνει σημαίες ως επιχειρήματα. XHPROF_FLAGS_CPU για καταγραφή στατιστικών στοιχείων επεξεργαστή, XHPROF_FLAGS_MEMORY για μνήμη, XHPROF_FLAGS_NO_BUILTINS για παράβλεψη ενσωματωμένων λειτουργιών.
  • xhprof_disable()θα απενεργοποιήσει το προφίλ και θα επιστρέψει τα συλλεγμένα στατιστικά στοιχεία.

Αναφορές

Γενιά

Τα δεδομένα που συλλέγονται μπορούν να αναλυθούν στη διεπαφή XHprof για τη δημιουργία αναφορών. Για να το κάνετε αυτό, πρέπει να κάνετε λήψη των πηγών XHprof: cd /var/www; wget http://pecl.php.net/get/xhprof-0.9.4.tgz gzip -d xhprof-0.9.4.tgz tar -xvf xhprof-0.9.4.tar

Μετά από αυτό, πρέπει να κάνετε αλλαγές στο σενάριο:

include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = νέο XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "test");

# Ο νέος κώδικας αποθηκεύει την αναφορά για χρήση στο GUI

Διεπαφή για αναφορές

Για να δείτε την αναφορά, πρέπει να διαμορφώσετε τον εικονικό κεντρικό υπολογιστή στο φάκελο /var/www/xhprof-0.9.4/xhprof_html. Για παράδειγμα, στο Nginx:

Διακομιστής ( όνομα_διακομιστή xh..9.4/xhprof_html; ευρετήριο. -s reload

Μετά από αυτό, θα εμφανιστεί μια λίστα με αναφορές:

Ο πίνακας περιέχει μια λίστα λειτουργιών που εκτελέστηκαν σε μία σελίδα με πρόσθετες πληροφορίες:

  • Κλήσεις — αριθμός και ποσοστό κλήσεων λειτουργίας.
  • Συμπ. Wall Time — χρόνος εκτέλεσης μιας συνάρτησης με ένθετες συναρτήσεις.
  • Εξαιρ. Wall Time είναι ο χρόνος εκτέλεσης μιας συνάρτησης χωρίς ένθετες συναρτήσεις.
  • Συμπ. CPU - χρόνος επεξεργαστή με ένθετες λειτουργίες.
  • Εξαιρ. CPU - χρόνος επεξεργαστή χωρίς ένθετες λειτουργίες.
  • Συμπ. MemUse - κατανάλωση μνήμης με ένθετες λειτουργίες.
  • Εξαιρ. MemUse - κατανάλωση μνήμης χωρίς ένθετες λειτουργίες.
  • Συμπ. PeakMemUse - μέγιστη κατανάλωση μνήμης με ένθετες λειτουργίες.
  • Εξαιρ. PeakMemUse - μέγιστη κατανάλωση μνήμης χωρίς ένθετες λειτουργίες.

Γραφικές αναφορές

Για να δημιουργήσετε μια γραφική αναφορά, βεβαιωθείτε ότι έχετε εγκαταστήσει το graphviz: apt-get install graphviz

Οι ενότητες του κώδικα που απαιτούν πόρους επισημαίνονται με κίτρινο (μεσαίο) και κόκκινο (πιο βαρύ). Αυτά είναι εκείνα τα τμήματα κώδικα που χρησιμοποιούν πολλούς πόρους σε σχέση με το υπόλοιπο πρόγραμμα. Αυτή θα μπορούσε να είναι μια αργή λειτουργία ή πολλές κλήσεις σε μια γρήγορη λειτουργία. Στο παράδειγμά μας, η συνάρτηση str_replace()σημειώθηκε με κόκκινο χρώμα λόγω 262 κλήσεων.

Συγκεντρωτικές αναφορές

Η διεπαφή XHprof σάς επιτρέπει επίσης να προβάλλετε συγκεντρωτικές πληροφορίες από πολλές αναφορές ταυτόχρονα. Για να γίνει αυτό, το run_id περνάει χωρισμένο με κόμμα: http://xh..php?run= 53a894f6d5d9b,53a894fcf126e&πηγή=δοκιμή

TL;DR

Χρησιμοποιήστε το XHprof για το προφίλ της PHP απευθείας στην παραγωγή.

Χρησιμοποιώντας συστήματα δημιουργίας προφίλ, μπορείτε να συλλέξετε πληροφορίες σχετικά με το ποιες λειτουργίες στον κώδικα PHP καταναλώνουν περισσότερο χρόνο CPU και RAM, δηλαδή να προσδιορίσετε τις πιο αργές και απαιτητικές θέσεις σε ένα πρόγραμμα PHP.

xhprof

XHProf - Προφίλ PHP που αναπτύχθηκε από το Facebook.

Εγκατάσταση:

Aptitude install php-pear pecl install xhprof-0.9.4 echo "extension=xhprof.so" > /etc/php5/mods-available/xhprof.ini ln -s /etc/php5/mods-available/xhprof.ini /etc /php5/conf.d/xhprof.ini επανεκκίνηση apachectl

Τα αρχεία που είναι απαραίτητα για την εργασία βρίσκονται στον κατάλογο /usr/share/php. Ωστόσο, όχι όλα, αλλά μόνο με κώδικα PHP. Για την κανονική εμφάνιση των αναφορών, απαιτούνται jquery και css. Μπορούν να ληφθούν από το αποθετήριο github:

Κλώνος Git https://github.com/facebook/xhprof.git

Μετά από αυτό, προσθέστε τη γραμμή στον κώδικα δέσμης ενεργειών PHP στο σημείο όπου πρέπει να ξεκινήσει η συλλογή δεδομένων:

Xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Οι παράμετροι για τη συλλογή δεδομένων υποδεικνύονται σε παρένθεση. Σε αυτήν την περίπτωση, θα συλλεχθούν δεδομένα σχετικά με το φορτίο του επεξεργαστή και τη χρήση της μνήμης RAM. Μια ακόμη επιλογή είναι δυνατή XHPROF_FLAGS_NO_BUILTINSόταν χρησιμοποιείται, δεν συλλέγονται δεδομένα για ενσωματωμένες λειτουργίες.

$xhprof_data = xhprof_disable(); include_once "xhprof_lib/utils/xhprof_lib.php"; include_once "xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = νέο XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_test"); echo "Αναφορά: http://domain.tld/xhprof_html/index.php?run=$run_id&source=xhprof_test"; ηχώ "\n";

Στη γραμμή $run_idΤα εισαγωγικά υποδεικνύουν το όνομα του προφίλ, το οποίο μπορεί να οριστεί αυθαίρετα.

Το επεξεργασμένο αποτέλεσμα μοιάζει με αυτό:

Εάν καθορίσετε την παράμετρο XHPROF_FLAGS_NO_BUILTINS, είναι σαφές ότι ο αριθμός των κλήσεων συνάρτησης μειώνεται σημαντικά:

Ο πίνακας παρέχει τις ακόλουθες πληροφορίες:

κλήσεις- αριθμός κλήσεων λειτουργίας,
Wall Time- ο συνολικός χρόνος λειτουργίας της λειτουργίας, συμπεριλαμβανομένου του χρόνου αναμονής για απάντηση από εξωτερικούς πόρους,
ΕΠΕΞΕΡΓΑΣΤΗΣ- πόσος χρόνος δαπανήθηκε για την επεξεργασία συναρτήσεων,
MemUse- πόση μνήμη RAM χρησιμοποιήθηκε,
PeakMemUse- μέγιστη κατανάλωση μνήμης.

Οι τροποποιητές είναι:

Συμπ- χωρίς αποκλεισμούς - λαμβάνοντας υπόψη τις κλήσεις προς άλλες λειτουργίες από αυτήν τη λειτουργία,
Εξαιρ.- αποκλειστική - εξαιρουμένων των κλήσεων λειτουργιών.

Επιπλέον, πάνω από τον πίνακα υπάρχουν πληροφορίες σχετικά με τον συνολικό χρόνο επεξεργασίας, τη μνήμη που χρησιμοποιείται και τον αριθμό των κλήσεων λειτουργίας.

Επίσης XHProfσας επιτρέπει να δημιουργείτε αναφορές διαφοράς μεταξύ δύο εκτελέσεων, οι οποίες υποδεικνύονται με κόκκινο και πράσινο χρώμα. Με αυτές τις αναφορές, μπορείτε να έχετε μια σαφή εικόνα των βελτιώσεων μετά από κάθε αλλαγή κώδικα.

Για να αποκτήσετε μια τέτοια αναφορά, πρέπει να χρησιμοποιήσετε έναν σύνδεσμο όπως αυτός:

http://domain.tld/xhprof_html/index.php?run1=run_id1&run2=run_id2&source=xhprof_test

Οπου run_id1Και run_id2- αναγνωριστικά εκκίνησης.

Εάν εγκαταστήσετε Γραφβίζ:

Εγκατάσταση Aptitude graphviz

Υπάρχουν επίσης διεπαφές ιστού τρίτων για το php profiler xhprof που χρησιμοποιούν βάσεις δεδομένων:

xDebug

xDebug- Πρόγραμμα εντοπισμού σφαλμάτων κώδικα PHP με δυνατότητα δημιουργίας προφίλ, γραμμένο από τον Derick Rethans.

Εγκατάσταση:

Yum εγκατάσταση php5-xdebug

Στη συνέχεια, επεξεργαζόμαστε τη διαμόρφωση:

Nano /etc/php5/mods-available/xdebug.ini

προσθέτοντας τις γραμμές σε αυτό:

Xdebug.profiler_enable = 1 xdebug.profiler_aggregate = Σε xdebug.profiler_output_dir = /tmp

Εδώ ενεργοποιούμε το PHP profiler και καθορίζουμε τον κατάλογο στον οποίο θα αποθηκεύονται τα προφίλ. Τα προφίλ δημιουργούνται με ονόματα όπως cachegrind.out.*

Υπάρχει ένας web-πελάτης webgrind: https://github.com/jokkedk/webgrind. Δεν λειτουργεί πολύ γρήγορα, αλλά σας επιτρέπει να προβάλλετε γρήγορα μικρά προφίλ. Στην πραγματικότητα, αυτός είναι ο κώδικας PHP που πρέπει να κλωνοποιηθεί από το github:

Κλώνος Git https://github.com/jokkedk/webgrind.git

θα δημιουργηθεί ένας κατάλογος webgrind, το οποίο πρέπει να αντιγράψετε στον κατάλογο οποιουδήποτε ιστότοπου και να αποκτήσετε πρόσβαση από το πρόγραμμα περιήγησης. Στη συνέχεια, για να λειτουργήσει η γραφική παράσταση στο αρχείο ρυθμίσεων στο Debian config.phpπρέπει να διορθώσετε τη διαδρομή προς το εκτελέσιμο αρχείο graphviz. Θα πρέπει να μοιάζει με αυτό:

Static $dotExecutable = "/usr/bin/dot";

Επιπλέον, μπορείτε να προσαρμόσετε τη ζώνη ώρας:

Static $defaultTimezone = "Ευρώπη/Μόσχα";

Στην κεφαλίδα, μπορείτε να επιλέξετε ένα προφίλ και να επιλέξετε το πλαίσιο για να λάβετε υπόψη τις ενσωματωμένες λειτουργίες. Ο ίδιος ο πίνακας δείχνει τις λειτουργίες, τον αριθμό των κλήσεων, τον χρόνο λειτουργίας της ίδιας της λειτουργίας και τον χρόνο συμπεριλαμβανομένης της αναμονής. Για να εμβαθύνετε στις συναρτήσεις, απλώς κάντε κλικ στο τριγωνικό βέλος. Στην περίπτωσή μου, με αρκετά μεγάλα προφίλ (από αρκετά megabyte), η αναμονή για το αποτέλεσμα ήταν άσκοπα μεγάλη. Είναι πιθανώς καλύτερο να χρησιμοποιείτε τοπικά προγράμματα προβολής για αρκετά μεγάλα προφίλ.

Το γράφημα μπορεί να μοιάζει με αυτό:

σημειώστε ότι webgrindδεν πρέπει να χρησιμοποιείται σε διακομιστές παραγωγής, καθώς δεν παρέχεται εξουσιοδότηση, αλλά υπάρχει πρόσβαση στον κώδικα του αρχείου php. Εάν είναι απαραίτητο, χρησιμοποιήστε τουλάχιστον βασική εξουσιοδότηση Apache.

Υπάρχουν επίσης προγράμματα για την ανάλυση προφίλ για Linux:

Σχετικά με το προφίλ

Τα δεδομένα προφίλ μπορούν να σας βοηθήσουν να βελτιώσετε την εφαρμογή σας, δηλαδή να επιτύχετε ορισμένους στόχους, για παράδειγμα, να μειώσετε την κατανάλωση μνήμης, να μειώσετε το χρόνο δημιουργίας σελίδας κ.λπ.

Οι πληροφορίες στο προφίλ είναι το σημείο εκκίνησης για τη βελτιστοποίηση: σας λένε πόσο χρόνο χρειάζεται για να δημιουργηθεί ένα αποτέλεσμα, πόση μνήμη χρησιμοποιείται και πόσες κλήσεις λειτουργιών πραγματοποιούνται. Με πιο λεπτομερή δεδομένα, μπορείτε να βελτιώσετε αυτές τις μετρήσεις.

Για παράδειγμα, εάν χρησιμοποιείτε ένα πλαίσιο, τότε η χρήση ορισμένων από τις λειτουργίες του πλαισίου μπορεί να οδηγήσει σε κλήσεις σε πολλές βασικές λειτουργίες. Εάν διαβάζετε ορισμένα δεδομένα πολλές φορές, ίσως αξίζει να αποθηκεύσετε το αποτέλεσμα σε μια μεταβλητή.

Ο προγραμματιστής προφίλ μπορεί επίσης να σας βοηθήσει να κατανοήσετε πού να χρησιμοποιήσετε την προσωρινή αποθήκευση κώδικα PHP, για παράδειγμα, χρησιμοποιώντας APCuή memcached.

Πρώτα απ 'όλα, αξίζει να βελτιστοποιήσετε τις λειτουργίες που απαιτούν τον περισσότερο χρόνο εκτέλεσης. Μόλις βελτιστοποιηθούν όλα και φαίνεται ότι δεν υπάρχει τίποτα άλλο για βελτίωση, αξίζει να ταξινομήσετε τις λειτουργίες με βάση τον αριθμό των κλήσεων και να εργαστείτε για τη μείωση του. Ακόμα κι αν η PHP είναι γρήγορη, αξίζει να σκεφτείτε αν οι συναρτήσεις πρέπει να καλούνται τόσο συχνά;

Εάν αντιμετωπίζετε τις ακόλουθες καταστάσεις, θα πρέπει να εξετάσετε την προσωρινή αποθήκευση:

  • Οι αμετάβλητες συναρτήσεις καλούνται μέσα σε έναν βρόχο,
  • Κάποιο περιεχόμενο δημιουργείται δύο φορές,
  • Περιεχόμενο που δεν αλλάζει δημιουργείται κάθε φορά,
  • Το περιεχόμενο δημιουργείται ακόμα και αν δεν χρησιμοποιείται.

Δεν πρέπει να αποθηκεύετε τα πάντα στην προσωρινή μνήμη, καθώς η μνήμη είναι επίσης πολύτιμος πόρος. Αποθηκεύστε προσωρινά τα δεδομένα στα οποία έχετε πρόσβαση συνεχώς. Επίσης, η προσωρινή αποθήκευση δεν έχει νόημα εάν η προσωρινή αποθήκευση σπαταλά περισσότερους πόρους από ό,τι εξοικονομεί.

Εκτός από την προσωρινή αποθήκευση στον κώδικα, μην ξεχνάτε την προσωρινή αποθήκευση χρησιμοποιώντας τον διακομιστή web (), καθώς και από την πλευρά του πελάτη. Εάν χρησιμοποιείτε τις σωστές κεφαλίδες, πολλά αιτήματα μπορούν να επιλυθούν πριν καν φτάσουν στον διακομιστή.

Εγκατάσταση του xhprof για php:

Το Sudo apt-get εγκαταστήστε το php5-xhprof

Επανεκκινήστε τον Apache:

Επανεκκίνηση της υπηρεσίας Sudo apache2

Εκτύπωση phpinfo(); και ελέγξτε αν η μονάδα είναι συνδεδεμένη ή όχι;

Ελέγχουμε το /etc/php5/apache2/conf.d για να δούμε αν υπάρχει σύνδεσμος για τη διαμόρφωση xhprof.ini εκεί.

Αν όχι, τότε δημιουργήστε μόνοι σας τον σύνδεσμο και επανεκκινήστε τον Apache.

Sudo ln -s /etc/php5/mods-available/xhprof.ini /etc/php5/apache2/conf.d/20-xhprof.ini επανεκκίνηση της υπηρεσίας sudo apache2

Ελέγχουμε τη σύνδεση xhprof, ελέγχουμε αν είναι συνδεδεμένο το 20-xhprof.ini:

Το στιγμιότυπο οθόνης δείχνει την έκδοση 0.9.2, αν και κατά την εγκατάσταση εμφανίστηκε η έκδοση 0.9.4, αλλά αυτό δεν αποτελεί εμπόδιο για εμάς.

Τώρα μπορούμε να προφίλ τον κώδικα μας.

  1. Στην αρχή της σελίδας, ενεργοποιήστε το προφίλ χρησιμοποιώντας xhprof_enable();
  2. Στο τέλος της σελίδας, απενεργοποιήστε τη δημιουργία προφίλ χρησιμοποιώντας το xhprof_disable() και αποθηκεύστε τα δεδομένα που συλλέγονται χρησιμοποιώντας το save_run();
  3. Στη συνέχεια αναλύουμε.

Λειτουργία xhprof_enable()παίρνει σημαίες ως ορίσματα:

XHPROF_FLAGS_CPU για καταγραφή στατιστικών στοιχείων επεξεργαστή,

XHPROF_FLAGS_MEMORY - για μνήμη,

XHPROF_FLAGS_NO_BUILTINS - για να αγνοήσετε τις ενσωματωμένες λειτουργίες.

Για αποθήκευση και περαιτέρω ενημέρωση, πρέπει να εγκαταστήσουμε ένα εργαλείο ανάλυσης προφίλ.

Κατεβάστε το αρχείο με το εργαλείο ανάλυσης από τη σελίδα xhprof:, λάβετε την έκδοση 0.9.4.

Στον διακομιστή ή στον τοπικό υπολογιστή, δημιουργήστε έναν φάκελο προσβάσιμο μέσω του localhost ή ενός ξεχωριστού τομέα στον οποίο αποσυμπιέζουμε το αρχείο που κατεβάσατε:

Τώρα μπορούμε να αποθηκεύσουμε το προφίλ.

https://xn--d1acnqm.xn--j1amh/altadmin/posts/edit/188

Ο κώδικας παρακολούθησης μοιάζει κάπως έτσι:

// Αρχικοποίηση του προφίλ - θα μετρήσουμε τόσο τον χρόνο του επεξεργαστή όσο και την κατανάλωση μνήμης xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
// Κωδικός προφίλ # Διακοπή του προφίλτρου $xhprof_data = xhprof_disable(); # Αποθηκεύστε την αναφορά και δημιουργήστε έναν σύνδεσμο για να την προβάλετε include_once "/var/www/html/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/html/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = νέο XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_test"); echo "Αναφορά: http://localhost/xhprof-0.9.4/xhprof_html/index.php?run=$run_id&source=xhprof_test"; ηχώ "\n";

/var/www/html/xhprof-0.9.4 - η διαδρομή προς το φάκελο όπου αποσυμπιέσαμε τις βιβλιοθήκες που χρειαζόμαστε.

Αναφορά: http://localhost/xhprof-0.9.4/xhprof_html/index.php?run=57c32f3095d21&source=xhprof_test

Έτσι φαίνεται μια ανάλυση προφίλ. Αυτός ο πίνακας εμφανίζει όλες τις κλήσεις συναρτήσεων που έχουν προφίλ.

Μπορούμε να ταξινομήσουμε τις συναρτήσεις κάνοντας κλικ στις επικεφαλίδες του πίνακα.

Όταν βλέπουμε ότι κάποια συνάρτηση εκτελείται είτε πολλές φορές είτε για πολύ μεγάλο χρονικό διάστημα, μπορούμε να κάνουμε κλικ σε αυτή τη συνάρτηση και θα ανοίξει ένας παρόμοιος πίνακας αλλά με εσωτερικές κλήσεις μέσα στην εν λόγω συνάρτηση και στο γονικό περιβάλλον όπου κλήθηκε η συνάρτηση.

Δείκτες:
Total Inc. Wall Time (χρόνος που δαπανάται για την εκτέλεση λειτουργιών, λαμβάνοντας υπόψη την αναμονή για απαντήσεις από πρίζες, σύστημα αρχείων και άλλους πόρους)
Total Inc. CPU (χρόνος που δαπανάται για την εκτέλεση λειτουργιών)
Total Inc. MemUse (χρήση μνήμης)
Total Inc. PeakMemUse (μέγιστη χρήση μνήμης)
Αριθμός κλήσεων συναρτήσεων

Υπάρχει επίσης η επιλογή γραφικής εμφάνισης της αναφοράς. Αλλά για να το κάνετε αυτό, πρέπει να βεβαιωθείτε ότι έχετε εγκαταστήσει τη βιβλιοθήκη graphviz:

Apt-get εγκαταστήστε το graphviz

Στη συνέχεια, στο προφίλ σας πρέπει να κάνετε κλικ για εμφάνιση και voila:

Τώρα μπορείτε να αναλύσετε και να βελτιώσετε τον κώδικα.