PHP स्क्रिप्ट को प्रोफाइल करने का सबसे सरल तरीका


289

PHP स्क्रिप्ट को प्रोफाइल करने का सबसे आसान तरीका क्या है?

मुझे उस पर कुछ काम करना पसंद है जो मुझे सभी फ़ंक्शन कॉलों का एक डंप दिखाता है और उन्हें कितने समय तक लगा लेकिन मैं विशिष्ट कार्यों के आसपास कुछ डालने के साथ ठीक भी हूं।

मैंने माइक्रोटाइम फ़ंक्शन के साथ प्रयोग करने की कोशिश की :

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

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

लेकिन यह कभी-कभी मुझे नकारात्मक परिणाम देता है। इसके अलावा मेरे सारे कोड पर इसे छिड़कना बहुत मुश्किल है।


7
हे मार्क, नकारात्मक टिप्पणियों को हल करने में आपकी सहायता करने के लिए इस टिप्पणी की जांच करें: ro.php.net/manual/en/function.microtime.php#99524
मीना

16
@Midiane द्वारा लिंक की गई टिप्पणी का कोई मतलब नहीं है। यदि यह टिप्पणीकार की समस्या को हल करने के लिए लगता है, यह एक संयोग रहा होगा। बस का उपयोग microtime()करने से कभी-कभी भावों "0.00154800 1342892546" - "0.99905700 1342892545"का मूल्यांकन करना होगा : जैसे , जो मूल्यांकन करेगा जैसे 0.001548 - 0.999057:। आप microtime( TRUE )उस समस्या से बचने के लिए उपयोग कर सकते हैं , जैसा कि @luka द्वारा बताया गया है।
JMM

जवाबों:


104

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

चेतावनी: एपीडी की नवीनतम रिलीज 2004 दिनांकित है, विस्तार अब बनाए नहीं रखा गया है और इसमें विभिन्न संगतता मुद्दे हैं (टिप्पणियां देखें)।


19
APD एक्सटेंशन php 5.4 पर टूट गया है।
स्काईनेट

User457015 के प्रतिवर्ती में, मैं इसे 3.8.1 और PHP 5.3.10 पर चलने वाली वेबसाइट पर काम करने में सक्षम था और यह ठीक काम करने के लिए लग रहा था।
सुपरनोवा

1
@Supernovah, user457015 ने PHP 5.4 कहा। उन्होंने यह नहीं कहा कि यह PHP 5.3 पर टूट गया था।
वृहस्पति

@ user1420752 मैं 5.3.27 चला रहा हूं और यह वहां भी नहीं चल रहा है। मुझे एक अपरिभाषित फ़ंक्शन त्रुटि मिलती है।
फ्रैक्टली

2
APD की नवीनतम रिलीज़ 2004 (!) से हुई है। यह PHP 7 के साथ काम नहीं करता है। जब PHP 5 के साथ इंस्टॉल करने की कोशिश की जाती है pecl install apd, तो यह "config.m4" के बारे में एक त्रुटि संदेश देता है। ऐसा लगता है कि आपको इसे स्रोत से स्थापित करना होगा, जिसे मैंने अभी तक कोशिश नहीं की है। गंभीरता से, होमब्रॉ के साथ स्थापित PHP के लिए आधुनिक, अपडेटेड CLI- आधारित प्रोफाइलिंग टूल नहीं है, न्यूनतम सेटअप की आवश्यकता है और आसानी से मानव पठनीय आउटपुट देता है?
एमरिन

267

आप xdebug मुझे लगता है चाहते हैं । इसे सर्वर पर स्थापित करें, इसे चालू करें, kcachegrind (linux के लिए) या wincachegrind (विंडोज़ के लिए ) के माध्यम से आउटपुट को पंप करें और यह आपको कुछ सुंदर चार्ट दिखाएगा जो सटीक समय, मायने रखता है और मेमोरी उपयोग (लेकिन आप का विस्तार करते हैं) इसके लिए एक और विस्तार की जरूरत है)।

यह चट्टानों, गंभीरता से: डी


6
मुझे एपीडी समाधान की तुलना में इसे लागू करना बहुत आसान लगा। लेकिन शायद ऐसा इसलिए है क्योंकि किसी कारण से एपीडी मेरे सिस्टम पर ठीक से संकलित नहीं हुआ। इसके अलावा kcachegrind के चार्ट भी वादे के अनुसार बहुत सुंदर थे।
wxs

