PHP

2010-05-30 18 views
16

में अनुरोधों के बीच ऑब्जेक्ट्स को कैसे बनाए रखें मैं अतीत में रेल, मेरब, डीजेंगो और एएसपीएनटी एमवीसी अनुप्रयोगों का उपयोग कर रहा हूं। उनके पास क्या आम है (जो प्रश्न के लिए प्रासंगिक है) यह है कि उनके पास कोड है जो ढांचे को स्थापित करता है। इसका आमतौर पर ऑब्जेक्ट्स और राज्य बनाना होता है जो तब तक जारी रहता है जब तक कि वेब सर्वर का पुनर्नवीनीकरण न हो (जैसे रूटिंग सेट करना, या जांचना कि कौन से नियंत्रक उपलब्ध हैं आदि)।PHP

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

मेरा प्रश्न है: कैसे कोई एक PHP अनुप्रयोग बना सकता है जो रेल की तरह काम करता है और ऐसे? मेरा मतलब है कि पहले अनुरोध पर एक फ्रेमवर्क सेट अप करता है, फिर दूसरे और बाद के अनुरोधों पर पहले से सेट की गई वस्तुओं का उपयोग करें। क्या mod_php में कैशिंग सुविधा में कुछ बनाया गया है? (उदाहरण के लिए जो निष्पादित php अनुप्रयोगों के संकलित बाइटकोड को संग्रहीत करता है) या एपीसी या कुछ समान एक्सटेंशन का उपयोग इस समस्या को हल करने का एकमात्र तरीका है? आपको इसे कैसे करना होगा?

धन्यवाद।

संपादित करें: वैकल्पिक प्रश्न: यदि मैं एक बड़ा PHP अनुप्रयोग बनाता हूं जिसमें बहुत बड़ा सेट अप समय होता है, लेकिन मामूली चलने का समय (ऊपर वर्णित ढांचे में) तो मुझे पहले से सेट की गई चीज़ों को कैश करना चाहिए अप (इसका मतलब हो सकता है कि डेटाबेस कनेक्शन को छोड़कर बहुत सी चीजें हो सकती हैं, क्योंकि इसके लिए आपके पास पहले से ही PHP में लगातार कनेक्शन हैं)।

बड़े सेट अप समय को उचित ठहराने के लिए: यदि मैं PHP प्रतिबिंब का उपयोग कर रहा हूं यह जांचने के लिए कि कौन सी ऑब्जेक्ट उपलब्ध हैं और रनटाइम सेट करें। बहुत सारे प्रतिबिंब करना आमतौर पर धीमा होता है, लेकिन इसे केवल एक बार करना पड़ता है (और केवल तब ही मूल्यांकन करें जब स्रोत कोड संशोधित हो)।

EDIT2: ऐसा लगता है कि यह एपीसी है। तथ्य यह है कि यह बाइटकोड को स्वचालित रूप से कैश करता है यह जानना अच्छा होता है।

उत्तर

5

सुनिश्चित नहीं है कि एपीसी एकमात्र समाधान है लेकिन एपीसी आपके सभी मुद्दों का ख्याल रखता है।

सबसे पहले, आपकी स्क्रिप्ट एपीसी के साथ एक बार संकलित की जाएगी और बाइटकोड स्मृति में संग्रहीत है।

यदि आपके पास सेटअप करने में लंबा समय लगता है, तो आप इसे एपीसी में उपयोगकर्ता डेटा के रूप में भी कैश कर सकते हैं। उदाहरण के लिए, मैं यह हर समय करता हूं,

  $table = @apc_fetch(TABLE_KEY); 

      if (!$table) { 
        $table = new Table(); // Take long time 
        apc_store(TABLE_KEY, $table); 
      } 

एपीसी के साथ, तालिका बनाने का कार्य प्रति सर्वर उदाहरण के बाद ही किया जाता है।

+0

स्क्रिप्ट का प्री-संकलन केवल नौकरी का हिस्सा है। लेकिन अगर मैं इसे मूल रूप से देखता हूं तो मुझे PHP का उपयोग करके भी यह हिस्सा करना है, है ना? मेरा मतलब है उदाहरण के लिए mod_php यह मेरे लिए नहीं करेगा। – SztupY

+1

