PHP აპლიკაციების პროფილირება და გამართვა xhprof & FirePHP გამოყენებით. PHP აპლიკაციების პროფილირება PhpStorm-ით და Xdebug პროფილირებით php

10.08.2022

PHP კოდის პროფილირება

ადრე თუ გვიან, თითოეულ ჩვენგანს ემუქრება მემკვიდრეობითი კოდი და მისი ოპტიმიზაცია. ასეთ ვითარებაში, დებუგერი და პროფილერი პროგრამისტის საუკეთესო ასისტენტებია. მათ, ვინც მუშაობს PHP-ით, დერიკ რეთანსის წყალობით, აქვთ კარგი ინსტრუმენტი- xDebug. ბევრი ინფორმაციაა xDebug-თან დაკავშირებით RuNet-შიც კი, ამიტომ ეს სტატია არ იქნება ამის შესახებ.

როდესაც PHP-ის პროფილის ხსენებას წავაწყდი, მაშინვე გავიფიქრე xDebug-ზე (დიდი ხნის წინ დამავიწყდა Zend-ის საკუთრების ინსტრუმენტები), მაგრამ ამჯერად შევცდი - ვისაუბრებთ XHProf-ზე.
XH პროფ

ეს პროფილერი შეიქმნა სპეციალურად 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 კონფიგურაცია - ყველაზე სტანდარტული.

სერვერი (
მოსმენა 80;
server_name prof.my;
სიმბოლოების ნაკრები utf8;

Root /usr/local/src/xhprof-0.9.2/xhprof_html ;
ადგილმდებარეობა/(
index 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);
}
}

ქვედა კოლონტიტული.php
if(isset($_COOKIE["xhprof"]))(
if (extension_loaded ("xhprof")) (
$profiler_namespace = "myapp"; // სახელთა სივრცე თქვენი აპლიკაციისთვის
$xhprof_data = xhprof_disable();
$xhprof_runs = ახალი XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);

// url XHProf UI ბიბლიოთეკებში (შეცვალეთ ჰოსტის სახელი და გზა)
$profiler_url = sprintf("http://prof.my/index.php?run=%s&source=%s", $run_id, $profiler_namespace);
ექო<<პროფილის გამომავალი
OUT;
}
}

ახლა ჩვენ ვაწარმოებთ ნებისმიერ PHP სკრიპტს ვებზე და ზედა მარცხენა კუთხეში ვხედავთ ბმულს პროფილის გამომავალზე - სწორედ ამისთვის შეიქმნა host prof.my.

გთხოვთ გაითვალისწინოთ - მე ვიყენებ COOKIE შემოწმებას! ასეთი შემოწმებით, შეგიძლიათ უსაფრთხოდ გამოიყენოთ პროფილერი წარმოების სერვერზე - რეალურ მონაცემებზე და რეალურ დატვირთვაზე.

პროფილერის ვებ ინტერფეისი აჩვენებს ნიშანს თითოეული ფუნქციის შესახებ ინფორმაციას და აწვდის შემდეგ ინფორმაციას:

  • ზარების რაოდენობა თითოეულ ფუნქციაზე
  • Wall-time, ფუნქციების შესრულებაზე დახარჯული დრო (მათ შორის პასუხების მოლოდინი სოკეტებიდან, ფაილური სისტემიდან და ა.შ.).
  • CPU-დრო, ფუნქციების შესრულებაზე დახარჯული დრო (გამორიცხულია პასუხების მოლოდინი სოკეტებიდან, ფაილური სისტემიდან და ა.შ.).
  • Მეხსიერების გამოყენება
  • მეხსიერების მაქსიმალური გამოყენება

ცხრილის დალაგება შესაძლებელია რომელიმე პარამეტრით

ინფორმაცია თითოეული ფუნქციის შესახებ იყოფა კიდევ ორ ტიპად: ინკლუზიური და ექსკლუზიური. ინკლუზივი მოიცავს ციფრებს, რომლებსაც იყენებენ ბავშვის ზარები, ხოლო ექსკლუზივი არ მოიცავს მათ. ასევე შესაძლებელია დააწკაპუნოთ ფუნქციის სახელზე, რათა ნახოთ მხოლოდ მასზე არსებული ინფორმაცია და ფუნქციები, საიდანაც გამოიძახეს და რომლებიც გამოიძახეს მის მიერ.

