ملف تعريف PHP. تحديد مواصفات وتصحيح تطبيقات PHP باستخدام xhprof وFirePHP

لقد أظهر كيفية تثبيت وتكوين xdebug، وغطى بعض الميزات الأساسية، مثل تحسين مخرجات الدالة var_dump() أو طباعة تتبع مكدس الاستدعاءات عند تلقي رسالة خطأ. في الجزء الثاني، نظرنا إلى ميزة xdebug هذه على أنها تتبع. يحتوي التتبع على جميع استدعاءات الوظائف والأساليب في البرنامج، ووقت بدء التشغيل، وحجم الذاكرة اختياريًا، والمعلمات التي تم تمريرها وإرجاعها. يمكن أن يساعدك سجل التتبع في فهم مسار تنفيذ برنامج معقد. بدلاً من إدراج تعليمات برمجية لتصحيح الأخطاء داخل البرنامج، يمكنك تشغيل التتبع أو إيقافه عند الحاجة، ثم استخدام الأدوات المساعدة مثل grep أو تطبيقات PHP الخاصة بك لتحليل ملف السجل.

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

إنشاء سجل التعريف

فيما يلي مقتطف قصير من سجل التوصيف الذي تم إنشاؤه بواسطة xdebug:

فلوريدا=php:داخلي
fn=php::تعريف
106 3

Fl=C:\www\drupal\includes\bootstrap.inc
fn=require_once::C:\www\drupal\includes\bootstrap.inc
1 648
cfn=php::تعريف
المكالمات=1 0 0
13 6
cfn=php::تعريف
المكالمات=1 0 0
18 4
cfn=php::تعريف
المكالمات=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=On

في 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 سهل للغاية. قم بتشغيل برنامج التثبيت، وانقر فوق الزر لقبول الترخيص واكتمل التثبيت. يمكنك الآن تشغيل البرنامج وفتح أحد سجلات ملفات التعريف التي تم إنشاؤها بواسطة xdebug.

من خلال الضغط على الساعة أو أيقونة سيجما يمكنك التبديل بين عرض المعلومات بالقيم المطلقة والنسب المئوية. تعرض شاشة النسبة المئوية مقدار الوقت المستغرق، كنسبة مئوية من إجمالي الوقت، لاستدعاء دالة في كتلة معينة.
هناك إعدادان مفيدان هما ملف التعريف -> إخفاء الوظائف السريعة وملف التعريف -> إخفاء وظائف المكتبة. يخفي المفتاح الأول الوظائف التي تكون مساهمة وقتها في إجمالي وقت تنفيذ البرنامج ضئيلة.
الإعداد الثاني، Profiler -> Hide Library Functions، يخفي الوظائف المضمنة في PHP من التحليل العام. عند تمكين كلا هذين الإعدادين، ستشاهد بيانات أقل، مما يسمح لك بالتركيز على مناطق التعليمات البرمجية التي تحتاج إلى تحسين.
تحتوي النافذة الرئيسية على علامتي تبويب: سطر بسطر وشامل. تعرض كلتا علامتي التبويب نفس المعلومات، لكن علامة التبويب الشاملة تجمع المعلومات للحصول على عرض تقديمي أفضل. يعرض الوقت الذاتي وقت تشغيل التعليمات البرمجية في الكتلة الحالية، بينما يعرض الوقت التراكمي (Cum.) إجمالي وقت تشغيل الوظائف في الكتلة المحددة.

KCacheGrind: تحليل سجلات ملفات التعريف في Unix

يوفر إصدار Unix من KCachegrind وظائف أكثر من WinCachegrind. يقوم KCachegrind بتصور البيانات وإنشاء رسم بياني للاتصال.
لبدء استخدامه، تحتاج إلى تثبيت KCachegrind. النسخة الحالية . يتوفر إصدار أحدث (0.10.1)، ولكنه جزء من حزمة Valgrind.
إذا أمكن، استخدم مدير الحزم لتثبيت حزمة KCachegrind. يستخدم KCachegrind GraphViz لرسم الرسوم البيانية للاتصال، لذا يجب عليك أيضًا تثبيت حزمة GraphViz إذا لم يقم مدير الحزم لديك بتثبيت الحزم التابعة تلقائيًا.
إذا لم تجد الحزمة الثنائية KCachegrind، فستحتاج إلى تجميع KCachegrind بنفسك. بعد تنزيل المصادر، قم بتشغيل

