2012-10-19 19 views
18

मैं एक ऐसे वेब एप्लिकेशन पर काम कर रहा हूं जो प्रति सेकंड दर्जनों समवर्ती उपयोगकर्ताओं को देखता है। मेरे पास एक वर्ग है जो उसी पृष्ठ लोड के भीतर कई बार तत्काल हो जाएगा। उस वर्ग में, मेरे पास कुछ गुण हैं जो हमेशा प्रत्येक ऑब्जेक्ट में समान होंगे, इसलिए मैं इन गुणों को static के रूप में घोषित करने के प्रयास में सोच रहा हूं, जो स्मृति का उपयोग करने के प्रयास में उपयोग किए जाएंगे, जब इस कक्षा के कई उदाहरण तत्काल होते हैं एक ही पृष्ठ अनुरोध।PHP में स्थिर विधियों और गुणों का उपयोग कम स्मृति का उपयोग करता है?

क्या यह इस एप्लिकेशन के लिए कम स्मृति का उपयोग करेगा क्योंकि PHP केवल स्थिर गुणों के मूल्य को स्टोर कर सकता है? क्या यह समवर्ती उपयोगकर्ताओं, या बस प्रत्येक PHP प्रक्रिया के भीतर स्मृति को सहेज लेगा?

यह विधियों के लिए कैसे काम करता है? यदि इसका मतलब है कि ऑब्जेक्ट्स एक ही तरीके रीसायकल कर सकते हैं, तो यदि आप स्मृति पर सहेजने की कोशिश कर रहे हैं तो कक्षा के सभी तरीकों को स्थैतिक घोषित क्यों नहीं किया जाएगा?

मुझे पूरी तरह से सहज महसूस नहीं होता है कि जब कोई संपत्ति या विधि स्थिर घोषित करता है, लेकिन मैं समझता हूं कि उन्हें स्थिर के रूप में घोषित करने से उन्हें कक्षा के किसी ऑब्जेक्ट को तत्काल किए बिना एक्सेस किया जा सकता है (यह एक जैसा लगता है हैक ... इन तरीकों और गुण कहीं और होना चाहिए ... नहीं?)। मुझे विशेष रूप से static घोषणा में दिलचस्पी है कि स्मृति उपयोग को मेरे वेब सर्वर पर यथासंभव कम रखने के प्रयास में मेमोरी उपयोग को प्रभावित करता है ... और सामान्य रूप से मुझे क्या हो रहा है इसकी बेहतर समझ है।

+5

मुझे समझ में नहीं आता कि यह क्यों बंद कर दिया गया है। सवाल बहुत विशिष्ट है और निश्चित रूप से एक सटीक और गैर-बहस योग्य उत्तर है। –

+0

वास्तव में अच्छा और सटीक प्रश्न है, लेकिन मैं आपके प्रश्न के लिए PHP (जो ओओपी से लिया गया है) में किसी फ़ंक्शन की दृश्यता को इंगित करना चाहता हूं "_ अगर इसका मतलब है कि ऑब्जेक्ट्स एक ही तरीके रीसायकल कर सकते हैं, तो सभी विधियां क्यों नहीं होंगी यदि आप स्मृति पर सहेजने की कोशिश कर रहे हैं तो एक वर्ग को स्थिर घोषित किया जाएगा? _ "। फ़ंक्शंस स्थिर हो सकते हैं, और फ़ंक्शंस स्थिर नहीं हैं - जो क्लास वेरिएबल्स को प्राप्त/सेट करते हैं, वे बोलने के लिए कक्षा प्रारंभिक प्रक्रिया पर निर्भर करते हैं। मुख्य सीमा उस वस्तु (तत्काल) है जिसे आप उस समय से निपट रहे हैं। – ozanmuyes

उत्तर

15

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

प्रोग्रामिंग प्रतिमान से, आम तौर पर लोग स्मृति प्रबंधन अनुकूलन से अधिक आर्किटेक्चरल फायदे के लिए स्थिर चर का उपयोग करना चुनते हैं। दूसरे शब्दों में, कोई आपके द्वारा वर्णित स्थिर चर बना सकता है, जब कोई सिंगलटन या फैक्ट्री पैटर्न को कार्यान्वित करना चाहता है। यह "ऑब्जेक्ट" स्तर पर पारदर्शी होने के विरोध में "वर्ग" स्तर पर क्या हो रहा है, यह जानने के अधिक शक्तिशाली तरीके प्रदान करता है।

4

PHP में स्थिर तरीकों और गुणों का उपयोग कम स्मृति का उपयोग करता है?

शायद। लेकिन, आप अपने ओओपी आर्किटेक्चर के साथ क्यों गड़बड़ करेंगे?

क्या इससे कोई फर्क पड़ता है?

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

+0

यहां कुछ अच्छे सुझाव दिए गए हैं, विशेष रूप से PHP में जो लोड हो रहा है उसे कम करना। धन्यवाद। –

+0

@ टी। ब्रायन जोन्स बेशक मैं इस पर विस्तार कर सकता हूं, लेकिन यह आपके प्रश्न के दायरे से बाहर है। लेकिन आप एपीसी, memcache, अनुसंधान कर सकते हैं ... – Tchoupi

+0

@MathieuImbert: क्या आप कह सकते हैं कि "यदि आप जीडी का उपयोग नहीं करते हैं, तो इसे लोड न करें"। क्या आपका मतलब है कि इसे 'php.ini' कॉन्फ़िगरेशन में सभी जीडी एक्सटेंशन में लोड न करें? –

1

