سؤال

ما هي أسهل طريقة إلى ملف PHP النصي ؟

أود تغير اتجاهها شيئا على أن يظهر لي تفريغ جميع المكالمات وظيفة متى أخذوا ولكن أنا أيضا موافق مع وضع شيء حول مهام محددة.

حاولت تجريب microtime وظيفة:

$then = microtime();
myFunc();
$now = microtime();

echo sprintf("Elapsed:  %f", $now-$then);

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

هل كانت مفيدة؟

المحلول

على PECL APD التمديد هو استخدامها على النحو التالي:

<?php
apd_set_pprof_trace();

//rest of the script
?>

بعد تحليل الملف الذي تم إنشاؤه باستخدام pprofp.

إخراج المثال:

Trace for /home/dan/testapd.php
Total Elapsed Time = 0.00
Total System Time  = 0.00
Total User Time    = 0.00


Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace
14.3 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 str_replace

تحذير:الإصدار الأخير من APD بتاريخ 2004, تمديد لم يعد الحفاظ على و لديه العديد من القضايا compability (انظر التعليقات).

نصائح أخرى

تريد xdebug أعتقد.تثبيته على الخادم, تشغيله, مضخة الإخراج من خلال kcachegrind (لينكس) أو wincachegrind (ويندوز) و سوف تظهر لك عدد قليل جدا المخططات التي التفصيل الدقيق توقيت التهم واستخدام الذاكرة (ولكن سوف تحتاج تمديد آخر أجل ذلك).

ومن الصخور على محمل الجد :D

لا الإضافات المطلوبة, مجرد استخدام هذه الدالات اثنين بسيطة التنميط.

// Call this at each point of interest, passing a descriptive string
function prof_flag($str)
{
    global $prof_timing, $prof_names;
    $prof_timing[] = microtime(true);
    $prof_names[] = $str;
}

// Call this when you're done and want to see the results
function prof_print()
{
    global $prof_timing, $prof_names;
    $size = count($prof_timing);
    for($i=0;$i<$size - 1; $i++)
    {
        echo "<b>{$prof_names[$i]}</b><br>";
        echo sprintf("&nbsp;&nbsp;&nbsp;%f<br>", $prof_timing[$i+1]-$prof_timing[$i]);
    }
    echo "<b>{$prof_names[$size-1]}</b><br>";
}

هنا مثال ، داعيا prof_flag() مع الوصف في كل نقطة تفتيش ، prof_print() في النهاية:

prof_flag("Start");

   include '../lib/database.php';
   include '../lib/helper_func.php';

prof_flag("Connect to DB");

   connect_to_db();

prof_flag("Perform query");

   // Get all the data

   $select_query = "SELECT * FROM data_table";
   $result = mysql_query($select_query);

prof_flag("Retrieve data");

   $rows = array();
   $found_data=false;
   while($r = mysql_fetch_assoc($result))
   {
       $found_data=true;
       $rows[] = $r;
   }

prof_flag("Close DB");

   mysql_close();   //close database connection

prof_flag("Done");
prof_print();

الإخراج يبدو مثل هذا:

تبدأ
   0.004303
الاتصال DB
   0.003518
أداء الاستعلام
   0.000308
استرداد البيانات
   0.000009
بالقرب من DB
   0.000049
به

عبر نشر بلدي إشارة من الوثائق بيتا الذي يجري حاليا.

التنميط مع XDebug

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

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

# php.ini settings
# Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
# Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
# The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
# Output cachegrind files to /tmp so our system cleans them up later
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 طلب / العملية التي يتم تنفيذها.لذا, فعلى سبيل المثال, إذا كنت ترغب في تحليل نموذج ما بعد, لمحة واحدة من شأنها أن تكون مكتوبة من أجل الحصول على طلب لعرض نموذج HTML.على XDEBUG_PROFILE المعلمة سوف تحتاج إلى تمرير في ما بعد طلب تحليل الطلب الثاني الذي عمليات شكل.ولذلك عندما التنميط بعض الأحيان أنه من الأسهل لتشغيل حليقة إلى نشر نموذج مباشرة.

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

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

KCachegrind

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

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

ما الذي تبحث عنه

من الواضح ضبط الأداء محددة جدا إلى استخدام كل تطبيق الحالات.عموما من الجيد أن تبحث عن:

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

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