./configure --prefix=/opt/kde3
يصنع
قم بالتثبيت

كما تلاحظ، أنت بحاجة إلى تحديد المسار إلى التثبيت الحالي لمكتبة كيدي. إذا كنت لا تعرف مكان وجود مكتبات KDE على نظامك، فاستخدم

لعرض المسار إلى مكتبات كيدي.
بمجرد التثبيت، يمكنك تشغيل KCacheGrind من سطر الأوامر

العرض الجدولي للبيانات في KCachegrind يشبه إلى حد كبير WinCachegrind. يمكنك أيضًا التبديل بين القيم المطلقة والنسبة المئوية. بعض ميزات KCachegrind غير مصممة لـ PHP. الصورة أدناه توضح الرسم البياني للاتصال لبرنامج phpMyAdmin:


كما ترون، تم قضاء معظم وقت بدء التشغيل داخل common.inc.php. تعرض لقطة الشاشة التالية تصورًا لاستدعاءات الوظائف داخل common.inc.php:

تعمل كتلة التعليمات البرمجية هذه مرتين، وهو ما يمثل نصف الوقت الذي يستغرقه تشغيل common.inc.php. سيؤدي النقر المزدوج على أي مستطيل إلى التعمق في تحليل البيانات.

تحسين الكود بناءً على بيانات ملفات التعريف

قم دائمًا بتعريف تطبيقاتك قبل التحسين. يمكنك البدء في التحسين بنفسك، في المكان الذي يبدو لك فيه أن هذا التحسين سيحدث تأثيرًا، لكن هذا ليس صحيحًا دائمًا. يؤثر التحسين بشكل أساسي فقط على الأجزاء التي تستغرق معظم الوقت في عملية التنفيذ.
إذا كنت تقوم بتشغيل عدة نسخ من برنامج ما في نفس الوقت، فقد تظل بحاجة إلى تحسين الجزء من برنامجك الذي يشغل معظم وقت التنفيذ. في هذه الحالة، لن يؤدي التحسين إلى جعل خدمة طلب فردي واحد أسرع، ولكنه سيسمح لخادمك بمعالجة الأحمال العالية مع استهلاك موارد أقل لخدمة تلك الطلبات.
عند النظر إلى فترات تشغيل ملف التعريف، ضع في اعتبارك أن القيم المطلقة أقل أهمية من القيم النسبية. قد تختلف القيم المطلقة المقاسة على أنظمة مختلفة. ومع ذلك، قبل البدء في تحسين التعليمات البرمجية الخاصة بك، ضع في اعتبارك الأمور التالية.
إحدى القواعد المهمة في التحسين هي تقليل عدد عمليات الإدخال/الإخراج. تستغرق بعض عمليات الإدخال/الإخراج وقتًا طويلاً مقارنة بالحسابات. يمكن أن يكون تقليل مثل هذه العمليات وسيلة فعالة جدًا لتسريع برنامجك. يمكن أن تؤدي إزالة مكالمة إدخال/إخراج واحدة إلى توفير تحسين أكثر فعالية من قضاء الكثير من الساعات في تحسين التعليمات البرمجية. ولذلك، يجب عليك التركيز على عمليات الإدخال/الإخراج أولاً قبل البدء في البرمجة.
يمكنك أيضًا زيادة عدد خوادمك قبل التحسين. يمكنك شراء واحدة ضخمة، مما سيعطيك زيادة طفيفة في الإنتاجية. وقت التطوير أغلى من سعر الخادم الجديد. وإذا قمت بزيادة كمية الأجهزة، يمكنك التأكد من أنك ستحصل على الزيادة على الفور دون أي تأثير على كود PHP. عندما يقضي المطور يومًا أو يومين في تحسين التعليمات البرمجية، لا يمكنك أبدًا معرفة مقدار الزيادة في الإنتاجية. وفي النهاية، لم يعد بإمكانك التأكد من أن التحسين لن يجلب أي أخطاء.
يعد تحويل بعض الصفحات إلى صفحات ثابتة إحدى الطرق لتحقيق أداء أفضل. لنفترض أن هناك موقعًا به عدد كبير من الزيارات، حيث يقوم برنامج PHP النصي بإنشاء الصفحة الأولى لكل طلب، واختيار المعلومات من قاعدة بيانات أو ملف XML. إذا تغيرت البيانات الموجودة على الصفحة بشكل متكرر بما فيه الكفاية، فيمكنك إعادة إنشاء نسخة ثابتة منها. إذا لم يكن التحويل إلى عرض ثابت لصفحة ما ممكنًا (يتم عرض بعض المعلومات الشخصية على الصفحة)، فيمكنك تحويل بعض الكتل إلى عرض ثابت.
مستوى آخر من التحسين لا يتطلب تغيير كود PHP. كما نعلم PHP هي لغة مترجمة. وهذا يعني أن أوامره تتم ترجمتها في وقت التشغيل إلى تعليمات برمجية وسيطة. يتم تكرار البث في كل مرة يتم فيها تشغيل البرنامج النصي. وهذا يجعل PHP أبطأ مقارنة بلغات مثل C أو Java، والتي لا تتطلب تحليل الكود في كل مرة تقوم فيها بتشغيلها. بالنسبة لـ PHP، يمكنك استخدام ذاكرات التخزين المؤقت للتمثيل المتوسط ​​(راجع ترجمتي....) لحفظ التعليمات البرمجية الوسيطة وإعادة استخدامها، وهذا يجعل بدء التشغيل والتنفيذ أسرع.
كل هذا لا يعني أنه لا يوجد وقت أو مكان لتحسين كود PHP. يمكن لبعض تحسينات التعليمات البرمجية تحسين الأداء بشكل كبير. ومع ذلك، تذكر دائمًا أن تغيير التعليمات البرمجية يحمل دائمًا خطر إدخال أخطاء إضافية ومشكلات أمنية. تذكر أيضًا أن تحسين التعليمات البرمجية الخاصة بك يجعلها أقل قابلية للقراءة.

