پروفایل کد PHP7 با استفاده از xhprof. پروفایل PHP با XHprof پروفایل php

پروفایل کد پی اچ پی

دیر یا زود، هر یک از ما با کدهای قدیمی و بهینه سازی آن مواجه می شویم. در چنین شرایطی، یک دیباگر و یک پروفایلر بهترین دستیار برنامه نویس هستند. کسانی که با پی اچ پی کار می کنند، به لطف Derick Rethans، دارند ابزار خوب- xDebug. اطلاعات زیادی در مورد xDebug حتی در RuNet وجود دارد، بنابراین این مقاله در مورد آن نخواهد بود.

وقتی به نام یک پروفایل برای PHP برخوردم، بلافاصله به xDebug فکر کردم (مدت ها بود که ابزارهای اختصاصی Zend را فراموش کرده بودم)، اما این بار اشتباه کردم - ما در مورد XHProf صحبت خواهیم کرد.
پروفسور XH

این نمایه ساز به طور خاص برای فیس بوک و کد منبعدر مارس 2009 افتتاح شد.

نصب بسیار سریع و روان انجام شد.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
سی دی xhprof-0.9.2/extension/
phpize
./configure && make && install
cd /usr/local/etc/php.d/
vim xhprof.ini
سی دی /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)؛
}
}

Footer.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);
اکو<<خروجی پروفایل
خارج
}
}

اکنون هر اسکریپت PHP را از طریق وب اجرا می کنیم و در گوشه سمت چپ بالا پیوندی به خروجی پروفایلر می بینیم - این دقیقا همان چیزی است که host prof.my برای آن ایجاد شده است.

لطفا توجه داشته باشید - من از چک کردن کوکی استفاده می کنم! با چنین بررسی، می توانید با خیال راحت از پروفایلر در سرور تولیدی استفاده کنید - در داده های واقعی و بار واقعی.

رابط وب پروفایلر علائمی را با اطلاعات مربوط به هر عملکرد نمایش می دهد و اطلاعات زیر را گزارش می دهد:

  • تعداد تماس های هر تابع
  • زمان دیوار، زمان صرف شده برای اجرای توابع (از جمله انتظار برای پاسخ از سوکت ها، فایل سیستمو غیره).
  • زمان CPU، زمان صرف شده برای اجرای توابع (به استثنای انتظار برای پاسخ از سوکت ها، سیستم فایل و غیره).
  • استفاده از حافظه
  • حداکثر استفاده از حافظه

مرتب سازی جدول بر اساس هر یک از پارامترها امکان پذیر است

اطلاعات مربوط به هر تابع به دو نوع دیگر تقسیم می شود: فراگیر و انحصاری. شامل ارقامی است که برای تماس های کودک استفاده می شود، در حالی که انحصاری آن ها را شامل نمی شود. همچنین می توان روی نام یک تابع کلیک کرد تا فقط اطلاعات مربوط به آن و توابعی که از آن فراخوانی شده و توسط آن فراخوانی شده اند را مشاهده کنید.

اگر GraphViz روی سیستم نصب شده باشد، نمایه ساز یک نمودار تماس برای شما ترسیم می کند.

P.S. بدون سنت شکنی: این اولین پست من در هابره است.

UPD: بازنشر شده در PHP.

پروفایل برنامه مجموعه ای از داده ها در مورد سرعت اجرای بخش های مختلف برنامه (فایل ها و توابع) است. ابزارهای پروفایل PHP زیادی در دسترس هستند، اما همه ابزارها برای انجام تحلیل مستقیم در تولید مناسب نیستند.

پروفسور XH- یک نمایه ساز ساده که به طور مستقیم آمار را در حالی که برنامه در حال اجرا است و تقریباً بدون هیچ هزینه ای در حال اجرا است جمع آوری می کند.

چرا پروفایل؟

اگر یک برنامه به کندی شروع به اجرا کند، نمایه سازی می تواند به شما کمک کند تا بفهمید کدام قسمت کند است. نتیجه پروفایل معمولاً لیستی از توابع اجرا شده و زمان اجرای آنها است.