თუ GraphViz დაინსტალირებულია სისტემაში, პროფილერი დაგიხაზავთ ზარის გრაფიკს.

P.S. ტრადიციების დარღვევის გარეშე: ეს ჩემი პირველი პოსტია 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-ისთვის არის მარტივი პროგრამა, რომელიც ასევე უფასოა. ჯერ ვნახოთ ვინდოუსის ვერსია.

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

KCachegrind-ის Unix ვერსია უზრუნველყოფს უფრო მეტ ფუნქციონირებას, ვიდრე 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-ში:

კოდის ეს ბლოკი აწარმოებს ორ request_onces-ს, რაც არის იმ დროის ნახევარი, რაც სჭირდება common.inc.php-ის გასაშვებად. ორმაგი დაწკაპუნებით ნებისმიერ მართკუთხედზე უფრო ღრმად გადაგიყვანთ მონაცემთა ანალიზში.

კოდის ოპტიმიზაცია პროფილირების მონაცემებზე დაყრდნობით

ოპტიმიზაციამდე ყოველთვის დაწერეთ თქვენი აპლიკაციების პროფილი. თქვენ შეგიძლიათ დაიწყოთ ოპტიმიზაცია თავად, იმ ადგილას, სადაც მოგეჩვენებათ, რომ ეს ოპტიმიზაცია მოაქვს ეფექტს, მაგრამ ეს ყოველთვის ასე არ არის. ოპტიმიზაცია ძირითადად მოქმედებს მხოლოდ იმ ნაწილებზე, რომლებსაც ყველაზე მეტი დრო სჭირდება შესრულების პროცესში.
თუ თქვენ ერთდროულად აწარმოებთ პროგრამის ბევრ ასლს, შეიძლება მაინც დაგჭირდეთ თქვენი პროგრამის იმ ნაწილის ოპტიმიზაცია, რომელიც იკავებს შესრულების დროის უმეტეს ნაწილს. ამ შემთხვევაში, ოპტიმიზაცია არ დააჩქარებს ერთი ინდივიდუალური მოთხოვნის შესრულებას, მაგრამ საშუალებას მისცემს თქვენს სერვერს გაუმკლავდეს მაღალ დატვირთვას, ხოლო ნაკლებ რესურსს მოიხმარს ამ მოთხოვნების მოსამსახურებლად.
პროფილის გაშვების ხანგრძლივობის დათვალიერებისას გაითვალისწინეთ, რომ აბსოლუტური მნიშვნელობები ნაკლებად მნიშვნელოვანია, ვიდრე ფარდობითი მნიშვნელობები. სხვადასხვა სისტემებზე გაზომილი, აბსოლუტური მნიშვნელობები შეიძლება განსხვავდებოდეს. თუმცა, სანამ თქვენი კოდის ოპტიმიზაციას დაიწყებთ, გაითვალისწინეთ შემდეგი რამ.
ოპტიმიზაციის მნიშვნელოვანი წესია I/O ოპერაციების რაოდენობის შემცირება. ზოგიერთი I/O ოპერაცია ძალიან შრომატევადია გამოთვლებთან შედარებით. ასეთი ოპერაციების შემცირება შეიძლება იყოს ძალიან ეფექტური გზა თქვენი პროგრამის დასაჩქარებლად. ერთი I/O ზარის ამოღება უფრო ეფექტურ გაუმჯობესებას იძლევა, ვიდრე კოდის ოპტიმიზაციისთვის ბევრი საათის დახარჯვა. ამიტომ, კოდირების დაწყებამდე ჯერ ყურადღება უნდა გაამახვილოთ I/O ოპერაციებზე.
თქვენ ასევე შეგიძლიათ გაზარდოთ თქვენი სერვერების რაოდენობა ოპტიმიზაციამდე. შეგიძლიათ შეიძინოთ უზარმაზარი, რომელიც მოგცემთ პროდუქტიულობის მცირე ზრდას. განვითარების დრო უფრო ძვირია, ვიდრე ახალი სერვერის ფასი. და თუ გაზრდით ტექნიკის რაოდენობას, შეგიძლიათ დარწმუნებული იყოთ, რომ ზრდას დაუყოვნებლივ მიიღებთ PHP კოდზე რაიმე ზემოქმედების გარეშე. როდესაც დეველოპერი ხარჯავს ერთ ან ორ დღეს კოდის ოპტიმიზაციას, ვერასოდეს გეტყვით რამდენად გაიზრდება პროდუქტიულობა. და ბოლოს, თქვენ აღარ შეგიძლიათ დარწმუნებული იყოთ, რომ ოპტიმიზაცია არ მოიტანს შეცდომებს.
ზოგიერთი გვერდის სტატიკურ გვერდებზე გადაყვანა არის უკეთესი შესრულების მიღწევის ერთ-ერთი გზა. ვთქვათ, არის საიტი დიდი ტრაფიკით, სადაც PHP სკრიპტი ქმნის პირველ გვერდს თითოეული მოთხოვნისთვის, ირჩევს ინფორმაციას მონაცემთა ბაზიდან ან XML ფაილიდან. თუ გვერდის მონაცემები საკმარისად ხშირად იცვლება, შეგიძლიათ ხელახლა შექმნათ მისი სტატიკური ასლი. თუ გვერდისთვის სტატიკურ ხედზე კონვერტაცია შეუძლებელია (გვერდზე ნაჩვენებია ზოგიერთი პერსონალური ინფორმაცია), შეგიძლიათ ზოგიერთი ბლოკის სტატიკურ ხედად გადაქცევა.
ოპტიმიზაციის სხვა დონე არ საჭიროებს PHP კოდის შეცვლას. როგორც ვიცით PHP არის ინტერპრეტირებული ენა. ეს ნიშნავს, რომ მისი ბრძანებები ითარგმნება გაშვების დროს შუალედურ კოდში. მაუწყებლობა მეორდება ყოველ ჯერზე სკრიპტის გაშვებისას. ეს ხდის PHP-ს ანელებს ისეთ ენებთან შედარებით, როგორიცაა C ან Java, რომლებიც არ საჭიროებენ კოდის გაანალიზებას ყოველ ჯერზე, როცა გაშვებთ. PHP-სთვის შეგიძლიათ გამოიყენოთ შუალედური წარმომადგენლობის ქეში (იხილეთ ჩემი თარგმანი...) შუალედური კოდის შესანახად და ხელახლა გამოსაყენებლად, ეს აჩქარებს გაშვებას და შესრულებას.
ეს ყველაფერი არ ნიშნავს იმას, რომ ეს არ არის დრო ან ადგილი PHP კოდის ოპტიმიზაციისთვის. ზოგიერთი კოდის ოპტიმიზაციას შეუძლია მნიშვნელოვნად გააუმჯობესოს შესრულება. თუმცა, ყოველთვის გახსოვდეთ, რომ კოდის შეცვლა ყოველთვის შეიცავს დამატებითი შეცდომების და უსაფრთხოების საკითხების დანერგვის რისკს. ასევე გახსოვდეთ, რომ თქვენი კოდის ოპტიმიზაცია მას ნაკლებად იკითხავს.

