2010-02-19 12 views
36

एक अनुभवहीन PHP प्रश्न:PHP में शामिल हैं(): फ़ाइल का आकार और प्रदर्शन

मुझे एक PHP स्क्रिप्ट फ़ाइल मिली है जिसे मुझे कई स्थानों पर कई बार विभिन्न पृष्ठों पर शामिल करने की आवश्यकता है।

मेरे पास शामिल फ़ाइल को कई छोटी फ़ाइलों में तोड़ने का विकल्प है और इन्हें एक आवश्यक आधार पर शामिल करें ... या ... मैं इसे एक ही PHP फ़ाइल में एक साथ रख सकता हूं।

मुझे आश्चर्य है कि इस संदर्भ में शामिल() के लिए एक बड़ी बनाम छोटी फ़ाइल का उपयोग करने का कोई प्रदर्शन प्रभाव है या नहीं? उदाहरण के लिए, क्या 200 केबी फ़ाइल और 20 केबी फ़ाइल के बीच कोई प्रदर्शन अंतर है?

धन्यवाद।

उत्तर

43

200KB और 20KB फ़ाइल के बीच एक अंतर होगा ... लेकिन आप शायद इसे नोटिस नहीं करेंगे: 200KB फ़ाइल इतना बड़ी नहीं है - और आप आमतौर पर बहुत सी फाइलों का उपयोग करते हैं जो "छोटे नहीं" ", जब आप एक बड़ा आवेदन बना रहे हैं।

वहाँ दो चीजें हैं जो समय लगता है, जब आप एक .php फ़ाइल लोड कर रहे हैं:

  • पीएचपी स्रोत कोड "संकलित" है करने के लिए "opcodes" - कि जावा बाईटकोड के लिए काफी बराबर है
    • यह डिफ़ॉल्ट
    • से, हर बार एक PHP फ़ाइल शामिल किया गया है किया लेकिन, APC जैसे कुछ opcode कैश उपयोग कर रहा है, उन opcodes स्मृति में रखा जा सकता है, और इस संकलन सामान हर बार एक नहीं किया nymore - जो बहुत अच्छा है: इसका मतलब कम CPU का उपयोग किया जाएगा, क्योंकि संकलन अब और नहीं किया जाएगा (यह केवल थोड़ी देर में किया जाएगा)
  • opcodes
    • क्रियान्वित कर रहे हैं कि तुम क्या स्क्रिप्ट शामिल के आधार पर, इसमें कुछ समय लग सकता है, या नहीं:
    • फ़ाइल केवल कार्यों या वर्गों परिभाषाएँ शामिल है तो यह ज्यादा समय नहीं लगेगा : कुछ भी निष्पादित नहीं होगा।
    • फ़ाइल निर्देश हैं, तो यह अधिक समय ^^


एक sidnote के रूप में ले लेंगे: एक सामान्य स्थिति में है, तो आप एक बहुत अधिक समय/CPU/संसाधनों के अनुकूलन प्राप्त करेंगे आपके एसक्यूएल प्रश्न, या उस तरह की चीजों के बारे में सोचने से कुछ कैशिंग मेकेनिज्म जोड़ना।

+0

अतिरिक्त स्पष्टीकरण के लिए धन्यवाद। – Tom

+0

आपका स्वागत है :-) मज़े करो! –

+2

एपीसी के साथ भी, एक कस्टम __autoload फ़ंक्शन/spl_autoload_register के उपयोग पर विचार करें - मैं केवल कस्टम एमवीसी ढांचे में मॉडल फ़ाइलों को शामिल करने में सक्षम था, जहां सभी मॉडल फ़ाइलों में एक कंबल के बजाय कक्षा को बुलाया गया था - यह प्रति फ़ाइल लगभग 1ms में सहेजा गया है । तो यदि कोई पृष्ठ 80 एमएस प्रस्तुत करता है और आप 20 एमएस को केवल एपीसी (जब इसमें कई शामिल होते हैं) के साथ भी आवश्यकता होती है, तो यह करने योग्य हो सकता है। इसे लागू करने के लिए केवल 10 मिनट लग गए। – codercake

1

निश्चित रूप से एक प्रभाव है, इसलिए शामिल करने के बजाय include_once() का उपयोग करना सुनिश्चित करें। आप शायद एपीसी का उपयोग करने पर विचार कर सकते हैं जिसमें कैश शामिल है।

+0

ggiroux ... धन्यवाद ... फ़ाइल कैश कैश होने पर क्या है? जब तक कि यह वास्तव में मूर्ख सवाल नहीं है। – Tom

+1

यदि यह कैश किया गया है तो मैं कहूंगा कि प्रभाव बहुत कम है, क्योंकि इसे साझा स्मृति में प्रीकंपिल्ड बाइटकोड में संग्रहीत किया जाएगा। – ggiroux

+3

include_once() को शामिल करने के बजाय()? कृपया उस पर विस्तार करें; यह निश्चित रूप से पहले से ही इस धागे में उल्लिखित कारणों के लिए include_once का उपयोग करने के लिए गति में नहीं जोड़ता है। – Slavic

16

include_once() (और require_once()) से सावधान रहें, include() से अधिक चलना महंगा है। प्रत्येक बार include_once() चलाया जाता है, PHP फ़ाइल को लोड करना है या नहीं, यह तय करने से पहले PHP पहले से ही शामिल फ़ाइलों की आंतरिक अनुक्रमणिका के विरुद्ध एक लुकअप करता है। सूचकांक में और भी शामिल है, धीमे इस लुकअप है। include() या include_once() का उपयोग करते समय भी पूर्ण पथ का उपयोग करने का प्रयास करें जहां यह संभव है क्योंकि यह सापेक्ष पथ से बहुत तेज़ है क्योंकि आप PHP को आपके लिए पूर्ण पथ को काम करने के लिए मजबूर नहीं कर रहे हैं। जैसा कि ggiroux ने कहा था, एपीसी जैसे कैशिंग के कुछ रूप बड़े पैमाने पर पुरस्कार प्राप्त करेंगे और इस बारे में चिंतित होंगे कि आपके पास कितने कॉल अप्रासंगिक हैं (बड़े पैमाने पर) (जब तक कि आपके पास कुछ खराब लिखित कोड न हो)।

EDIT--

ऊपर कॉल के बारे में चिंता केवल एक मुद्दा एक बार आप कई हजार requires या includes अपने codebase में है शुरू करने के लिए है।

+0

वेब पर, हर 100 एमएस मायने रखता है। आपको इस हद तक लाभ के लिए हजारों शामिल करने की आवश्यकता नहीं है। – Pacerier

+0

इस अजीब पोस्ट के बारे में आप क्या सोचते हैं: https://seeit.org/2010/06/11/php-the-include-include_once-performance-debate/ जो दावा करता है कि ** include_once() ** वास्तव में तेज़ है **शामिल()**? – Adam