कई पुनरावृत्तियों पर स्टेटिक विधि कॉल तेज हैं, लेकिन स्थैतिक विधियां वास्तव में स्मृति को सहेजती नहीं हैं।

यदि आपके द्वारा घोषित कक्षा में कोई भी गुण नहीं है जो प्रत्येक ऑब्जेक्ट उदाहरण के लिए अद्वितीय होने की आवश्यकता है, तो आप प्रत्येक विधि और संपत्ति को स्थैतिक घोषित कर सकते हैं। यदि, हालांकि, आपके पास गुण हैं जिन्हें प्रत्येक ऑब्जेक्ट से बाध्य करने की आवश्यकता है, तो स्थैतिक विधियां सहायक नहीं हैं। इसका कारण यह है कि स्थैतिक तरीकों के अंदर, $this का कोई संदर्भ नहीं है, इसलिए आप स्थैतिक तरीकों से ऑब्जेक्ट गुणों का संदर्भ नहीं दे सकते।

इस की बेहतर समझ के लिए Static Keyword पर पढ़ें।

+1

असल में सामान्य तरीके तेज हैं (और मुझे संदेह है कि स्मृति उपयोग के समान सहसंबंध हो सकता है)। अतिरिक्त लागत वस्तु के तत्काल में है। असल में, यदि आप एक ही ऑब्जेक्ट पर 4 विधियों को निष्पादित कर रहे हैं, तो किसी ऑब्जेक्ट के कुल उपयोग में अधिक समय-कुशल हो जाता है। इसके अलावा ओओपी होने के सामान्य तरीकों की मामूली बात है (सभी बीएस के साथ बहुलकता और निर्भरता इंजेक्शन के बारे में) और स्थिर तरीके प्रक्रियात्मक प्रोग्रामिंग प्रतिमान का हिस्सा हैं। –

0

मैं PHP के मेमोरी प्रबंधन में एक विशेषज्ञ नहीं हूं, लेकिन मैं कहूंगा कि आप ज्यादा बचत नहीं करते हैं। यदि आप कितना बचाते हैं और कुछ पहलुओं पर निर्भर करता है:

  • ऑब्जेक्ट का आकार (जब आप कोई उदाहरण बनाते हैं, ऑब्जेक्ट कितना अन्य डेटा रखता है)।
  • आपके द्वारा बनाई गई वस्तुओं की संख्या।

विशेष रूप से वस्तुओं की संख्या महत्वपूर्ण है। यदि आपके पास केवल एक उदाहरण है, तो आप 50% बचाते हैं। इस मामले में:

केस ए - स्टेटिक: आप ऑब्जेक्ट को तुरंत चालू नहीं करते हैं, लेकिन बस स्मृति परिभाषा का उपयोग करें, जो स्मृति में संग्रहीत है। लेकिन वर्ग परिभाषा प्रत्येक अनुरोध के लिए लोड की जाती है, जिसका अर्थ है कि आपके पास समवर्ती अनुरोधों के अनुसार स्मृति में समान श्रेणी की परिभाषाएं हैं।

केस बी - उदाहरण: इसके अतिरिक्त मामले में आपके पास प्रत्येक अनुरोध के लिए इस ऑब्जेक्ट का एक उदाहरण भी है, इस प्रकार आपके सॉफ़्टवेयर के इस हिस्से के लिए मेमोरी उपयोग को दोगुना करें।

अंत में: यदि हर बार कक्षा को तुरंत चालू करने के बजाय स्थिर मानकों के साथ काम करना आपके लिए आसान है, तो आपको स्थिर तरीके से जाना चाहिए। लेकिन मेमोरी बूस्ट की ज्यादा उम्मीद नहीं है।

6

बनाम सिंगलटन परीक्षण स्थिर देखो: http://moisadoru.wordpress.com/2010/03/02/static-call-versus-singleton-call-in-php/

नोट: कुछ कारणों के लिए, stackoverflow multilne विषय नहीं दिखाया जा सका, तो मैं एक तस्वीर जोड़ रहा।

Number of runs Singleton call time (s)  Static call time (s) 
100    0.004005     0.001511 
1,000   0.018872     0.014552 
10,000   0.174744     0.141820 
100,000   1.643465     1.431564 
200,000   3.277334     2.812432 
300,000   5.079388     4.419048 
500,000   8.086555     6.841494 
1,000,000  16.189018     13.696728 

चेकआउट अधिक यहाँ विवरण: https://stackoverflow.com/a/3419411/260080

+0

स्थैतिक के रूप में घोषित एक संपत्ति को तत्काल क्लास ऑब्जेक्ट में एक्सेस किया जा सकता है - इसे – raidenace

+0

True से आज़माएं। एर्म, यह php.net से है, मैंने कोशिश की है, लेकिन वहां दस्तावेज क्यों किया गया है, मुझे नहीं पता था। –

+0

इसे अभी भी आजमाएं :-) – raidenace

-1

आप साझा करते हैं डेटा एक स्थिर का उपयोग करें। यह तेज़ है और आपको ऑब्जेक्ट इंस्टेंटेशन की प्रक्रिया बचाता है। एकल प्रवेश बिंदु की आवश्यकता होने पर सिंगलेट्स बनाम स्थिरता जीतते हैं। मैंने इसे 1 सप्ताह पहले अपने ब्लॉग पर कवर किया था।

+0

स्पष्टीकरण पाउली के लिए धन्यवाद। क्या मैं गलत था? क्या मैं लापरवाही से अपनी वाणिज्यिक वेबसाइट का प्रचार कर रहा था? पॉली इतना बेहतर जगह बनाता है! – CodeAngry