कोड-कैशिंग पारदर्शी है। आप बस एपीसी स्थापित करते हैं और यह आपके बाइट-कोड को तब तक कैश करेगा जब तक आप इसे अक्षम नहीं करते। मेरे ऐप डेटा में मेरे उदाहरण में $ टेबल की तरह स्वचालित रूप से कैश नहीं किया जाएगा। आपको इसे स्वयं करना है। –

+4

आप 'apc_fetch' को दबा रहे हैं क्यों? ** 'afc_fetch' संग्रहित चर या सफलता पर सरणी की सरणी देता है; विफलता पर गलत **। –

0

मुझे लगता है कि आप कुछ गलत सामान्यीकरण कर रहे हैं। उन सभी ढांचे (उदा: Rails) विभिन्न विन्यास के साथ चलाया जा सकता है। कुछ के तहत, प्रत्येक अनुरोध के लिए एक प्रक्रिया बनाई गई है। यह स्पष्ट रूप से प्रदर्शन को नुकसान पहुंचाता है, लेकिन यह दिखाता है कि ये ढांचे लंबे समय तक चलने वाली प्रक्रिया पर भरोसा नहीं करते हैं। यदि आवश्यक हो तो वे प्रत्येक अनुरोध को सेट अप कर सकते हैं (कॉन्फ़िगरेशन फ़ाइलों को पुन: स्थापित करें, ऑब्जेक्ट बनाएं, इत्यादि)।

बेशक, mod_php (जिस तरह से PHP आमतौर पर उपयोग किया जाता है) सीजीआई के विपरीत, वेब सर्वर प्रक्रिया के अंदर चलाता है। इसलिए मुझे केकपीएचपी (उदाहरण के लिए) और रेल के बीच मौलिक रूप से कुछ भी दिखाई नहीं देता है।

मुझे लगता है कि शायद आप पाइथन के WSGI या रुबी के Rack, लेकिन PHP के लिए कुछ ढूंढ रहे हैं। यह किसी एप्लिकेशन के लिए इंटरफ़ेस निर्दिष्ट करता है (भाषा कैसे चलती है)। एक नए अनुरोध के लिए, एप्लिकेशन ऑब्जेक्ट का एक नया उदाहरण बनाया गया है। जहां तक ​​मुझे पता है, यह PHP के लिए मौजूद नहीं है।

+1

हां, लेकिन आमतौर पर उन्हें प्रत्येक अनुरोध के बाद त्याग दिया जाता है और पुन: उत्पन्न नहीं किया जाता है। बेशक आप इस तरह से रेल काम कर सकते हैं, लेकिन इसका मतलब यह भी होगा कि आपके पास प्रत्येक अनुरोध के 3-4 सेकंड सेटअप समय है। और कुछ लोगों के लिए भी अगर नई प्रक्रियाएं उत्पन्न होती हैं तो वे सेट अप फ्रेमवर्क से कुछ साझा करते हैं। – SztupY

+0

सेटअप समय के 3-4 सेकंड एक भव्य अतिव्यक्ति का थोड़ा सा है, मानक रेल अनुरोधों में मेरी विकास मशीनों पर 100 मिलीसेकंड से कम लेते हैं (जिसका अर्थ है कि आरओआर विकास में चल रहा है जिसका अर्थ है कि यह हर बार फाइलों को पार्स कर रहा है)। संपादित करें: मानक फ्रेमवर्क के मुकाबले आपके पास संभवतः एक बहुत ही जटिल सेटअप है, इसलिए यह टिप्पणी निष्क्रिय है। –

+0

रेल आमतौर पर एक अलग प्रक्रिया के रूप में चलाया जाता है जिसके लिए वेब सर्वर कनेक्ट होता है जब इसे किसी अन्य प्रक्रिया की आवश्यकता होती है। इन प्रक्रियाओं को संभालने के लिए यात्री/mod_rails का उपयोग किया जाता है। AFAIK mod_php एक अलग सर्वर अनुप्रयोग प्रक्रिया नहीं बनाएगा (न ही यह उससे कनेक्ट होगा), यह केवल php फ़ाइल की व्याख्या करेगा, और यह करने के लिए यह करने के लिए यह PHP फ़ाइल पर निर्भर है। केकेपीएचपी स्रोत कोड को देखते हुए ऐसा लगता है कि इसमें कुछ कैशिंग समर्थन है, लेकिन मुझे नहीं पता कि यह वास्तव में कैश करता है। – SztupY

3

