2009-08-01 22 views
5

मैं आम तौर पर अपनी साइट के हैडर में 1 फ़ंक्शंस फ़ाइल शामिल करता हूं, अब यह साइट बहुत अधिक ट्रैफ़िक है और मैं बस हर छोटी चीज़ को सबसे अच्छा बनाना चाहता हूं, इसलिए मेरा प्रश्न है,PHP में बेहतर प्रदर्शन कौन सा है?

क्या यह बेहतर है उस पृष्ठ के लिए आवश्यक कोड के साथ कई छोटी फ़ंक्शन प्रकार फ़ाइलों को शामिल करने के लिए या वास्तव में इसे केवल 1 बड़ी फ़ाइल के रूप में लोड करने में कोई फर्क नहीं पड़ता है, मेरी वर्तमान फ़ंक्शन फ़ाइल में मेरी पूरी साइट के लिए सभी फ़ंक्शन हैं, यह लगभग 4,000 लाइनें हैं लंबे समय तक और प्रत्येक पृष्ठ लोड साइटवाइड पर लोड किया जाता है, क्या यह बुरा है?

उत्तर

5

यह कहना मुश्किल है। फाइल पार्सिंग के क्षेत्र में 4,000 लाइनें बड़ी नहीं हैं। कोड प्रबंधन के मामले में, यह अनावश्यक पक्ष पर शुरू हो रहा है, लेकिन आपको 2, 5 या 10 फ़ाइलों में इसे तोड़कर एक मापनीय प्रदर्शन अंतर देखने की संभावना नहीं है, और पृष्ठों में केवल कुछ ही आवश्यक हैं (यह बेहतर कोडिंग अभ्यास है, लेकिन यह एक अलग मुद्दा है)। पार्सर को खोलने की जरूरत है कि संख्याओं की संख्या बनाम संख्याओं में आपका अंतर कुछ भी महत्वपूर्ण वारंट करने के लिए पर्याप्त नहीं लगता है। मेरी प्रारंभिक प्रतिक्रिया यह है कि शायद यह कोई मुद्दा नहीं है जिसके बारे में आपको चिंता करने की ज़रूरत है।

सिक्का के विपरीत तरफ, मैंने एंटरप्राइज़-स्तरीय प्रोजेक्ट पर काम किया जहां कुछ परिचालनों में include() पेड़ था जो अक्सर सैकड़ों फाइलों में विस्तारित होता था। इन परिचालनों को प्रोफाइल करने से संकेत मिलता है कि include() द्वारा लिया गया समय अकेले कॉल 10 सेकेंड लोड ऑपरेशन के 2-3 सेकंड (यह PHP4 था) बनाया गया था।

+1

याद रखें, कि उन 4k लाइनों को पार्स किया जाना चाहिए और _every_ पृष्ठ पहुंच के लिए चलाया जाना चाहिए। जब तक आपके पास कुछ ऑप्टिमाइज़र नहीं चलते हैं जो कैश संकलित बाइटकोड करते हैं, लेकिन आखिर में मैंने उन चीजों को एक लागत पर देखा और इसलिए आमतौर पर इंस्टॉल नहीं किया जाता है जब तक आप इसके लिए भुगतान नहीं करते। – Joey

+1

हां, यह सच है। लेकिन कई फाइलों से निपटने के लिए डिस्क की मांग भी होती है। यदि आप मानते हैं कि वह इसे 400 लाइनों की 10 फाइलों में विभाजित करता है, और औसतन प्रत्येक में प्रत्येक फ़ाइल में उनमें से 4 शामिल होते हैं, तो वह कोड के 1600 लाइनों और 4 फाइलों तक नीचे आ जाता है। सवाल यह है कि क्या अतिरिक्त लाइनों की संख्या में कटौती शामिल है() ओवरहेड शामिल है।मैं यह बताता हूं कि अंतर असाधारण रूप से मामूली होगा। निश्चित रूप से सुनिश्चित करने का एकमात्र तरीका यह है कि इसे बेंचमार्क करना है। वास्तव में, अगर आप अनुकूलन के उस स्तर पर हैं, तो एक ओपोड कैश समय बेहतर खर्च करेगा। – zombat