خاتمة

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


في بعض الأحيان قد تكون أخطاء ViewProfile.swf وأخطاء نظام SWF الأخرى مرتبطة بمشكلات في سجل Windows. يمكن للعديد من البرامج استخدام الملف ViewProfile.swf، ولكن عند إزالة تثبيت هذه البرامج أو تعديلها، يتم أحيانًا ترك إدخالات تسجيل SWF "المعزولة" (غير الصحيحة).

في الأساس، هذا يعني أنه على الرغم من أن المسار الفعلي للملف قد تغير، إلا أن موقعه السابق غير الصحيح لا يزال مسجلاً في سجل Windows. عندما يحاول Windows البحث عن مراجع الملفات غير الصحيحة هذه (مواقع الملفات على جهاز الكمبيوتر الخاص بك)، يمكن أن تحدث أخطاء ViewProfile.swf. بالإضافة إلى ذلك، ربما تكون الإصابة بالبرامج الضارة قد أدت إلى إتلاف إدخالات التسجيل المرتبطة بـ Bioshock 2. لذلك، يجب إصلاح إدخالات تسجيل SWF التالفة هذه لإصلاح المشكلة من الجذر.

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

وبسبب هذه المخاطرة، نوصي بشدة باستخدام منظف التسجيل الموثوق به مثل WinThruster (الذي تم تطويره بواسطة Microsoft Gold Certified Partner) لفحص وإصلاح أي مشكلات متعلقة بالسجل ذات صلة بـ ViewProfile.swf. باستخدام منظف التسجيل، يمكنك أتمتة عملية البحث عن إدخالات التسجيل التالفة، ومراجع الملفات المفقودة (مثل تلك التي تسبب خطأ ViewProfile.swf)، والروابط المعطلة داخل التسجيل. قبل كل عملية فحص، يتم إنشاء نسخة احتياطية تلقائيًا، مما يسمح لك بالتراجع عن أي تغييرات بنقرة واحدة ويحميك من التلف المحتمل لجهاز الكمبيوتر الخاص بك. أفضل ما في الأمر هو أن التخلص من أخطاء التسجيل يمكن أن يؤدي إلى تحسين سرعة النظام وأدائه بشكل كبير.


تحذير:ما لم تكن من مستخدمي الكمبيوتر الشخصي ذوي الخبرة، فإننا لا نوصي بتحرير سجل Windows يدويًا. قد يؤدي استخدام محرر التسجيل بشكل غير صحيح إلى حدوث مشكلات خطيرة قد تتطلب منك إعادة تثبيت Windows. نحن لا نضمن إمكانية تصحيح المشكلات الناتجة عن الاستخدام غير الصحيح لمحرر التسجيل. يمكنك استخدام محرر التسجيل على مسؤوليتك الخاصة.