PHP (और उस मामले के लिए रूबी) व्याख्यात्मक भाषाएं हैं। यही वह फाइल है जब भी वे अनुरोध किए जाते हैं और मुझे लगता है कि आप कह सकते हैं कि एक छद्म बाइट कोड में परिवर्तित कर दिया गया है। यह अधिक 'स्पष्ट' है कि कोई कह सकता है कि PHP RoR कहने से अधिक है लेकिन वे दोनों एक ही तरीके से व्यवहार करते हैं।

अनुरोधों के बीच लगातार डेटा की सुविधा सर्वर की एक विशेषता है जो भाषा की नहीं है। उदाहरण के लिए, जो आरओआर रूटिंग आप बोलते हैं वह वास्तव में कैश किया जाता है लेकिन यह सर्वर की स्थानीय मेमोरी में कैश किया जाता है। यह संकलित और तेजी से readins के लिए संग्रहीत नहीं है।सर्वर (और सर्वर से मेरा मतलब है कि बॉक्स & दोनों वेब सेवा उदाहरण) इस जानकारी को फिर से शुरू कर देता है। आपके द्वारा अभी भी बोलने वाले 'ढांचे को स्थापित करने' में ढांचे में शामिल प्रत्येक फ़ाइल को पार्स करना शामिल है। रेल बार-बार अनुरोध के दौरान प्रत्येक फ़ाइल को पार करते हैं, उत्पादन स्तर की विशेषताएं वास्तव में स्मृति में इस डेटा को कैश कर सकती हैं लेकिन निश्चित रूप से विकास में यह नहीं है। इसका एकमात्र कारण मैं इसका उल्लेख करता हूं क्योंकि यह दिखाता है कि यह सर्वर की एक विशेषता है जो भाषा नहीं है।

PHP में एक ही चीज़ को प्राप्त करने के लिए आप ज़ेंड सर्वर का उपयोग कर सकते हैं। जहां तक ​​मुझे पता है कि यह एकमात्र PHP दुभाषिया है जो 'संकलित' करेगा और बाइट कोड का उपयोग करते समय कहा जाएगा। अन्यथा आपको उस डेटा को स्टोर करने का तरीका ढूंढना होगा जिसे आप अनुरोधों पर जारी रखना चाहते हैं। जैसा कि आपने उल्लेख किया है एपीसी एक बहुत शक्तिशाली विशेषता है, एक अधिक वितरित एक मेमकैच किया गया है और फिर निश्चित रूप से डिस्क & वर्ग जैसे अधिक लगातार रूप हैं।

मुझे यह जानने में दिलचस्पी है कि आप यह विशेष सुविधा क्यों चाहते हैं। क्या आप प्रदर्शन के मुद्दों को देखते हैं जिन्हें ऐसा करके हल किया जाएगा?

+0

जैसा कि संपादन से पता चलता है कि मैं कई चीजों को बनाने के लिए प्रतिबिंब का उपयोग कर रहा हूं (मुख्य रूप से अधिक डीआरवाई होने के लिए), और यह काफी धीमा है (कम से कम कुल समय के मामले में: 95% सेटअप समय है), लेकिन यह केवल एक बार किया जाना चाहिए। मैं इस बात पर उत्सुक हूं कि PHP समुदाय इस तरह की "समस्याएं" कैसे हल करता है (या वास्तव में क्या वे इन "समस्याओं" को हल करते हैं?)। – SztupY

+0

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

+0

मैं वास्तव में सिर्फ उत्सुक हूँ। पिछले 4 वर्षों से मैं PHP का उपयोग नहीं कर रहा हूं, और इसका उपयोग अन्य ढांचे के काम के तरीके के लिए किया गया था। मुझे लगता है कि सेट अप चरण के दौरान वे बहुत अधिक प्रतिबिंब (मुख्य रूप से एएसपी.नेट एमवीसी) का उपयोग करते हैं और अधिक डीआरवाई होने के लिए, और मैं इसे PHP में भी करना चाहता था। स्पष्ट रूप से PHP को तेजी से प्रतिबिंब उपयोग के लिए डिज़ाइन नहीं किया गया था, लेकिन मुझे तब तक परवाह नहीं है जब तक कि इसे केवल कुछ बार नहीं किया जाना चाहिए, न कि सभी अनुरोधों के लिए। – SztupY

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

  • कोई संबंधित समस्या नहीं^_^