قائمة طعام
مجاني
التسجيل
الصفحة الرئيسية  /  التثبيت والتكوين/ ملفات تعريف تخيلية php. التنميط وتصحيح أخطاء تطبيقات php باستخدام xhprof

ملفات تعريف تخيلية php. التنميط وتصحيح أخطاء تطبيقات php باستخدام xhprof

التنميط كود PHP

عاجلاً أم آجلاً ، يواجه كل منا رمزًا قديمًا وتحسينه. مصحح الأخطاء وملف التعريف في مثل هذه الحالة - أفضل المساعدينمبرمج. بالنسبة لأولئك الذين يعملون مع PHP ، بفضل Derick Rethans ، هناك أداة جيدة - xDebug. هناك الكثير من المعلومات حول xDebug حتى في Runet ، لذلك لن تتناول هذه المقالة هذا الموضوع.

بعد أن عثرت على ذكر ملف تعريف لـ PHP ، فكرت على الفور في xDebug (لقد نسيت منذ فترة طويلة أدوات الملكية من Zend) ، لكن هذه المرة كنت مخطئًا - سنتحدث عن XHProf.
XH

تم تطوير ملف التعريف هذا خصيصًا لـ Facebook و مصدرتم افتتاحه في مارس 2009.

تم التثبيت بسرعة وسلاسة.
wget pecl.php.net/get/xhprof-0.9.2.tgz
القطران xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2 / extension /
phpize
./configure && make && قم بالتثبيت
cd /usr/local/etc/php.d/
فيم xhprof.ini
مؤتمر نزع السلاح / دولار / محلي /
فيم header.php
vim footer.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 / extension / no-debug-non-zts-20090626 / xhprof.so
xhprof.output_dir = "/ home / max / www / profile /"

Prof.my.conf - nginks config - أكثر المعايير القياسية.

الخادم (
استمع 80
server_name prof.my ؛
محارف utf8 ؛

الجذر /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) ،
}
}