1
@EvilPuppetMaster, आपको php को संकलन करने की आवश्यकता है --enable-memory-limit या अधिक आधुनिक php संस्करण का उपयोग करने के लिए। देखें xdebug.org/docs/basic#xdebug_memory_usage
Mercutio

52
xdebug + वेबग्राइंड जल्दी और आसान प्रोफाइलिंग के लिए मेरी पसंद का हथियार बन गया। code.google.com/p/webgrind
xkcd150

6
xdebug + xdebug_start_trace () + xdebug_stop_trace () = win
quano

3
XAMPP के साथ विंडोज पर काम करना बहुत आसान था। पहले से ही xbebug के लिए netbeans कॉन्फ़िगर किया गया था। केवल एक चीज जो आपको करने की आवश्यकता है, वह है php.ini में xdebug.profiler_output_name = "cachegrind.out।% T-% s" पर xdebug सेटिंग बदलने की और अन्यथा कोई आउटपुट उत्पन्न नहीं होगा। अपाचे के पुनरारंभ की आवश्यकता है।
शुरुआत_

97

कोई एक्सटेंशन की आवश्यकता नहीं है, बस सरल रूपरेखा के लिए इन दो कार्यों का उपयोग करें।

// 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
कनेक्ट डीबी को
   0.003518
प्रदर्शन करना क्वेरी
   0.000308
डाटा पुन: प्राप्त
   0.000009
बंद डीबी
   0.000049
सम्पन्न


37

एसओ डॉक्यूमेंटेशन बीटा से मेरा संदर्भ पोस्ट करें जो ऑफ़लाइन हो रहा है।

XDebug के साथ प्रोफाइलिंग

PHP के लिए Xdebug नाम का एक एक्सटेंशन PHP अनुप्रयोगों की रूपरेखा के साथ-साथ रनटाइम डीबगिंग की सहायता के लिए उपलब्ध है । प्रोफाइलर को चलाते समय, आउटपुट को बाइनरी फॉर्मेट में "कैशग्रिंड" नामक फाइल में लिखा जाता है। इन फ़ाइलों का विश्लेषण करने के लिए प्रत्येक प्लेटफ़ॉर्म पर एप्लिकेशन उपलब्ध हैं। इस रूपरेखा को निष्पादित करने के लिए कोई एप्लिकेशन कोड परिवर्तन आवश्यक नहीं हैं।

प्रोफाइलिंग को सक्षम करने के लिए, एक्सटेंशन इंस्टॉल करें और 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 फॉर्म को प्रदर्शित करने के लिए GET अनुरोध के लिए एक प्रोफ़ाइल लिखा जाएगा। XDEBUG_PROFILE के पैरामीटर को दूसरे अनुरोध का विश्लेषण करने के लिए बाद के POST अनुरोध में पारित करना होगा जो फ़ॉर्म को संसाधित करता है। इसलिए जब प्रोफाइलिंग की जाती है तो कर्ल को सीधे POST के रूप में चलाना आसान होता है।

आउटपुट का विश्लेषण

एक बार जब प्रोफ़ाइल कैश लिखा जाता है तो KCachegrind या Webgrind जैसे एप्लिकेशन द्वारा पढ़ा जा सकता है । PHPStorm, एक लोकप्रिय PHP IDE, इस प्रोफाइलिंग डेटा को भी प्रदर्शित कर सकता है ।

KCachegrind

उदाहरण के लिए, कैशेग्रिंड, सहित जानकारी प्रदर्शित करेगा:

  • कार्य निष्पादित
  • कॉल समय, दोनों ही और बाद के फ़ंक्शन कॉल को शामिल किया गया
  • प्रत्येक फ़ंक्शन को कितनी बार कहा जाता है
  • रेखांकन करें
  • सोर्स कोड के लिंक

क्या देखें

स्पष्ट रूप से प्रदर्शन ट्यूनिंग प्रत्येक अनुप्रयोग के उपयोग के मामलों के लिए बहुत विशिष्ट है। सामान्य तौर पर यह देखने में अच्छा है:

  • उसी फ़ंक्शन को बार-बार कॉल करने से आपको देखने की उम्मीद नहीं होगी। उन कार्यों के लिए जो डेटा को प्रोसेस और क्वेरी करते हैं, ये आपके एप्लिकेशन को कैश करने के प्रमुख अवसर हो सकते हैं।
  • धीमी गति से चल रहे कार्य। आवेदन का अधिकांश समय कहां खर्च होता है? प्रदर्शन ट्यूनिंग में सबसे अच्छा भुगतान आवेदन के उन हिस्सों पर ध्यान केंद्रित कर रहा है जो सबसे अधिक समय का उपभोग करते हैं।