نمایه سازی باید قبل از هر بهینه سازی برنامه انجام شود. در غیر این صورت، شما با حدس و گمان هدایت خواهید شد. به احتمال زیاد نادرست

مشکل Xdebug

Xdebug یک راه حل قدرتمند برای PHP است. اما خود پلتفرم Xdebug آنقدر سنگین است که نمی توان در سایت های زنده استفاده کرد. XDebug بار قابل توجهی بر روی منابع سرور ایجاد می کند و سرعت برنامه را کاهش می دهد.

از سوی دیگر، مشکلات موجود در یک سایت زنده ممکن است کاملاً با مشکلات موجود در یک محیط توسعه متفاوت باشد. نمایه سازی فقط در رایانه های توسعه دهنده تنها بخشی از مشکلات را نشان می دهد.

به همین دلیل است که راه حل توسعه یافته است پروفسور XH. برای استفاده در برنامه های در حال اجرا در نظر گرفته شده است. ایده اصلی این پروفایلر ایجاد حداقل بار روی برنامه و در عین حال جمع آوری تمام داده های لازم در مورد سرعت عملکرد است. این راه حل توسط بچه های فیس بوک توسعه داده شده است و توسط نسخه های جدید PHP پشتیبانی می شود.

پروفسور XH

نصب و راه اندازی

در دبیان XHprof در بسته های sid است، بنابراین: apt-get xhprof را نصب کنید

شما همچنین می توانید XHprof را خودتان بسازید.

فعال کردن پروفایل

فرض کنید یک اسکریپت با کد زیر داریم:

اجرا ();

بیایید پروفایل را با استفاده از XHprof انجام دهیم. برای انجام این کار در این صفحه شما نیاز دارید:

  1. نمایه ساز را در همان ابتدا فعال کنید.
  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");

# کد جدید گزارش را برای استفاده در رابط کاربری گرافیکی ذخیره می کند

رابط برای گزارش

برای مشاهده گزارش، باید میزبان مجازی را در پوشه /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_FILEro SCRIPT_FILEroot$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 به طور مستقیم در تولید استفاده کنید.

FirePHP یک افزونه برای firebug است که در ارتباط با کلاس php کوچک خود، به شما امکان می دهد داده ها را از php، به عنوان مثال، انواع var_dump و سایر اطلاعات اشکال زدایی، به کنسول firebug پخش کنید. مزیت اصلی این برنامه افزودنی این است تمام اطلاعات اشکال زدایی از طریق هدرها پخش می شود و صفحات را پر نمی کند و منطق برنامه را به هیچ وجه نقض نمی کند: http://firephp.org/.

ایده اصلی

الگوریتم کلی پروفایل به شرح زیر است:
  1. در ابتدای صفحه، پروفایل را با استفاده از xhprof_enable() فعال می کنیم.
  2. در انتهای صفحه، نمایه سازی را با استفاده از xhprof_disable() خاموش کنید و داده های جمع آوری شده را با استفاده از save_run() ذخیره کنید.
  3. در مرحله بعد، با استفاده از کلاس firephp php، پیوندی به داده های پروفایل را به قسمت مشتری ارسال می کنیم
  4. در کنسول firebug اطلاعات مورد نیاز خود را باز می کنیم
  5. ما خوشحالیم :)
همچنین می خواهم بگویم که البته اضافه کردن دستی این توابع به اسکریپت های PHP شما عالی است. اما من می خواهم این اطلاعات همیشه در طول توسعه در دسترس باشد و در سرورهای تولید قرار نگیرد. ما این مشکل را به صورت زیر حل می کنیم:

در پروژه‌های ما، تقریباً در همه اسکریپت‌ها، یک فایل کاری با کلاس لودر، توابع اتصال و سایر موارد ضروری در ابتدا متصل است. بنابراین، درج پروفایل در این فایل قرار دادیم. و برای اینکه بتوانیم حالت اشکال زدایی را به دلخواه روشن/خاموش کنیم، یک بررسی برای ثابت پیکربندی اضافه کردیم، به علاوه این بررسی ها را در برخی متا تگ ها قرار دادیم که به طور خودکار هنگام ساخت پروژه حذف می شوند. همین امر در مورد غیرفعال کردن پروفایل و نوشتن اطلاعات در هدرها با استفاده از firephp نیز صدق می کند - این کارها با یک تابع حل می شوند که در انتهای هر اسکریپت PHP فراخوانی می شود و همچنین در متا تگ ها پیچیده می شود. چیزی شبیه این به نظر می رسد:

// ثابت های زیر در فایل پیکربندی برنامه نوشته شده است

/** نحوه عملکرد محیط * */
define("APPLICATION_ENV" , "dev" ); // dev - اشکال زدایی | طرفدار تولید
/** مسیر به نمایه ساز */
define("XHPROF_ROOT" , __DIR__ . "/ExtProcs/debug/xhprof-0.9.2");

/***************************************************************************************
* در مرحله بعد، در فایلی که در ابتدای هر اسکریپت بارگذاری می شود، پروفایل سازی را راه اندازی می کنیم
* DEV_START و DEV_END متا تگ های ما هستند، همه چیز بین آنها در طول مونتاژ قطع می شود
***************************************************************************************/

//-- DEV_START
//-- در حالت اشکال زدایی، کتابخانه های اشکال زدایی را به هم وصل می کنیم

// بارگذاری firephp
require_once(__DIR__ . "/includes/ExtProcs/debug/firephp/FirePHP.class.php");
//-- پروفایلر را بارگیری کنید
"/xhprof_lib/utils/xhprof_lib.php");
require_once(XHPROF_ROOT. "/xhprof_lib/utils/xhprof_runs.php");
// نمایه سازی را با پرچم های لازم آغاز کنید. شرح دقیق پرچم ها
// را می توان در php.net/manual/ru/xhprof.constants.php یافت
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY)؛
}
//-- DEV_END

// خب این تابع در انتهای هر اسکریپت فراخوانی می شود
// تماس آن نیز در DEV_START و DEV_END پیچیده شده است

/**
* پیوندی به نتیجه پروفایل ایجاد کنید و آن را در کنسول نمایش دهید
*/
تابع dev_boot_Down() (
اگر (APPLICATION_ENV === "dev") (
// نمونه firephp را راه اندازی کنید
$firephp = FirePHP::getInstance(true);
// پروفایل را خاموش کنید و داده ها را ذخیره کنید
$xhprof_data = xhprof_disable();
$xhprof_runs = جدید XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testing" );
// یک پیوند به داده های پروفایل ایجاد کنید و آن را در کنسول بنویسید
$link = "http://" . $_SERVER["HTTP_HOST" ] . "/includes/ExtProcs/debug/xhprof-0.9.2/xhprof_html/index.php?run=($run_id)&source=xhprof_testing\n";
$firephp->info($link, "Profiling Data" );
}
}


* این کد منبع با برجسته کننده کد منبع برجسته شده است.

من در مورد نصب این افزونه ها وارد جزئیات نمی شوم، زیرا همه چیز در اینجا ساده است. من فقط در مورد برخی از جنبه های تنظیم می گویم. xhproof تنها یک متغیر پیکربندی دارد - xhprof.output_dir، که به پوشه ای اشاره می کند که داده های پروفایل ذخیره می شود. بنابراین، مطمئن شوید که کاربری که اسکریپت‌های PHP تحت آن اجرا می‌شوند، دارای حقوق نوشتن در دایرکتوری مشخص شده است. بنابراین چیزی شبیه به این را در php.ini خود بنویسید:


extension=xhprof.so
xhprof.output_dir="/var/tmp/xhprof"

همچنین ایده خوبی است که چیزی مانند نقطه یا Graphviz را برای ترسیم نمودار تماس نصب کنید. من Graphviz را در MacOS X دارم.

پس از تکمیل مراحل توضیح داده شده در بالا، ما قادر به باز کردن و مشاهده پروفایل هر یک از اسکریپت های خود به طور مستقیم در هر زمان در مرورگر هستیم.