تذييل. php
if (isset ($ _ COOKIE ["xhprof"])) (
إذا (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 عبر الويب ونرى في الزاوية اليسرى العليا رابطًا لإخراج ملف التعريف - هذا ما تم إنشاء مضيفي الأستاذ من أجله.

يرجى ملاحظة - أنا أستخدم التحقق لـ COOKIE! من خلال هذا التحقق ، يمكنك استخدام ملف التعريف بأمان على خادم الإنتاج - على بيانات حقيقية وعلى حمل حقيقي.

تعرض واجهة الويب الخاصة بملف التعريف تسميات تحتوي على معلومات حول كل وظيفة وتبلغ عن المعلومات التالية:

  • عدد المكالمات لكل وظيفة
  • Wall-time ، الوقت المستغرق في تنفيذ الوظائف (بما في ذلك انتظار الاستجابات من المقابس ونظام الملفات وما إلى ذلك).
  • وقت وحدة المعالجة المركزية (CPU) ، الوقت المستغرق في تنفيذ الوظائف (باستثناء انتظار الاستجابات من المقابس ونظام الملفات وما إلى ذلك).
  • استخدام الذاكرة
  • ذروة استخدام الذاكرة

من الممكن فرز الجدول بأي من المعلمات

تنقسم المعلومات المتعلقة بكل وظيفة إلى نوعين آخرين شامل وحصري. يشمل Inclusive الأرقام المستخدمة في مكالمات الأطفال ، بينما لا يشمل Exclusive الأرقام المستخدمة في مكالمات الأطفال. من الممكن أيضًا ، بالنقر فوق اسم الوظيفة ، الاطلاع على معلومات عنها فقط والوظائف التي تم استدعاؤها منها والتي تم استدعاؤها إليها.

إذا تم تثبيت GraphViz على النظام ، فسيقوم المحلل برسم رسم بياني للمكالمة.

ملاحظة. بدون كسر التقاليد: هذه أول مشاركة لي على habr.

محدث: إعادة النشر في PHP.

بمساعدة أنظمة التنميط ، يمكنك جمع معلومات حول الوظائف في كود php التي تستهلك وقتًا أطول للمعالج وذاكرة الوصول العشوائي ، أي تحديد الأماكن الأبطأ والأكثر كثافة للذاكرة في برنامج 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 / إلخ /php5/conf.d/xhprof.ini إعادة تشغيل apachectl

توجد الملفات المطلوبة للعمل في الدليل / usr / share / php... ومع ذلك ، ليس كل شيء ، ولكن فقط مع كود php. يتطلب jquery و css لعرض التقارير بشكل صحيح. يمكن الحصول عليها من المستودع على جيثب:

Git clone https://github.com/facebook/xhprof.git

بعد ذلك ، أضف السطر إلى كود php-script في المكان الذي يجب أن يبدأ فيه جمع البيانات:

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") ؛ صدى "تقرير: http: //domain.tld/xhprof_html/index.php؟ run = $ run_id & source = xhprof_test" ؛ صدى "\ n" ؛

في النسق $ run_idتشير علامات الاقتباس إلى اسم ملف التعريف ، والذي يمكن تعيينه بشكل تعسفي.

تبدو النتيجة المعالجة كما يلي:

إذا قمت بتحديد المعلمة XHPROF_FLAGS_NO_BUILTINS، ثم يمكنك أن ترى أن عدد استدعاءات الوظائف قد انخفض بشكل كبير:

يوفر الجدول المعلومات التالية:

المكالمات- عدد استدعاءات الوظائف ،
ساعة الجدار- إجمالي وقت تشغيل الوظيفة ، بما في ذلك وقت انتظار الاستجابة من الموارد الخارجية ،
وحدة المعالجة المركزية- كم من الوقت تم إنفاقه على وظائف المعالجة ،
MemUse- مقدار ذاكرة الوصول العشوائي المستخدمة ،
استخدام PeakMem- ذروة استهلاك الذاكرة.

المعدلات هي:

بما في ذلك- شامل - مع مراعاة نداءات الوظائف الأخرى من هذه الوظيفة ،
غير شامل- حصري - باستثناء استدعاءات الوظائف.

بالإضافة إلى ذلك ، يتم عرض معلومات حول إجمالي وقت المعالجة والذاكرة المستخدمة وعدد استدعاءات الوظائف أعلى الجدول.

أيضا XHيسمح لك بإنشاء تقارير تفاضلية بين تشغيلين ، والتي يشار إليها باللون الأحمر والأخضر. باستخدام هذه التقارير ، يمكنك الحصول على صورة واضحة للتحسينات بعد كل تغيير في التعليمات البرمجية.

للحصول على مثل هذا التقرير ، تحتاج إلى استخدام رابط النموذج:

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

أين run_id1و run_id2- معرفات الإطلاق.

إذا قمت بتثبيت ملفات جراففيز:

Aptitude تثبيت Graphviz

أيضًا بالنسبة لملف التعريف php xhprof ، توجد واجهات ويب لجهات خارجية تستخدم قواعد البيانات:

xDebug

xDebugهو مصحح أخطاء كود PHP مكتوب بواسطة Derick Rethans.

التركيب:

Yum تثبيت 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 الذي يجب استنساخه من جيثب:

استنساخ Git https://github.com/jokkedk/webgrind.git

سيتم إنشاء دليل webgrind، والتي تحتاج إلى نسخها إلى دليل أي موقع والوصول إليه من المتصفح. علاوة على ذلك ، فإن الرسوم البيانية في ملف التكوين تعمل في دبيان config.phpتحتاج إلى تصحيح المسار إلى الملف القابل للتنفيذ جراففيز... يجب أن تبدو هذه:

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

بالإضافة إلى ذلك ، يمكنك تصحيح المنطقة الزمنية:

Static $ defaultTimezone = "Europe / Moscow"؛

في الرأس ، يمكنك تحديد ملف تعريف وتحديد المربع إذا كنت تريد مراعاة الوظائف المضمنة. في الجدول نفسه ، يمكنك رؤية الوظائف وعدد المكالمات ووقت تشغيل الوظيفة نفسها والوقت مع مراعاة وقت الانتظار. للتعمق في الوظائف ، ما عليك سوى النقر على السهم الثلاثي. في حالتي ، مع وجود ملفات تعريف كبيرة بما يكفي (من عدة ميغا بايت) ، كان توقع النتيجة مرتفعًا بشكل غير ضروري. ربما ، من الأفضل استخدام برامج العارض المحلية لملفات التعريف الكبيرة بدرجة كافية.

قد يبدو الرسم البياني كالتالي:

لاحظ أن webgrindلا يجب استخدامه على خوادم الإنتاج ، حيث لا يتم توفير إذن ، ولكن في نفس الوقت هناك وصول إلى رمز الملفات في php. استخدم على الأقل ترخيص Apache الأساسي إذا لزم الأمر.

هناك أيضًا برامج لتحليل ملفات التعريف مثل نظام Linux:

حول التنميط

يمكن أن تساعدك بيانات الملف الشخصي على تحسين تطبيقك ، أي تحقيق أهداف معينة ، على سبيل المثال ، تقليل استهلاك الذاكرة ، وتقليل وقت إنشاء الصفحات ، وما إلى ذلك.

المعلومات الموجودة في ملف التعريف هي نقطة البداية في التحسين: فهي تخبرنا بمدة إنشاء النتيجة ، ومقدار الذاكرة المستخدمة وعدد استدعاءات الوظائف التي يتم إجراؤها. باستخدام بيانات أكثر تفصيلاً ، يمكنك تحسين هذه المقاييس.

على سبيل المثال ، إذا كنت تستخدم إطار عمل ، فإن استخدام بعض وظائف إطار العمل قد يؤدي إلى استدعاء العديد من الوظائف الأساسية. إذا كنت تقرأ بعض البيانات عدة مرات ، فقد يكون من المفيد حفظ النتيجة في متغير.

أيضًا ، يمكن أن يساعدك ملف التعريف في فهم مكان استخدام التخزين المؤقت لـ PHP ، على سبيل المثال ، استخدام APCuأو memcached.

بادئ ذي بدء ، يجدر تحسين الوظائف التي تستغرق معظم الوقت في التنفيذ. بعد تحسين كل شيء ويبدو أنه لا يوجد شيء آخر لتحسينه ، فإن الأمر يستحق فرز الوظائف حسب عدد المكالمات والعمل على خفضها. حتى لو كانت PHP سريعة ، فمن الجدير التفكير فيما إذا كنت بحاجة إلى استدعاء الوظائف في كثير من الأحيان؟

عندما تواجه المواقف التالية ، يجدر التفكير في التخزين المؤقت:

  • تسمى الوظائف الثابتة داخل الحلقة ،
  • يتم إنشاء بعض المحتوى مرتين ،
  • يتم إنشاء المحتوى الذي لا يتغير في كل مرة ،
  • يتم إنشاء المحتوى حتى لو لم يتم استخدامه.

لا يجب تخزين كل شيء في ذاكرة التخزين المؤقت ، حيث تعد الذاكرة أيضًا مصدرًا قيمًا. تخزين البيانات التي تصل إليها باستمرار. أيضًا ، لا يكون التخزين المؤقت منطقيًا إذا كان التخزين المؤقت يهدر موارد أكثر مما يوفر.

بالإضافة إلى التخزين المؤقت في التعليمات البرمجية الخاصة بك ، لا تنس التخزين المؤقت باستخدام خادم الويب () ، وكذلك من جانب العميل. باستخدام الرؤوس الصحيحة ، يمكن حل العديد من الطلبات قبل وصولها إلى الخادم.

بمرور الوقت ، يواجه أي مبرمج PHP مشكلة الأداء الضعيف لتطبيقه. قد يكون هذا تحميلًا بطيئًا لصفحة معينة أو استجابة طويلة جدًا من واجهة برمجة التطبيقات. وأحيانًا يكون من الصعب فهم سبب استخدام المكابح؟ تحدث أحيانًا مواقف أكثر صعوبة: في خادم الإنتاج ، تكون واجهة برمجة التطبيقات بطيئة جدًا ، ولكن في المنصة حيث يتم التطوير ، كل شيء على ما يرام. واذهب واكتشف الخطأ. تصحيح الأخطاء على خادم الإنتاج هو حالة من اليأس الشديد ، والتي ، بالطبع ، من الأفضل تركها دون رادع.

تم اختراع أدوات خاصة تسمى ملفات تعريف التطبيق لهذه المواقف. في عالم PHP ، يتم لعب هذا الدور بواسطة xDebug وكذلك xhprof. xhprof هي أداة أخف وأبسط وأكثر مرونة ولذلك فهي مفضلة. ومن المثير للاهتمام ، أن xhprof تم تطويره بواسطة facebook مرة أخرى في عام 2009 ، ولكن لا يوجد حتى الآن دعم رسمي لـ php7 ولن يكون كذلك منذ أن تحول facebook إلى HHVM. ومع ذلك ، وبفضل المجتمع الكبير لمطوري php ، ظهرت مفترق يدعم php7 ، ولا يسبب تثبيته أي صعوبات.

التركيب

تحتاج أولاً إلى تثبيت xhprof بالفعل:

Git clone https://github.com/longxinH/xhprof xhprof cd xhprof / extension phpize ./configure --with-php-config = / usr / bin / php-config sudo make && sudo make install mkdir / var / tmp / xhprof

الامتداد = xhprof.so xhprof.output_dir = "/ var / tmp / xhprof"

يجب أن يكون للمجلد / var / tmp / xhprof حق وصول للكتابة ، لأن سيتم حفظ نتائج التنميط هناك.

يمكنك إعادة تحميل PHP-FPM والتحقق من تثبيت الامتداد. إنها مبتذلة ، يمكن إجراؤها باستخدام إخراج الدالة phpinfo () ؛

xhprof مثبت ، يمكنك استخدامه. تتضمن حزمة xhprof واجهة سهلة الاستخدام للغاية لتحليل تقارير التنميط. يسمح لك xhprof بإنشاء تقارير ، سواء في شكل نصي أو رسومي. يحتوي مجلد تثبيت xhprof على xhprof_html و xhprof_lib الذي نحتاجه. مجلد Xhprof_html - يوفر الوصول إلى واجهة المستخدم الرسومية. xhprof_lib مكتبة لعرض وتحليل الكود. يُنصح بنقل مجلد xhprof بالكامل إلى / var / www / xhprof وتكوين مضيف افتراضي له ، على سبيل المثال xhprof.loc. مثال على nginx:

الخادم (استمع 80 ؛ server_name xhprof.loc ؛ charset utf-8 ؛ root / var / www / xhprof / xhprof_html ؛ index.php ؛ الموقع / (try_files $ uri $ uri / /index.php؟q=$uri&$args ؛) الموقع ~ \ .php (fastcgi_pass 127.0.0.1:9000؛ fastcgi_split_path_info ^ (. + \. php) (/.+) $؛ fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name؛ include fastcgi_params؛))

تحتاج أيضًا إلى تذكر تحديث ملف المضيفين الخاص بك. الآن ، عندما ندخل عنوان URL xhprof.loc في المتصفح ، سننتقل إلى واجهة الويب الخاصة بملف التعريف ، حيث سيتم الوصول إلى الملفات التي تم إنشاؤها بواسطته.

الآن يمكنك البدء في تحديد الكود الخاص بك مباشرة.

لتمكين منشئ ملفات التعريف ، استخدم الدالة xhprof_enable () ، والتي تأخذ العلامات التالية كمدخلات:

  • XHPROF_FLAGS_CPU - لإصلاح إحصائيات المعالج ؛
  • XHPROF_FLAGS_MEMORY - للذاكرة ؛
  • XHPROF_FLAGS_NO_BUILTINS - لتجاهل الوظائف المضمنة.

لتعطيل منشئ ملفات التعريف ، استخدم الدالة xhprof_disable (). للراحة ، دعنا نكتب نصين header.php و footer.php يؤديان هذه الوظائف. يتم تضمين header.php في بداية البرنامج النصي الذي تم عرض ملف تعريفه ، ويكون footer.php في النهاية. يتعامل footer.php أيضًا مع حفظ بيانات التوصيف.

header.php: if (extension_loaded ("xhprof")) (include_once "/var/www/xhprof/xhprof_lib/utils/xhprof_lib.php" ؛ include_once "/var/www/xhprof/xhprof_lib/utils/xhpprof_runs.phable XHPROF_FLAGS_CPU) ؛) footer.php: if (extension_loaded ("xhprof")) ($ profilerNamespace = "PROFILED_SCRIPT_NAME_ HERE" ؛ $ xhprofData = xhprof_shprofRunIsable () ؛ ($ xhprofDatap ، $) profiler
إستعمال

بعد توصيل header.php و footer.php بالبرنامج النصي الموصوف ، يمكنك البدء: عند تنفيذ البرنامج النصي الذي تم تحديده ، سيتم إنشاء ملف سيتم حفظه في الدليل / var / tmp / xhprof يحتوي على معلومات حول تشغيل البرنامج النصي. عند فتح واجهة الويب xhprof.loc ، سيكون هذا الملف الذي تم إنشاؤه متاحًا:


عندما تفتح ملف التوصيف ، تظهر معلومات مفصلة حول تشغيل التطبيق ، مكدس الاستدعاءات بأكمله:


ماذا تعني الأعمدة:

  • المكالمات- عدد ونسبة مكالمات الوظائف ؛
  • بما في ذلك. ساعة الجدار- وقت تنفيذ دالة ذات وظائف متداخلة ؛
  • غير شامل. ساعة الجدار- وقت تنفيذ وظيفة بدون وظائف متداخلة ؛
  • بما في ذلك. وحدة المعالجة المركزية- وقت المعالج مع الوظائف المتداخلة ؛
  • غير شامل. وحدة المعالجة المركزية- وقت وحدة المعالجة المركزية بدون وظائف متداخلة ؛
  • بما في ذلك. MemUse- استهلاك الذاكرة مع الوظائف المتداخلة ؛
  • غير شامل. MemUse- استهلاك الذاكرة بدون وظائف متداخلة ؛
  • بما في ذلك. استخدام PeakMem- الحد الأقصى من استهلاك الذاكرة مع الوظائف المتداخلة ؛
  • غير شامل. استخدام PeakMem- الحد الأقصى لاستهلاك الذاكرة بدون وظائف متداخلة.

إذا اتبعت الرابط ، فسترى شجرة مكالمات جميلة مع إشارة مرئية للشفرة الأكثر تثبيطًا. إذا لم يحدث هذا ، فأنت على الأرجح بحاجة إلى تثبيت مكتبة Graphviz:

Apt-get install Graphviz

مثال على الرسم البياني:

في حالتي ، فإن عنق الزجاجة هو التفاعل مع قاعدة البيانات.


استخدام xhprof على خادم الإنتاج

في البداية ، تم تطوير xhprof خصيصًا لغرض تحديد الكود في المعركة ، على خوادم الإنتاج. ببساطة لا توجد أداة مجانية وفعالة أخرى لتوصيف كود php7 في المعركة ، لذلك لا يوجد منافسين لـ xhprof. على وجه التحديد ، لدي خبرة في استخدام xhprof على خادم إنتاج يعالج مليون طلب يوميًا. يستخدم php7 ولم يتم العثور على أية مشاكل حتى الآن. ومع ذلك ، لا يعمل xhprof مع كل طلب - سيتم إنشاء عدد كبير جدًا من ملفات التشكيل الجانبي. يبدأ ملف التعريف الخاص بي فقط إذا احتوى الطلب على الرأس "XHPROF_ENABLE" وتم تعيينه على "صحيح". يمكنك أيضًا استخدام إستراتيجية أخرى ، على سبيل المثال ، تشغيل ملف التعريف بشكل عشوائي مع احتمال ، على سبيل المثال ، 1/1000. بعد ذلك ستكون الصورة واضحة بما فيه الكفاية أيضًا.


انتاج |

بالرغم من أن xhprof غير مدعوم رسميًا لـ php7 ، إلا أنه يظل أداة لا غنى عنها لمطوري php.

يتوفر امتداد لـ PHP يسمى Xdebug للمساعدة في تحديد سمات تطبيقات PHP ، بالإضافة إلى تصحيح أخطاء وقت التشغيل. عند تشغيل منشئ ملفات التعريف ، تتم كتابة الإخراج إلى ملف بتنسيق ثنائي يسمى "cachegrind". تتوفر التطبيقات في كل نظام أساسي لتحليل هذه الملفات. لا يلزم إجراء تغييرات في التعليمات البرمجية للتطبيق لإجراء هذا التنميط.

لتمكين التنميط ، قم بتثبيت الامتداد وضبط إعدادات php.ini. تأتي بعض توزيعات Linux مع حزم قياسية (مثل حزمة Ubuntu "s php-xdebug). في مثالنا سنقوم بتشغيل ملف التعريف اختياريًا بناءً على معلمة طلب. وهذا يسمح لنا بالحفاظ على الإعدادات ثابتة وتشغيل ملف التعريف فقط حسب الحاجة.

# إعدادات php.ini # اضبط على 1 لتشغيله لكل طلب xdebug.profiler_enable = 0 # دعونا نستخدم معلمة GET / POST لتشغيل ملف التعريف xdebug.profiler_enable_trigger = 1 # قيمة GET / POST التي سنمررها ؛ فارغ لأي قيمة xdebug.profiler_enable_trigger_value = "" # إخراج ذاكرة التخزين المؤقت للملفات / tmp حتى يقوم نظامنا بتنظيفها لاحقًا xdebug.profiler_output_dir = "/ tmp" xdebug.profiler_output_name = "cachegrind.out.٪ p"

بعد ذلك ، استخدم عميل ويب لتقديم طلب إلى عنوان URL للتطبيق الذي ترغب في تشكيله ، على سبيل المثال

http://example.com/article/1؟XDEBUG_PROFILE=1

أثناء معالجة الصفحة ، ستكتب إلى ملف باسم مشابه لـ

/tmp/cachegrind.out.12345

بشكل افتراضي ، يكون الرقم الموجود في اسم الملف هو معرف العملية الذي كتبه. هذا قابل للتكوين باستخدام إعداد xdebug.profiler_output_name.

لاحظ أنه سيكتب ملفًا واحدًا لكل طلب / عملية PHP يتم تنفيذها. لذلك ، على سبيل المثال ، إذا كنت ترغب في تحليل منشور نموذج ، فسيتم كتابة ملف تعريف واحد لطلب GET لعرض نموذج HTML. ستحتاج المعلمة XDEBUG_PROFILE إلى تمريرها إلى طلب POST اللاحق لتحليل الطلب الثاني الذي يعالج النموذج. لذلك ، عند إنشاء ملف تعريف ، يكون من الأسهل أحيانًا تشغيل curl إلى POST لنموذج مباشرةً.

تحليل المخرجات

بمجرد كتابتها ، يمكن قراءة ذاكرة التخزين المؤقت للملف الشخصي بواسطة تطبيق مثل Webgrind. يمكن أيضًا أن تعرض PHPStorm ، وهو PHP IDE شائع ، بيانات التنميط هذه.

KCachegrind ، على سبيل المثال ، سيعرض معلومات تشمل:

  • وظائف منفذة
  • وقت المكالمة بحد ذاته وشاملًا لاستدعاءات الوظائف اللاحقة
  • عدد مرات استدعاء كل وظيفة
  • استدعاء الرسوم البيانية
  • روابط لشفرة المصدر

عن ماذا تبحث

من الواضح أن ضبط الأداء خاص جدًا بحالات استخدام كل تطبيق. وبشكل عام ، من الجيد البحث عن:

  • الاستدعاءات المتكررة لنفس الوظيفة التي لا تتوقع رؤيتها. بالنسبة للوظائف التي تعالج البيانات والاستعلام عنها ، قد تكون هذه فرصًا رئيسية لتطبيقك للتخزين المؤقت.
  • وظائف بطيئة التشغيل. أين يقضي التطبيق معظم وقته؟ أفضل عائد في ضبط الأداء هو التركيز على أجزاء التطبيق التي تستهلك معظم الوقت.

ملحوظة: Xdebug ، وخاصة ميزات التنميط الخاصة به ، كثيفة الاستخدام للموارد وتبطئ تنفيذ 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 ويتم تغليفها أيضًا في علامات التعريف. تبدو هكذا:

// تتم كتابة هذه الثوابت في ملف تكوين التطبيق

/ ** وضع تشغيل البيئة * * /
تعريف ("APPLICATION_ENV" ، "dev") ؛ // dev - debug | مؤيد للإنتاج
/ ** المسار إلى ملف التعريف * /
حدد ("XHPROF_ROOT" ، __DIR__. "/ExtProcs/debug/xhprof-0.9.2");

/***************************************************************************************
* بعد ذلك ، في الملف الذي تم تحميله في بداية كل برنامج نصي ، نقوم بتشغيل ملف التعريف
* DEV_START و DEV_END هي علاماتنا الوصفية ، حيث يتم قطع كل شيء بينهما أثناء التجميع
***************************************************************************************/

// - DEV_START
// - في وضع التصحيح ، قم بتوصيل مكتبات التصحيح

// تحميل firephp
تتطلب مرة واحدة (__ DIR__. "/includes/ExtProcs/debug/firephp/FirePHP.class.php");
// - تحميل ملف التعريف
"/xhprof_lib/utils/xhprof_lib.php");
تتطلب مرة واحدة (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 (صحيح) ؛
// قم بإيقاف تشغيل التنميط وحفظ البيانات
$ 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")؛
}
}


* تم تمييز كود المصدر هذا باستخدام Source Code Highlighter.

لن أخوض في تفاصيل تثبيت هذه الإضافات ، لأن كل شيء بسيط هنا. سأقول فقط عن بعض نقاط الإعداد. يوفر Xhproof متغير تكوين واحد فقط ، xhprof.output_dir ، والذي يشير إلى المجلد حيث سيتم حفظ بيانات التنميط. لذلك ، تأكد من أن المستخدم الذي يتم تنفيذ البرامج النصية لـ php لديه أذونات الكتابة إلى الدليل المحدد. لذا ضع شيئًا كهذا في ملفك php.ini:


التمديد = xhprof.so
xhprof.output_dir = "/ var / tmp / xhprof"

كما أنه ليس من السيئ وضع شيء مثل النقطة أو Graphviz لرسم رسوم بيانية للمكالمات. لدي Graphviz تحت MacOS X.

بعد الانتهاء من الإجراءات المذكورة أعلاه ، تمكنا من فتح وإلقاء نظرة على ملف تعريف أي من البرامج النصية الخاصة بنا مباشرة في المتصفح في أي وقت.