დასკვნა

პროფილირების ჟურნალის შექმნა და ვიზუალიზაცია ერთ-ერთი მნიშვნელოვანი პირობაა PHP კოდის ოპტიმიზაციისთვის. თქვენ უნდა იცოდეთ პროგრამის რომელ ადგილებს სჭირდებათ ყველაზე მეტი დრო და სწორედ აქედან უნდა დაიწყოთ ოპტიმიზაცია.
შემდეგ სტატიაში განვიხილავთ xdebug-ის გამოყენებით გამართვას. xdebug-ს შეუძლია მოგაწოდოთ დისტანციური გამართვის შესაძლებლობა. კლიენტის გამოყენებით, რომელსაც აქვს ეს შესაძლებლობა, როგორიცაა Eclipse PDT, შეგიძლიათ გამართოთ თქვენი კოდი მისი შეცვლის გარეშე, დააყენოთ წყვეტის წერტილები, გადახვიდეთ კოდის სექციებში და ნახოთ, როგორ და სად ცვლის ცვლადები მნიშვნელობებს.

აპლიკაციის პროფილირება არის მონაცემთა შეგროვება პროგრამის სხვადასხვა განყოფილებების (ფაილები და ფუნქციები) შესრულების სიჩქარის შესახებ. არსებობს მრავალი PHP პროფილირების ინსტრუმენტი, მაგრამ ყველა ინსტრუმენტი არ არის შესაფერისი ანალიზის ჩასატარებლად უშუალოდ წარმოებაში.

XH პროფ- მეგა მარტივი პროფილერი, რომელიც აგროვებს სტატისტიკას უშუალოდ, სანამ აპლიკაცია მუშაობს თითქმის ზედმეტი ხარჯების გარეშე.