नोट : Xdebug, और विशेष रूप से इसकी रूपरेखा विशेषताएं, बहुत ही गहन संसाधन हैं और PHP निष्पादन को धीमा कर देती हैं। उत्पादन सर्वर वातावरण में इन्हें न चलाने की सलाह दी जाती है।


3
प्रोफ़ाइल कैश पार्स करने के लिए उपकरणों की सूची में जोड़ना:
PhpStorm

1
@peter मैं भूल गया कि PHPStorm में वह सुविधा है। मैंने इसे दस्तावेज़ के लिंक के साथ जोड़ा है। धन्यवाद!
मैट एस

सर्वर पर सीधे एक पाठ (गैर-जीयूआई) रिपोर्ट प्राप्त करने का कोई तरीका?
अलेक्जेंडर शेकब्लिकिन

1
@ मर्क आप इसे उत्तर के रूप में चिह्नित कर सकते हैं, कृपया। वर्तमान उत्तर पोस्ट किए जाने के बाद भी पुराना था और कई वर्षों तक काम नहीं किया था। यह काम करता है, और मुझे कोई बेहतर तरीका नहीं पता है।
मावग का कहना है कि मोनिका

24

यदि माइक्रोटाइम को घटाना आपको नकारात्मक परिणाम देता है, तो तर्क true( microtime(true)) के साथ फ़ंक्शन का उपयोग करने का प्रयास करें । इसके साथ true, फ़ंक्शन स्ट्रिंग के बजाय एक फ्लोट लौटाता है (जैसा कि यह होता है अगर इसे बिना तर्कों के कहा जाता है)।


24

ईमानदारी से, मैं तर्क देने जा रहा हूं कि प्रोफाइलिंग के लिए न्यूरेलिक का उपयोग करना सबसे अच्छा है।

यह एक PHP एक्सटेंशन है जो रनटाइम को धीमा नहीं करता है और वे आपके लिए मॉनिटरिंग करते हैं, जिससे सभ्य ड्रिल डाउन होती है। महंगे संस्करण में वे भारी ड्रिल की अनुमति देते हैं (लेकिन हम उनके मूल्य निर्धारण मॉडल को बर्दाश्त नहीं कर सकते हैं)।

फिर भी, मुफ्त / मानक योजना के साथ भी, यह स्पष्ट और सरल है, जहां अधिकांश कम लटका हुआ फल है। मुझे यह भी पसंद है कि यह आपको डीबी इंटरैक्शन पर भी एक विचार दे सकता है।

जब प्रोफाइल में से किसी एक का स्क्रीनशॉट


16
नया अवशेष आशाजनक लगता है, निश्चित है। हालांकि, उनकी गोपनीयता नीति के "डिस्क्लोजर ऑफ योर एप्लिकेशन डेटा" ने मुझे तुरंत निरस्त कर दिया। Imho, तीसरे पक्ष के साथ मालिकाना स्रोत कोड के टुकड़े साझा करना बहुत अधिक है।
सेंग्ज

8
यहां उनके बचाव के लिए नहीं, लेकिन ऐसा लगता है कि "एप्लिकेशन डेटा" केवल प्रदर्शन जानकारी और सिस्टम कॉन्फ़िगरेशन जानकारी है, न कि आपके एप्लिकेशन स्रोत कोड।
डेविड शील्ड

Fi मेरा नया अवशेष मेरे "WebTransaction" को 99% समय के रूप में दिखा रहा है, और न ही "ApplicationTraces" के लिए समर्थक खाता है
कार्तिक टी

1
साइन अप करने का प्रयास करें: newrelic.com/rackspace <आपको मुफ्त में "मानक" देना चाहिए
जीरोस्टरस्क

15

गरीब आदमी की रूपरेखा, कोई एक्सटेंशन की आवश्यकता नहीं है। नेस्टेड प्रोफाइल और कुल प्रतिशत का समर्थन करता है:

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
  ]
]

13