قبل إصلاح سجل Windows يدويًا، تحتاج إلى إنشاء نسخة احتياطية عن طريق تصدير جزء من السجل المرتبط بـ ViewProfile.swf (على سبيل المثال Bioshock 2):

  1. انقر على الزر يبدأ.
  2. يدخل " يأمر" الخامس شريط البحث... لا تنقر بعد يدخل!
  3. أثناء الضغط باستمرار على المفاتيح CTRL-التحولعلى لوحة المفاتيح، اضغط يدخل.
  4. سيتم عرض مربع حوار للوصول.
  5. انقر نعم.
  6. يفتح الصندوق الأسود بمؤشر وامض.
  7. يدخل " رجديت" و اضغط يدخل.
  8. في محرر التسجيل، حدد المفتاح المتعلق بـ ViewProfile.swf (مثل Bioshock 2) الذي تريد عمل نسخة احتياطية منه.
  9. على القائمة ملفيختار يصدّر.
  10. في القائمة حفظ فيحدد المجلد الذي تريد حفظ مفتاح النسخ الاحتياطي للعبة Bioshock 2 فيه.
  11. في الميدان اسم الملفأدخل اسمًا لملف النسخ الاحتياطي، على سبيل المثال "Bioshock 2 Backup".
  12. تأكد من المجال نطاق التصديرالقيمة المحددة الفرع المختار.
  13. انقر يحفظ.
  14. سيتم حفظ الملف مع ملحق .reg.
  15. لديك الآن نسخة احتياطية من إدخال التسجيل المتعلق بـ ViewProfile.swf.

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

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" ); // ديف - التصحيح | الموالية للإنتاج
/** المسار إلى ملف التعريف */
تعريف("XHPROF_ROOT" , __DIR__ . "/ExtProcs/debug/xhprof-0.9.2");

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

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

// تحميل firephp
require_once(__DIR__ . "/ يتضمن/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 = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testing" );
// أنشئ رابطًا لبيانات ملفات التعريف واكتبها في وحدة التحكم
رابط $ = "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"

كما أنها ليست فكرة سيئة تثبيت شيء مثل dot أو Graphviz لرسم الرسوم البيانية للاتصال. لدي Graphviz على نظام التشغيل MacOS X.

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

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

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

# إعدادات 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 اللاحق لتحليل الطلب الثاني الذي يعالج النموذج. لذلك، عند إنشاء ملف تعريف، يكون من الأسهل في بعض الأحيان تشغيل عملية تجعيد لنشر نموذج مباشرةً.

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

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

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

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

عن ماذا تبحث

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

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

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

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

com.xhprof

XHProf - ملف تعريف PHP تم تطويره بواسطة Facebook.

تثبيت:

الكفاءة تثبيت php-pear pecl تثبيت 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. ويمكن الحصول عليها من مستودع جيثب:

استنساخ البوابة 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 = new 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- مقدار ذاكرة الوصول العشوائي المستخدمة،
PeakMemUse- ذروة استهلاك الذاكرة.

المعدلات هي:

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

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

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

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

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

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

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

الكفاءة تثبيت graphviz

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

xDebug

xDebug- مصحح أخطاء كود PHP مع إمكانية إنشاء ملفات تعريف، من تأليف Derick Rethans.

تثبيت:

يم تثبيت php5-xdebug

ثم نقوم بتحرير التكوين:

نانو /etc/php5/mods-available/xdebug.ini

إضافة السطور إليها:

Xdebug.profiler_enable = 1 xdebug.profiler_aggregate = على xdebug.profiler_output_dir = /tmp

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

يوجد عميل ويب webgrind: https://github.com/jokkedk/webgrind. إنه لا يعمل بسرعة كبيرة، ولكنه يسمح لك بعرض الملفات الشخصية الصغيرة بسرعة. في الواقع، هذا هو كود PHP الذي يجب استنساخه من جيثب:

استنساخ البوابة https://github.com/jokkedk/webgrind.git

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

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

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

Static $defaultTimezone = "أوروبا/موسكو";

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

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

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

هناك أيضًا برامج لتحليل الملفات الشخصية لنظام التشغيل Linux:

حول التنميط

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

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

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

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

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

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

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

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

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