نحوه نصب و پیکربندی xdebug را نشان می‌دهد و برخی از ویژگی‌های اساسی را پوشش می‌دهد، مانند بهبود خروجی تابع var_dump() یا چاپ ردیابی پشته تماس هنگام دریافت پیام خطا. در قسمت دوم به این ویژگی xdebug به عنوان ردیابی نگاه کردیم. ردیابی شامل همه فراخوانی‌ها به توابع و روش‌های موجود در برنامه، زمان راه‌اندازی، اندازه حافظه اختیاری، پارامترهای ارسال شده و بازگشتی است. گزارش ردیابی می تواند به شما در درک مسیر اجرای یک برنامه پیچیده کمک کند. به جای درج کد اشکال زدایی در داخل برنامه، ردیابی را در جایی که لازم است روشن یا خاموش می کنید و سپس از ابزارهایی مانند grep یا برنامه های کاربردی PHP خود برای تجزیه و تحلیل فایل log استفاده می کنید.

در این مقاله به بررسی پروفایل می پردازیم. در نگاه اول، پروفایل شبیه به ردیابی است. گزارش پروفایل برای انسان در نظر گرفته نشده است، هدف آن تجسم جریان یک برنامه نیست، اما داده هایی را برای تجزیه و تحلیل آماری یک برنامه در حال اجرا در اختیار ما قرار می دهد.

ایجاد یک گزارش پروفایل

در زیر گزیده ای کوتاه از گزارش پروفایل ایجاد شده توسط 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 می نویسد. اگر از ویندوز استفاده می کنید، باید 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» است. به علاوه شناسه فرآیند درست مانند مورد Trace log، می توانید با افزودن تنظیمات مناسب به 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 است که یک برنامه اشکال زدایی و پروفایل نرم افزار برای لینوکس است. Cachegrind برای تجزیه و تحلیل آمار حافظه نهان، استفاده از حافظه و دستورات برنامه طراحی شده است. یکی دیگر از ابزارهای Valgrind، Callgrind، نمودارهای تماس را ترسیم می کند. با توجه به PHP، ما می توانیم از این برنامه برای تجسم و تجزیه و تحلیل گزارش پروفایل استفاده کنیم.
ابزاری که معمولا برای تجزیه و تحلیل گزارش پروفایل تولید شده توسط xdebug استفاده می شود نامیده می شود. KCachegrind یک نرم افزار رایگان است که تحت مجوز GPL (فقط بر روی سیستم های یونیکس کار می کند). با این حال، یک برنامه ساده برای ویندوز وجود دارد که آن هم رایگان است. ابتدا به نسخه ویندوز نگاه می کنیم.

WinCacheGrind: تجزیه و تحلیل گزارش های پروفایل در ویندوز

نسخه فعلی (در زمان نگارش نویسنده این مقاله) WinCachegrind 1.0.0.12 است. این نسخه به سال 2005 برمی گردد و این بدان معناست که WinCachegrind مدت زیادی است که توسعه نیافته است. اگر به یادداشت های انتشار نگاه کنید، نویسندگان می نویسند که برنامه دارای اشکالاتی است که گاهی اوقات باعث می شود رفتار عجیبی داشته باشد.
بنابراین، توصیه می کنم از KCachegrind استفاده کنید، که بر اساس یک ماشین مجازی در آخرین توزیع لینوکس راه اندازی شده است، به عنوان مثال اوبونتو (یادداشت مترجم، به طور کلی، توصیه عجیبی است؛ در این مورد، توصیه می کنم فقط لینوکس را نصب کنید، نه حصار در باغ ماشین های مجازی). تعداد زیادی ماشین مجازی تحت ویندوز موجود است. اگر به دلایلی امکان استفاده از یونیکس یا ماشین مجازی وجود ندارد، می توانید به استفاده از WinCachegrind برای تجزیه و تحلیل گزارش پروفایل ساده ادامه دهید. WinCachegrind برخلاف KCachegrind نمودار تماس را ترسیم نمی کند.
نصب Wincachegrind بسیار آسان است. نصب کننده را اجرا کنید، روی دکمه پذیرش مجوز کلیک کنید و نصب کامل شد. اکنون می توانید برنامه را اجرا کنید و یکی از گزارش های پروفایل cachegrind ایجاد شده توسط xdebug را باز کنید.