რატომ პროფილი?

თუ აპლიკაცია ნელა იწყებს მუშაობას, პროფილირება დაგეხმარებათ გაიგოთ, რომელი ნაწილია ნელი. პროფილირების შედეგი, როგორც წესი, არის შესრულებული ფუნქციების სია და მათი შესრულების დრო.

პროფილირება უნდა მოხდეს ნებისმიერი აპლიკაციის ოპტიმიზაციამდე. წინააღმდეგ შემთხვევაში, თქვენ იხელმძღვანელებთ ვარაუდებით. დიდი ალბათობით არასწორია.

Xdebug პრობლემა

Xdebug არის ძლიერი გადაწყვეტა PHP-სთვის. მაგრამ თავად Xdebug პლატფორმა იმდენად მძიმეა, რომ ის არ შეიძლება გამოყენებულ იქნას პირდაპირ საიტებზე. XDebug ქმნის მნიშვნელოვან დატვირთვას სერვერის რესურსებზე და ანელებს აპლიკაციას.

მეორეს მხრივ, პირდაპირ საიტზე არსებული პრობლემები შეიძლება სრულიად განსხვავებული იყოს განვითარების გარემოში არსებული პრობლემებისგან. მხოლოდ დეველოპერის კომპიუტერებზე პროფილირება აჩვენებს პრობლემების მხოლოდ ნაწილს.

სწორედ ამიტომ შემუშავდა გამოსავალი XH პროფ. ის განკუთვნილია გაშვებულ აპლიკაციებში გამოსაყენებლად. ამ პროფილერის მთავარი იდეაა აპლიკაციაზე მინიმალური დატვირთვის შექმნა ოპერაციის სიჩქარის შესახებ ყველა საჭირო მონაცემის შეგროვებისას. გამოსავალი შეიმუშავეს ბიჭებმა ფეისბუქიდან და მხარდაჭერილია PHP-ის ახალი ვერსიებით.

XH პროფ

ინსტალაცია

Debian-ზე XHprof არის sid პაკეტებში, ასე რომ: apt-get დააინსტალირე xhprof

თქვენ ასევე შეგიძლიათ თავად შექმნათ XHprof.

პროფილირების ჩართვა

ვთქვათ, გვაქვს სკრიპტი შემდეგი კოდით:

execute();

მოდით განვახორციელოთ პროფილირება XHprof-ის გამოყენებით. ამისათვის ამ გვერდზე გჭირდებათ:

  1. ჩართეთ პროფილერი თავიდანვე.
  2. პროგრამის ბოლოს შეაჩერეთ პროფილერი და შეინახეთ მიღებული მონაცემები.

ეს ასე გამოიყურება:

# პროფილერის ინიციალიზაციაxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); # შეასრულეთ პროგრამა პროფილერის ჩართვის შემდეგ execute(); # გააჩერეთ პროფილერი პროგრამის შესრულების შემდეგ$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, "ტესტი");

# ახალი კოდი ინახავს ანგარიშს GUI-ში გამოსაყენებლად

ინტერფეისი მოხსენებებისთვის

ანგარიშის სანახავად, თქვენ უნდა დააკონფიგურიროთ ვირტუალური ჰოსტი /var/www/xhprof-0.9.4/xhprof_html საქაღალდეში. მაგალითად, Nginx-ში:

სერვერი (server_name xh..9.4/xhprof_html; index index.php; მდებარეობა ~* \.(php)$ (fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; მოიცავს fastcgi_params; fastcgi_param SCRIPT_FILE NAMEx)$dong) -s გადატვირთვა

ამის შემდეგ გამოჩნდება მოხსენებების სია:

ცხრილი შეიცავს ფუნქციების ჩამონათვალს, რომლებიც შესრულდა ერთ გვერდზე, დამატებითი ინფორმაციით:

  • ზარები — ფუნქციის ზარების რაოდენობა და პროცენტი.
  • ჩათვლით 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 კოდში მოიხმარს მეტ პროცესორის დროსა და RAM-ს, ანუ დაადგინეთ ყველაზე ნელი და მეხსიერების მოთხოვნადი ადგილები PHP პროგრამაში.

xhპროფ

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