PECL XHPROF इंटरटेनिंग भी दिखता है। इसमें रिपोर्ट देखने के लिए क्लिक करने योग्य HTML इंटरफ़ेस है और बहुत ही सरल प्रलेखन है । मुझे अभी इसका परीक्षण करना बाकी है।


ऐसा लगता है कि इसे बहुत प्यार नहीं मिल रहा है। 2009 में अंतिम अपडेट, 5.3, 5.4 और उससे आगे के लिए कोई PEAR पैकेज नहीं ...
dland

1
फेसबुक 5.5 php के माध्यम से समर्थन के साथ एक कांटा बनाया github.com/facebook/xhprof
borkencode

इस कांटे को भी देखें जो कुछ अतिरिक्त समायोजन का प्रस्ताव करता है: github.com/preinheimer/xhprof
Fedir RYKHTIK

xhprof.io XHProf का उपयोग करके एकत्र किए गए डेटा के लिए GUI प्रदान करता है, साथ ही ऐतिहासिक विश्लेषण उद्देश्यों के लिए डेटाबेस में डेटा संग्रहीत करने की क्षमता भी प्रदान करता है। मैं बाद के कार्यान्वयन का लेखक हूं।
गजस

10

मुझे प्रोफाइलिंग के लिए phpDebug का उपयोग करना पसंद है। http://phpdebug.sourceforge.net/www/index.html

यह किसी भी SQL और साथ ही सभी शामिल फ़ाइलों के लिए सभी समय / मेमोरी उपयोग का आउटपुट देता है। जाहिर है, यह कोड पर सबसे अच्छा काम करता है जो अमूर्त है।

फ़ंक्शन और क्लास प्रोफाइलिंग के लिए मैं सिर्फ microtime()+ get_memory_usage()+ का उपयोग करूंगा get_peak_memory_usage()


7

मैं ख़ुशी से BlackFire को एक कोशिश करूँगा।

इस वर्चुअलबॉक्स को मैंने अलग-अलग php चौखटे का परीक्षण करने के लिए प्यूपेट का उपयोग करते हुए एक साथ रखा है , जो BlackFire के साथ आता है, कृपया बेझिझक फोर्क और / या वितरित करें :)

https://github.com/webit4me/PHPFrameworks


6

बेंचमार्किंग के लिए, आपके उदाहरण की तरह, मैं नाशपाती बेंचमार्क पैकेज का उपयोग करता हूं । आप मापने के लिए मार्कर सेट करते हैं। क्लास कुछ प्रेजेंटेशन हेल्पर्स भी प्रदान करता है, या आप डेटा को प्रोसेस कर सकते हैं जैसा कि आप फिट देखते हैं।

मेरे पास वास्तव में यह एक अन्य वर्ग में एक __destruct विधि के साथ लिपटा है। जब कोई स्क्रिप्ट बाहर निकलती है, तो आउटपुट को log4php के माध्यम से syslog में लॉग किया जाता है, इसलिए मेरे पास काम करने के लिए बहुत सारे प्रदर्शन डेटा हैं।


3

XDebug स्थिर नहीं है और यह हमेशा विशेष php संस्करण के लिए उपलब्ध नहीं है। उदाहरण के लिए कुछ सर्वरों पर मैं अभी भी php-5.1.6 चलाता हूं, - यह वही है जो RedHat RHEL5 के साथ आता है (और btw अभी भी सभी महत्वपूर्ण मुद्दों के लिए अपडेट प्राप्त करता है), और हाल ही में XDebug इस php के साथ भी संकलन नहीं करता है। इसलिए मैं DBG डिबगर पर स्विच करने के साथ समाप्त हुआ। इसकी php बेंचमार्किंग फ़ंक्शन, विधियों, मॉड्यूल और यहां तक ​​कि लाइनों के लिए समय प्रदान करती है।


2

आप सभी को इस नए php प्रोफाइलर को जरूर देखना चाहिए।

https://github.com/NoiseByNorthwest/php-spx

यह कैसे php प्रोफाइलर इकट्ठा और परिणाम प्रस्तुत करता है के तरीके को फिर से परिभाषित करता है। आउटपुट फ़ंक्शन की कुल संख्या के बजाय इसे निष्पादित करने में खर्च किए गए कुल फ़ंक्शन कॉल और कुल समय - PHP-SPX पूरी तरह से पठनीय तरीके से अनुरोध निष्पादन की संपूर्ण समयरेखा प्रस्तुत करता है। नीचे GUI की स्क्रीन दी गई है।

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.