2011-11-23 7 views
8

वर्तमान में मैं अपनी साइट के प्रत्येक पृष्ठ पर "all.inc.php" फ़ाइल सहित सभी कक्षाओं में लोड करता हूं, फिर यह फ़ाइल सभी कॉन्फ़िगरेशन, कक्षाएं, फ़ंक्शंस इत्यादि को शामिल करने के लिए आगे बढ़ती है जो मैं उपयोग करूंगा पूरी साइटPHP में ऑटोलोडिंग कक्षाओं का उपयोग करते समय प्रदर्शन डाउनसाइड्स हैं?

इसके साथ मेरा मुद्दा यह है कि अक्सर मैं कक्षाओं का उपयोग करता हूं जो केवल वेबसाइट के कुछ पृष्ठों/वर्गों से संबंधित होते हैं, इसलिए अक्सर मैं पृष्ठ की शुरुआत में कक्षाओं का एक समूह भी शामिल करता हूं जिसका उपयोग नहीं किया जाएगा।

स्पष्ट रूप से कक्षाओं को स्वत: लोड करने से इस समस्या को ठीक किया जाएगा, इसलिए मेरा सवाल है, कक्षाओं को स्वत: लोड करने से मुझे सर्वर के रूप में एक प्रदर्शन दिखाया जाएगा, फिर जांच करनी होगी कि कोई फ़ाइल मौजूद है या नहीं? और यदि कोई नकारात्मकता है, तो क्या इस पृष्ठ पर उपयोग नहीं किए जा सकने वाले कई वर्गों को शामिल करने से भी कम नकारात्मक है? या अंतर नकारात्मक है?

उत्तर

9

इस आलेख में कुछ जानकारी और मानक हैं: PHP autoload performance। निष्कर्ष:

ऑटोलोडिंग प्रदर्शन में काफी कमी नहीं करता है। डिस्क से PHP स्क्रिप्ट को शामिल करना, पढ़ना और पार्स करना शामिल करना उस नंगे ऑटोलोडिंग तर्क लागत से अधिक लंबा समय लगता है।

+0

धन्यवाद, वह लेख उस तरह का स्पष्टीकरण था जिसे मैं ढूंढ रहा था! – Nick

+0

संक्षिप्त उत्तर: वास्तव में नहीं (यह एक छोटा प्रदर्शन हिट है), नहीं, और हाँ :) – siliconrockstar

5

कक्षा को स्वत: लोड करना सामान्य रूप से कक्षा को शामिल करने के जितना तेज़ है। ऑटोलोडिंग पर स्विच करने से आपके मामले में प्रदर्शन बेहतर होगा, क्योंकि PHP कम फाइलों और कक्षाओं को लोड करता है।

+3

जबकि इसके सिद्धांत सही हैं, यह कोड आधार पर निर्भर करता है। यदि आपका कोड बेस कसकर जोड़ता है, और कक्षाएं एक-दूसरे पर भरोसा करती हैं, तो ऑटोलोडिंग के लिए कोई लाभ नहीं हो सकता है, क्योंकि अधिकांश (या सभी) वर्गों को वैसे भी लोड किया जा सकता है।बस एक विचार ;-) –

1

प्रत्येक include() और require() (और उनके _once भाई बहन) को अपने दम पर एक प्रदर्शन दंड ले। डिस्क की तलाश और पढ़ना भी लागत पर आता है। यह वास्तव में आपके कोड पर निर्भर करता है, यदि आप 20 कक्षाएं लोड कर रहे हैं लेकिन किसी भी बिंदु पर केवल 2 या 3 का उपयोग करें, तो यह निश्चित रूप से ऑटोलोडिंग मार्ग पर जाकर लायक है।

यदि प्रदर्शन आपकी मुख्य चिंता है, तो आपको अपनी कक्षा फ़ाइलों को एक फ़ाइल में विलय करना चाहिए और आपको जो चाहिए उसे तुरंत चालू करना चाहिए।

+2

एक ही फाइल में कई वर्गों को फेंकना बहुत बुरा अभ्यास है। – burzum

+0

@ बर्जज़म और वह क्यों होगा? –

+0

http://en.wikipedia.org/wiki/Separation_of_concerns – burzum

3

ऑटोलोडिंग प्रदर्शन में सुधार करेगी यदि स्क्रिप्ट को फाइल सिस्टम में हर बार फ़ाइलों को खोजना नहीं है। यदि आप नेमस्पेस का उपयोग करते हैं तो आपके पास नामस्थान और क्लास नाम का एक फ़ोल्डर और फ़ाइल में एक अच्छा मैपिंग हो सकता है जैसे कुछ/नाइस/क्लासनाम कुछ/नाइस/ClassName.php पर मैप करेगा।

आप नामस्थान उपयोग नहीं करते हैं और फ़ोल्डरों मैं आप फ़ाइलों को शामिल करने के लिए एक कस्टम सिंगलटन वर्ग है कि आप की तरह कुछ करने के लिए अनुमति देता है बनाने के लिए सुझाव है कि के माध्यम से खोज करने के लिए है:

अनुप्रयोग :: उपयोग करता है ('कुछ/अच्छा' , 'कक्षा का नाम');

ऑटोलोड में पंजीकृत पथ और कक्षा का नाम इसे पथ और मानचित्र पर मैप करने के लिए उपयोग करें, जो मेरे उदाहरण में उपयोग विधि से दोनों तर्कों को जोड़ता है। यह आपको क्लास लोडिंग के लिए कार्यक्षमता जैसी कुछ नामस्थान की अनुमति देगा जब तक कि आप नामस्थान का उपयोग करने के लिए अपने ऐप को बदलने के लिए तैयार न हों।

2

आपको परियोजना में सभी उपलब्ध कक्षाओं/फ़ाइलों के कैश इंडेक्स के साथ ऑटोलोडिंग का उपयोग करना चाहिए।

उदाहरण:

$class_cache=array(
    'MyClass'=>'lib/MyClass.php', 
    'Item'=>'model/Item.php' 
); 

function __autoload($class_name) { 
if(array_key_exists($class_name)) 
    include $class_cache[$class_name]; 
else 
    throw new Exception("Unable to load $class_name."); 
} 

आप कक्षा सूची वास्तविक रखने या $ class_cache के लिए कुछ जनरेटर लिखने के लिए की जरूरत है।

+0

उदाहरण कोड के लिए धन्यवाद, लेकिन मेरे सभी वर्ग एक ही नामकरण सम्मेलन का पालन करते हैं और कक्षा के नाम का उपयोग करके आसानी से मेल खाते हैं, इसलिए मुझे नहीं लगता कि उन्हें मिलान करने के लिए एक सरणी सबसे अच्छा समाधान है। अब मैं निश्चित हूं कि मैं ऑटोलोड का उपयोग करने जा रहा हूं! तो स्पष्टीकरण के लिए आप (और दूसरों) के लिए धन्यवाद। – Nick

+0

ठीक है, लेकिन यदि आप $ class_cache के लिए ऑटो जनरेटर लिखते हैं और इसे तैनात करने से पहले चलाते हैं तो आप प्रत्येक अनुरोध पर नहीं, केवल एक बार उपलब्ध प्रोप पर उपलब्ध php फ़ाइलों के लिए डिस्क की जांच करेंगे। – rogal111

संबंधित मुद्दे