+0

ठीक टिप्पणियों के लिए धन्यवाद, अगर मैं कभी भी छोटी फाइलों, जैसे फोरम फ़ंक्शंस, ब्लॉग फ़ंक्शंस आदि में तोड़ने का निर्णय लेता हूं, क्योंकि मेरी साइट में सैकड़ों पेज हैं जिनमें सभी में मेरी 1 फ़ंक्शंस फ़ाइल शामिल है, मैं बस अपने कोड को निर्धारित करने की आवश्यकता है कि फाइलों के समूह को सही तरीके से संपादित करने के बजाय उस फ़ाइल के अंदर कौन सी फाइलें लोड होंगी? मुझे पता है कि यह एक सुंदर नहीं होगा लेकिन ठीक रहेगा? – JasonDavis

1

आम तौर पर यह छोटी फाइलों में सामान को तोड़ने के लिए फ़ाइल प्रबंधन के अनुसार बेहतर होता है क्योंकि आपको केवल उन फ़ाइलों को लोड करने की आवश्यकता होती है जिन्हें आप वास्तव में उपयोग करते हैं। लेकिन, 4,000 लाइनों पर, यह शायद एक बहुत अंतर नहीं करेगा।

मैं एक समाधान यह

function inc_lib($name) 
{ 
    include("/path/to/lib".$name.".lib.php"); 
} 

function inc_class($name) 
{ 
    include("/path/to/lib".$name.".class.php"); 
} 
+0

अच्छा विचार धन्यवाद – JasonDavis

1

मुझे लगता है कि यह बेहतर होगा यदि आप विभाजित कर सकते कार्यों घटक है कि प्रत्येक पृष्ठ के लिए उपयुक्त है में दायर करने के लिए इसी तरह के सुझाव देंगे; और उचित पृष्ठों में उन घटकों के लिए कॉल करें। बस मेरे 2 सेंट!

पी/एस: मैं एक PHP शौकिया हूं और मैं एक PHP साइट बनाने पर अपने हाथों की कोशिश कर रहा हूं; मैं किसी भी काम का उपयोग नहीं कर रहा हूँ। तो क्या आप मुझे इस बात पर प्रकाश डाल सकते हैं कि आपको किसी साइट के लिए किन कार्यों की आवश्यकता होगी?

+0

php.net साइट में सभी मूल php फ़ंक्शन हैं, हालांकि आप कोड बना सकते हैं जो कुछ फ़ंक्शंस/कार्य करता है और इसे अपने स्वयं के मज़े में डाल देता है, जिसे आप बार-बार बुला सकते हैं, इसलिए आप कोड के एक ही ब्लॉक को एक बार लिखना नहीं है – JasonDavis

1

मेरे अनुभव में बड़ी संख्या में फ़ाइल शामिल है जो हर जगह शामिल हो जाती है वास्तव में प्रदर्शन को मार सकती है। मैंने एक ब्राउज़र गेम पर काम किया जहां हमारे पास गतिशील रूप से जेनरेट किए गए PHP (दूसरों के बीच) के रूप में सभी गेम नियम थे और फ़ाइल लगभग 500 कीबी में वजन थी। यह निश्चित रूप से प्रदर्शन को प्रभावित करता है और हमने इसके बजाय एक PHP एक्सटेंशन उत्पन्न करने पर विचार किया।

हालांकि, सामान्य रूप से, मैं कहूंगा कि अब आप जो कर रहे हैं वह करना चाहिए जब तक कि यह एक प्रदर्शन समस्या न हो और फिर आवश्यकतानुसार अनुकूलित हो।

3