با کلیک بر روی ساعت یا نماد سیگما، می توانید بین نمایش اطلاعات در مقادیر مطلق و درصد سوئیچ کنید. نمایش درصد نشان می دهد که به عنوان درصدی از کل زمان، چه مقدار زمان برای فراخوانی یک تابع در یک بلوک معین طول می کشد.
دو تنظیمات مفید عبارتند از Profiler -> Hide Fast Functions و Profiler -> Hide Library Functions. سوئیچ اول توابعی را پنهان می کند که سهم زمانی آنها در زمان اجرای کلی برنامه ناچیز است.
تنظیم دوم، Profiler -> Hide Library Functions، توابع ساخته شده در PHP را از تجزیه و تحلیل عمومی پنهان می کند. وقتی هر دوی این تنظیمات فعال هستند، داده‌های کمتری می‌بینید و به شما امکان می‌دهد روی قسمت‌هایی از کدتان که نیاز به بهینه‌سازی دارند تمرکز کنید.
پنجره اصلی شامل دو تب است: خط به خط و کلی. هر دو تب اطلاعات یکسانی را نشان می‌دهند، اما برگه Overall اطلاعات را برای ارائه بهتر جمع‌آوری می‌کند. Self time زمان اجرای کد را در بلوک فعلی نشان می دهد، در حالی که زمان تجمعی (Cum.) کل زمان اجرای توابع در بلوک داده شده را نشان می دهد.

KCacheGrind: تجزیه و تحلیل لاگ های پروفایل در یونیکس

نسخه یونیکس 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، می توانید کد خود را بدون تغییر آن اشکال زدایی کنید، نقاط شکست را تنظیم کنید، از بخش های کد عبور کنید و ببینید که متغیرها چگونه و کجا مقادیر را تغییر می دهند.

نصب xhprof برای php:

Sudo apt-get php5-xhprof را نصب کنید

راه اندازی مجدد آپاچی:

راه اندازی مجدد سرویس Sudo apache2

چاپ phpinfo(); و بررسی کنید که آیا ماژول متصل است یا خیر؟

ما /etc/php5/apache2/conf.d را بررسی می کنیم تا ببینیم آیا پیوندی به پیکربندی xhprof.ini در آنجا ظاهر می شود یا خیر.

اگر نه، پس خودتان لینک را ایجاد کنید و آپاچی را ریستارت کنید.

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);
// کد پروفایل # توقف نمایه ساز $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

این همان چیزی است که تجزیه و تحلیل پروفایل به نظر می رسد. این جدول تمام فراخوانی های تابعی را که پروفایل شده اند نمایش می دهد.

ما می توانیم توابع را با کلیک بر روی عناوین جدول مرتب کنیم.

وقتی می بینیم که یک تابع چند بار یا برای مدت طولانی اجرا می شود، می توانیم روی این تابع کلیک کنیم و جدول مشابهی باز می شود اما با فراخوانی های داخلی در داخل تابع مورد نظر و محیط والد که تابع در آن فراخوانی شده است.

شاخص ها:
شرکت توتال Wall Time (زمان صرف شده برای اجرای توابع، با در نظر گرفتن انتظار برای پاسخ از سوکت ها، سیستم فایل و سایر منابع)
شرکت توتال CPU (زمان صرف شده برای اجرای توابع)
شرکت توتال MemUse (مصرف حافظه)
شرکت توتال PeakMemUse (بهترین استفاده از حافظه)
تعداد تماس های تابع

همچنین امکان نمایش گرافیکی گزارش نیز وجود دارد. اما برای انجام این کار، باید مطمئن شوید که کتابخانه graphviz را نصب کرده اید:

Apt-get graphviz را نصب کنید

سپس در نمایه خود باید برای نمایش و voila کلیک کنید:

اکنون می توانید کد را تجزیه و تحلیل و بهبود دهید.

بررسی کنید