إذا طرح microtimes يعطيك نتائج سلبية ، حاول استخدام وظيفة مع الحجة true (microtime(true)).مع true, الدالة بإرجاع تطفو بدلا من سلسلة (كما يفعل إذا ويسمى دون حجج).

بصراحة أنا ذاهب إلى القول بأن استخدام NewRelic عن التنميط هو أفضل.

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

لا يزال, حتى مع الحر/خطة موحدة ، هو واضح و بسيط حيث ان معظم منخفضة شنقا الفاكهة.أود أيضا أنه يمكن أن تعطيك فكرة عن DB التفاعلات أيضا.

screenshot of one of the interfaces when profiling

PECL XHPROF يبدو interensting أيضا.وقد نقر HTML واجهة لعرض تقارير واضحة جدا الوثائق.أنا لم لاختبار ذلك على الرغم من.

الرجل الفقير التنميط, لا الإضافات المطلوبة.يدعم متداخلة ملامح في المئة من مجموع:

function p_open($flag) {
    global $p_times;
    if (null === $p_times)
        $p_times = [];
    if (! array_key_exists($flag, $p_times))
        $p_times[$flag] = [ 'total' => 0, 'open' => 0 ];
    $p_times[$flag]['open'] = microtime(true);
}

function p_close($flag)
{
    global $p_times;
    if (isset($p_times[$flag]['open'])) {
        $p_times[$flag]['total'] += (microtime(true) - $p_times[$flag]['open']);
        unset($p_times[$flag]['open']);
    }
}

function p_dump()
{
    global $p_times;
    $dump = [];
    $sum  = 0;
    foreach ($p_times as $flag => $info) {
        $dump[$flag]['elapsed'] = $info['total'];
        $sum += $info['total'];
    }
    foreach ($dump as $flag => $info) {
        $dump[$flag]['percent'] = $dump[$flag]['elapsed']/$sum;
    }
    return $dump;
}

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

<?php

p_open('foo');
sleep(1);
p_open('bar');
sleep(2);
p_open('baz');
sleep(3);
p_close('baz');
sleep(2);
p_close('bar');
sleep(1);
p_close('foo');

var_dump(p_dump());

ينتج:

array:3 [
  "foo" => array:2 [
    "elapsed" => 9.000766992569
    "percent" => 0.4736904954747
  ]
  "bar" => array:2 [
    "elapsed" => 7.0004580020905
    "percent" => 0.36841864946596
  ]
  "baz" => array:2 [
    "elapsed" => 3.0001420974731
    "percent" => 0.15789085505934
  ]
]

أود أن استخدام phpDebug عن التنميط.http://phpdebug.sourceforge.net/www/index.html

فإنه إخراج كل الوقت / استخدام الذاكرة لأي SQL المستخدمة وكذلك جميع الملفات المضمنة.ومن الواضح أنه يعمل بشكل أفضل على رمز المستخرجة.

للحصول على وظيفة من الدرجة التنميط أنا فقط استخدام microtime() + get_memory_usage() + get_peak_memory_usage().

وأود أن تعطي بتحد BlackFire المحاولة.

هناك هذا فيرتثلبوإكس لقد وضعت معا باستخدام puphpet, لاختبار مختلف أطر php التي coms مع BlackFire, رجاء شعرت حر أن شوكة و/أو توزيع أو إذا لزم الأمر :)

https://github.com/webit4me/PHPFrameworks

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

أنا فعلا انها ملفوفة في آخر الصف مع __التدمير الأسلوب.عندما النصي مخارج ، والناتج هو تسجيل الدخول عبر log4php إلى syslog, لذلك لدي الكثير من بيانات الأداء للعمل من.

XDebug ليست مستقرة وانها ليست دائما متاحة خاصة php الإصدار.على سبيل المثال على بعض خوادم لا يزال تشغيل php 5.1.6 -- انها ما يأتي مع ريدهات RHEL5 (وبالمناسبة لا يزال يتلقى التحديثات لجميع القضايا الهامة) و الأخيرة XDebug حتى لا تجمع مع php.حتى انتهى بي الأمر مع التحول إلى DBG المصحح لها php القياس يوفر توقيت وظائف, طرق, وحدات وحتى خطوط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top