PHP
प्रदर्शन
खोज…
XHProf के साथ प्रोफाइलिंग
XHProf मूल रूप से फेसबुक द्वारा लिखा गया एक PHP प्रोफाइलर है, जो XDebug को अधिक हल्का विकल्प प्रदान करता है।
xhprof
PHP मॉड्यूल को स्थापित करने के बाद, प्रोफाइलिंग को PHP कोड से सक्षम / अक्षम किया जा सकता है:
xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();
लौटे सरणी में कॉल की संख्या, सीपीयू समय और प्रत्येक फ़ंक्शन के मेमोरी उपयोग के बारे में डेटा होगा जिसे doSlowOperation()
अंदर एक्सेस किया गया है।
xhprof_sample_enable()
/ xhprof_sample_disable()
का उपयोग अधिक हल्के विकल्प के रूप में किया जा सकता है जो केवल अनुरोधों के एक अंश (और एक अलग प्रारूप में) के लिए प्रोफाइलिंग जानकारी लॉग करेगा।
XHProf के पास डेटा को प्रदर्शित करने के लिए कुछ (ज्यादातर अनजाने में) सहायक कार्य होते हैं ( उदाहरण देखें ), या आप इसे देखने के लिए अन्य टूल का उपयोग कर सकते हैं (platform.sh ब्लॉग में एक उदाहरण है )।
स्मृति उपयोग
PHP की रनटाइम मेमोरी लिमिट INI डायरेक्टिव memory_limit
जरिए सेट की गई है। यह सेटिंग PHP की किसी भी एकल निष्पादन को बहुत अधिक मेमोरी का उपयोग करने से रोकता है, इसे अन्य स्क्रिप्ट और सिस्टम सॉफ़्टवेयर के लिए समाप्त करता है। मेमोरी लिमिट 128M तक डिफॉल्ट करती है और इसे php.ini
फाइल या रनटाइम में बदला जा सकता है। इसकी कोई सीमा नहीं है, लेकिन इसे आमतौर पर बुरा व्यवहार माना जाता है।
रनटाइम के दौरान उपयोग किए जाने वाले सटीक मेमोरी उपयोग को memory_get_usage()
कॉल करके निर्धारित किया जा सकता है। यह वर्तमान में चल रही स्क्रिप्ट को आवंटित मेमोरी के बाइट्स की संख्या देता है। PHP 5.2 के रूप में, यह कुल आवंटित सिस्टम मेमोरी प्राप्त करने के लिए एक वैकल्पिक बूलियन पैरामीटर है, जैसा कि PHP द्वारा सक्रिय रूप से उपयोग की जाने वाली मेमोरी के विपरीत है।
<?php
echo memory_get_usage() . "\n";
// Outputs 350688 (or similar, depending on system and PHP version)
// Let's use up some RAM
$array = array_fill(0, 1000, 'abc');
echo memory_get_usage() . "\n";
// Outputs 387704
// Remove the array from memory
unset($array);
echo memory_get_usage() . "\n";
// Outputs 350784
अब memory_get_usage
आपको इस समय चलाए जाने वाले मेमोरी उपयोग की memory_get_usage
देता है। इस फ़ंक्शन के लिए कॉल के बीच आप मेमोरी में अन्य चीजों को आवंटित और निपटा सकते हैं। एक निश्चित बिंदु तक अधिकतम मात्रा में उपयोग की जाने वाली मेमोरी को प्राप्त करने के लिए, memory_get_peak_usage()
कॉल करें।
<?php
echo memory_get_peak_usage() . "\n";
// 385688
$array = array_fill(0, 1000, 'abc');
echo memory_get_peak_usage() . "\n";
// 422736
unset($array);
echo memory_get_peak_usage() . "\n";
// 422776
ध्यान दें कि मूल्य केवल ऊपर जाएगा या स्थिर रहेगा।
Xdebug के साथ प्रोफाइलिंग
PHP के लिए Xdebug नामक एक एक्सटेंशन, PHP अनुप्रयोगों की रूपरेखा और साथ ही रनटाइम डीबगिंग की सहायता के लिए उपलब्ध है। प्रोफाइलर को चलाते समय, आउटपुट को बाइनरी फॉर्मेट में "कैशग्रिंड" नामक फाइल में लिखा जाता है। इन फ़ाइलों का विश्लेषण करने के लिए प्रत्येक प्लेटफ़ॉर्म पर एप्लिकेशन उपलब्ध हैं।
प्रोफाइलिंग को सक्षम करने के लिए, एक्सटेंशन इंस्टॉल करें और php.ini सेटिंग्स को समायोजित करें। हमारे उदाहरण में हम प्रोफ़ाइल को वैकल्पिक रूप से अनुरोध पैरामीटर के आधार पर चलाएंगे। यह हमें सेटिंग्स को स्थिर रखने और केवल आवश्यकतानुसार प्रोफाइलर को चालू करने की अनुमति देता है।
// 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
ध्यान दें कि यह प्रत्येक PHP अनुरोध / प्रक्रिया के लिए एक फ़ाइल लिखेगा जिसे निष्पादित किया जाता है। इसलिए, उदाहरण के लिए, यदि आप एक फॉर्म पोस्ट का विश्लेषण करना चाहते हैं, तो HTML फॉर्म को प्रदर्शित करने के लिए GET अनुरोध के लिए एक प्रोफ़ाइल लिखा जाएगा। XDEBUG_PROFILE पैरामीटर को दूसरे अनुरोध का विश्लेषण करने के लिए बाद के POST अनुरोध में पारित करना होगा जो फ़ॉर्म को संसाधित करता है। इसलिए जब प्रोफाइलिंग की जाती है तो कर्ल को सीधे POST के रूप में चलाना आसान होता है।
एक बार प्रोफाइल कैश लिखने के बाद KCachegrind जैसे एप्लिकेशन को पढ़ा जा सकता है।
यह सहित जानकारी प्रदर्शित करेगा:
- कार्य निष्पादित
- कॉल समय, दोनों स्वयं और बाद के फ़ंक्शन कॉल को सम्मिलित करता है
- प्रत्येक फ़ंक्शन को कई बार कहा जाता है
- रेखांकन करें
- सोर्स कोड के लिंक
जाहिर है प्रदर्शन ट्यूनिंग प्रत्येक अनुप्रयोग के उपयोग के मामलों के लिए बहुत विशिष्ट है। सामान्य तौर पर यह देखने में अच्छा है:
- उसी फ़ंक्शन को बार-बार कॉल करने से आपको देखने की उम्मीद नहीं होगी। उन कार्यों के लिए जो डेटा को प्रोसेस और क्वेरी करते हैं, ये आपके एप्लिकेशन को कैश करने के प्रमुख अवसर हो सकते हैं।
- धीमी गति से चल रहे कार्य। आवेदन का अधिकांश समय कहां खर्च होता है? प्रदर्शन ट्यूनिंग में सबसे अच्छा भुगतान आवेदन के उन हिस्सों पर ध्यान केंद्रित कर रहा है जो सबसे अधिक समय का उपभोग करते हैं।
नोट : Xdebug, और विशेष रूप से इसकी रूपरेखा विशेषताएं, बहुत ही गहन संसाधन हैं और PHP निष्पादन को धीमा कर देती हैं। उत्पादन सर्वर वातावरण में इन्हें न चलाने की सलाह दी जाती है।