यदि आप अपने सर्वर पर एक्सटेंशन इंस्टॉल कर सकते हैं, तो आपको APC (see also) पर एक नज़र डालना चाहिए।
यह मुफ़्त है, वैसे ;-); लेकिन इसे स्थापित करने के लिए आपको अपने सर्वर का व्यवस्थापक होना चाहिए; इसलिए यह आमतौर पर साझा होस्टिंग पर प्रदान नहीं किया जाता है ...

इसे "ऑपोड कैश" कहा जाता है।

असल में, जब एक PHP स्क्रिप्ट कहा जाता है, दो बातें होती हैं:

  • स्क्रिप्ट opcodes
  • opcodes
  • क्रियान्वित कर रहे हैं में "संकलित" है

एपीसी रैम में opcodes रहता है ; इसलिए फ़ाइल को हर बार इसे फिर से संकलित करने की आवश्यकता नहीं होती है - और सीपीयू-लोड और प्रदर्शन दोनों के लिए यह एक अच्छी बात है।


सवाल थोड़ा अधिक जवाब देने के लिए:

  • 4.000 लाइनों प्रदर्शन के तौर पर, कि ज्यादा नहीं है, किसी भी बड़े एप्लिकेशन/फ्रेमवर्क की कुछ फाइलें खोलें, और आप तेजी से कुछ हज़ारों लाइनों
  • वास्तव में महत्वपूर्ण खाते में ध्यान देने योग्य चीज़ है: आपके लिए काम करना आसान होगा और आपकी टीम ?
  • कई छोटी फ़ाइलों को लोड करने से कई सिस्टम कॉल हो सकती हैं, जो धीमी हैं; लेकिन उन शायद ओएस द्वारा कैश किया जाएगा ... तो शायद नहीं है कि प्रासंगिक
  • तुम भी 1 डेटाबेस क्वेरी कर रहे हैं, यह एक (PHP सर्वर और डीबी सर्वर के बीच नेटवर्क सहित राउंड ट्रिप) शायद होगा कुछ हज़ार लाइनों के पार्सिंग से अधिक समय लें ;-)
1

यदि आप 4000 लाइन फ़ाइल लोड करते हैं और 10 लाइनों के 1 फ़ंक्शन का उपयोग करते हैं, तो हाँ मैं कहूंगा कि यह अक्षम है। यहां तक ​​कि यदि आपने संयुक्त 1000 लाइनों के बहुत सारे फ़ंक्शंस का उपयोग किया है, तो यह अभी भी अक्षम है।

मेरा सुझाव समूह से संबंधित कार्यों को एक साथ समूहित करना और उन्हें अलग-अलग फ़ाइलों में स्टोर करना होगा। इस तरह यदि कोई पृष्ठ केवल तभी व्यवहार करता है, उदाहरण के लिए, डेटाबेस फ़ंक्शंस आप केवल अपने डेटाबेस फ़ंक्शन फ़ाइल/लाइब्रेरी को लोड कर सकते हैं।

कार्यों को विभाजित करने के लिए अनोथ कारण रखरखाव है। यदि आपको कोई फ़ंक्शन बदलने की आवश्यकता है तो आपको इसे अपने एकाधिकार में फ़ाइल में शामिल करने की आवश्यकता है। आपके पास ऐसे कार्य भी हो सकते हैं जो बहुत ही समान हैं लेकिन इसे भी महसूस नहीं करते हैं। उनके द्वारा किए गए कार्यों को क्रमबद्ध करने से आप उनकी तुलना कर सकते हैं और उन चीजों से छुटकारा पा सकते हैं जिनकी आपको आवश्यकता नहीं है या दो कार्यों को एक और सामान्य उद्देश्य समारोह में विलय करें।

+0

अच्छे अंक धन्यवाद – JasonDavis

1

अधिकांश समय डिस्क आईओ आपके सर्वर को मार देगा जो मुझे लगता है कि डिस्क से कम फ़ाइलों को बेहतर तरीके से प्राप्त किया जाता है। इसके अलावा यदि एपीसी स्थापित करना संभव है तो फ़ाइल को स्मृति में संकलित किया जाएगा जो एक बड़ी जीत है।

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