მონაცემების შეგროვების პარამეტრები მითითებულია ფრჩხილებში. ამ შემთხვევაში, მონაცემები შეგროვდება პროცესორის დატვირთვისა და ოპერატიული მეხსიერების გამოყენების შესახებ. შესაძლებელია კიდევ ერთი ვარიანტი 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- რამდენი ოპერატიული მეხსიერება იყო გამოყენებული,
PeakMemUse- მეხსიერების მაქსიმალური მოხმარება.

მოდიფიკატორები არიან:

ჩათვლით- ინკლუზიური - ამ ფუნქციის სხვა ფუნქციების ზარების გათვალისწინებით,
გამოკლ.- ექსკლუზიური - ფუნქციური ზარების გამოკლებით.

გარდა ამისა, ცხრილის ზემოთ არის ინფორმაცია დამუშავების მთლიანი დროის, გამოყენებული მეხსიერების და ფუნქციის ზარების რაოდენობის შესახებ.

ასევე XH პროფსაშუალებას გაძლევთ შექმნათ განსხვავებების ანგარიშები ორ გაშვებას შორის, რომლებიც მითითებულია წითელი და მწვანე ფერებით. ამ მოხსენებებით, თქვენ შეგიძლიათ მიიღოთ გაუმჯობესების მკაფიო სურათი კოდის ყოველი ცვლილების შემდეგ.

ასეთი ანგარიშის მისაღებად, თქვენ უნდა გამოიყენოთ ეს ბმული:

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

სად run_id1და run_id2- გაშვების იდენტიფიკატორები.

თუ დააინსტალირეთ გრაფვიზი:

Aptitude install graphviz

ასევე არსებობს მესამე მხარის ვებ ინტერფეისები php profiler xhprof-ისთვის, რომლებიც იყენებენ მონაცემთა ბაზებს:

xDebug

xDebug- PHP კოდის გამართვა პროფილირების შესაძლებლობით, დაწერილი დერიკ რეთანსის მიერ.

ინსტალაცია:

დააინსტალირეთ php5-xdebug

შემდეგ ჩვენ ვასწორებთ კონფიგურაციას:

ნანო /etc/php5/mods-available/xdebug.ini

მას ხაზების დამატება:

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

აქ ჩვენ ჩართავთ PHP პროფილერს და ვაზუსტებთ დირექტორიას, რომელშიც უნდა შეინახოს პროფილები. პროფილები იქმნება ისეთი სახელებით, როგორიცაა cachegrind.out.*

არსებობს webgrind ვებ კლიენტი: https://github.com/jokkedk/webgrind. ის არ მუშაობს ძალიან სწრაფად, მაგრამ საშუალებას გაძლევთ სწრაფად ნახოთ მცირე პროფილები. სინამდვილეში, ეს არის PHP კოდი, რომელიც უნდა იყოს კლონირებული github-დან:

Git კლონი https://github.com/jokkedk/webgrind.git

შეიქმნება დირექტორია ვებგრინდი, რომელიც თქვენ უნდა დააკოპიროთ ნებისმიერი საიტის დირექტორიაში და შეხვიდეთ მას ბრაუზერიდან. შემდეგი, რათა კონფიგურაციის ფაილში შეთქმულება იმუშაოს Debian-ში config.phpთქვენ უნდა შეასწოროთ გზა შესრულებადი ფაილისკენ graphviz. ეს ასე უნდა გამოიყურებოდეს:

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

გარდა ამისა, შეგიძლიათ დაარეგულიროთ დროის სარტყელი:

Static $defaultTimezone = "ევროპა/მოსკოვი";

სათაურში შეგიძლიათ აირჩიოთ პროფილი და მონიშნოთ ველი ჩაშენებული ფუნქციების გასათვალისწინებლად. თავად ცხრილი აჩვენებს ფუნქციებს, ზარების რაოდენობას, თავად ფუნქციის მუშაობის დროს და ლოდინის დროს. ფუნქციებში უფრო ღრმად ჩასასვლელად, უბრალოდ დააჭირეთ სამკუთხა ისარს. ჩემს შემთხვევაში, საკმაოდ დიდი პროფილებით (რამდენიმე მეგაბაიტიდან), შედეგზე ლოდინი ზედმეტად მაღალი იყო. ალბათ ჯობია გამოიყენოთ ადგილობრივი სანახავი პროგრამები საკმაოდ დიდი პროფილებისთვის.

გრაფიკი შეიძლება ასე გამოიყურებოდეს:

გაითვალისწინე ვებგრინდიარ უნდა იქნას გამოყენებული წარმოების სერვერებზე, რადგან ავტორიზაცია არ არის გათვალისწინებული, მაგრამ არის წვდომა php ფაილის კოდზე. საჭიროების შემთხვევაში, გამოიყენეთ მინიმუმ ძირითადი Apache ავტორიზაცია.

ასევე არსებობს ლინუქსის პროფილების ანალიზის პროგრამები:

პროფილირების შესახებ

პროფილის მონაცემები დაგეხმარებათ გააუმჯობესოთ თქვენი აპლიკაცია, ანუ მიაღწიოთ გარკვეულ მიზნებს, მაგალითად, შეამციროთ მეხსიერების მოხმარება, შეამციროთ გვერდის შექმნის დრო და ა.შ.

პროფილში არსებული ინფორმაცია არის ოპტიმიზაციის საწყისი წერტილი: ის გეტყვით, რამდენი დრო სჭირდება შედეგის გენერირებას, რამდენი მეხსიერებაა გამოყენებული და რამდენი ფუნქციის გამოძახება ხდება. უფრო დეტალური მონაცემებით, შეგიძლიათ გააუმჯობესოთ ეს მეტრიკები.

მაგალითად, თუ თქვენ იყენებთ ფრეიმიკს, მაშინ ფრეიმერის ზოგიერთი ფუნქციის გამოყენებამ შეიძლება გამოიწვიოს რამდენიმე ძირითადი ფუნქციის გამოძახება. თუ ზოგიერთ მონაცემს რამდენჯერმე კითხულობთ, შეიძლება ღირდეს შედეგის შენახვა ცვლადში.

პროფილირს ასევე შეუძლია დაგეხმაროთ იმის გაგებაში, თუ სად გამოიყენოთ PHP კოდების ქეშირება, მაგალითად, გამოყენებით APCuან მემქეშირებული.

უპირველეს ყოვლისა, ღირს ფუნქციების ოპტიმიზაცია, რომლებიც ყველაზე მეტ დროს მოითხოვს. მას შემდეგ, რაც ყველაფერი ოპტიმიზირებულია და როგორც ჩანს, გასაუმჯობესებელი აღარაფერი რჩება, ღირს ფუნქციების დახარისხება ზარების რაოდენობის მიხედვით და მის შემცირებაზე მუშაობა. მაშინაც კი, თუ PHP სწრაფია, ღირს იმის გათვალისწინება, საჭიროა თუ არა ფუნქციების ასე ხშირად გამოძახება?

თუ შეხვდებით შემდეგ სიტუაციებს, უნდა გაითვალისწინოთ ქეშირება:

  • უცვლელი ფუნქციები იწოდება მარყუჟის შიგნით,
  • ზოგიერთი შინაარსი ორჯერ იქმნება,
  • კონტენტი, რომელიც არ იცვლება, ყოველ ჯერზე იქმნება,
  • კონტენტი იქმნება მაშინაც კი, თუ ის არ გამოიყენება.

არ უნდა შეინახოთ ყველაფერი, რადგან მეხსიერება ასევე ღირებული რესურსია. იმ მონაცემების ქეშირება, რომლებსაც მუდმივად წვდებით. ასევე, ქეშირებას აზრი არ აქვს, თუ ქეშირება უფრო მეტ რესურსს ხარჯავს, ვიდრე დაზოგავს.

კოდის ქეშირების გარდა, არ დაივიწყოთ ქეშირება ვებ სერვერის გამოყენებით (), ასევე კლიენტის მხარეს. თუ თქვენ იყენებთ სწორ სათაურებს, ბევრი მოთხოვნა შეიძლება გადაიჭრას სანამ ისინი სერვერს მიაღწევენ.

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.

სერვერზე ან ლოკალურ კომპიუტერზე შექმენით საქაღალდე, რომელიც ხელმისაწვდომია ლოკალური ჰოსტის ან ცალკეული დომენის საშუალებით, რომელშიც ვხსნით ჩამოტვირთულ არქივს:

ახლა ჩვენ შეგვიძლია პროფილის შენახვა.

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

თვალთვალის კოდი ასე გამოიყურება:

// პროფილერის ინიცირება - ჩვენ ვითვლით როგორც პროცესორის დროს, ასევე მეხსიერების მოხმარებას xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
// პროფილირებული კოდი # Stop profiler $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:

ახლა თქვენ შეგიძლიათ გაანალიზოთ და გააუმჯობესოთ კოდი.