2009-09-01 14 views
7

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

PHP Fatal error: Cannot redeclare class Zend_Registry in 
    C:\\[mydir]\\library\\zendframework\\Zend\\Registry.php on line 0 

मैं Zend 1.9.1, सिद्धांत 1.1 चल रहा हूँ:

Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: 
    Class Doctrine_Event could not be loaded in 
    C:\\[mydir]\\library\\doctrine\\Doctrine\\Record.php on line 777 

अगर मैं XCache के साथ की कोशिश मैं निम्नलिखित मिल:

अगर मैं एपीसी के साथ प्रयास करें, मैं निम्नलिखित मिल एक विंडोज बॉक्स पर।

मेरे बूटस्ट्रैप इस प्रकार है:

set_include_path(dirname(__FILE__).'/../library/zendframework' 
. PATH_SEPARATOR . dirname(__FILE__).'/../library/doctrine'..... 

require 'Zend/Loader/Autoloader.php'; 

$loader = Zend_Loader_Autoloader::getInstance(); 
$loader->suppressNotFoundWarnings(false); 
$loader->setFallbackAutoloader(true); 

मैं क्या पढ़ा है, एपीसी का उपयोग कर या XCache है लगभग प्रदर्शन के लिए जरूरी से, लेकिन मैं यह काम करना आरंभ नहीं कर पा रहे। कोई विचार?

उत्तर

10

आप अपने index.php के अंत में "Zend_Session::writeClose(true);" डाल सकते हैं।
आवश्यक ऑब्जेक्ट्स (ज़ेंड_लोडर इत्यादि) से पहले यह सत्र को एक सतत स्थिति में लिख देगा।

बेहतर: इसे shutdown function के रूप में पंजीकृत करें।
तो यह निष्पादित किया जाएगा, भले ही आप exit(), die() का उपयोग करें या एक fatal error occures:

register_shutdown_function(array('Zend_Session', 'writeClose'), true); 
+0

यह एपीसी का उपयोग करके मेरे लिए हल किया गया। – smoove

+0

register_shutdown_function के लिए क्रेडिट होगबर्ग और बटाल में जाता है। –

0

क्या पथ शामिल करने में कुछ और है? शायद अपने पहले एपीसी उदाहरण में उस पंक्ति से पहले पथ को शामिल करने का प्रयास करें।

एक्सकैच एक वास्तव में अजीब है। हालांकि यह परियोजना काफी मृत है, और मैं इसे PHP 5.2+ पर भरोसा नहीं करता। इसके बजाय eaccelerator आज़माएं? हमारे पास इसके साथ सबसे अच्छा भाग्य है।

+0

पथ (मॉडल, आदि) में अन्य सिद्धांत-विशिष्ट चीजें हैं। हम एक ज़ेंड कैश बैकएंड (http://framework.zend.com/manual/en/zend.cache.backends.html) की तलाश में हैं, इसलिए eaccelerator काम नहीं करेगा। –

+0

एक ईसीसेलरेटर बैकएंड के लिए एक प्रस्ताव है http://framework.zend.com/wiki/display/ZFPROP/Zend_Cache_Backend_Eaccelerator+-+Federico+Cargnelutti - वास्तव में कार्यान्वित करने के लिए बहुत आसान होना चाहिए। वैसे भी मैं सोच रहा था कि अगर कुछ भी आपके इरादे को हटा रहा है तो उस त्रुटि को फेंकने से पहले कुल से पथ शामिल हैं। – Justin

3

यह शायद कस्टम सत्र से निपटने और एपीसी-कैश के साथ समस्या के समान है। यदि आपने कस्टम सत्र हैंडलर असाइन किया है तो यह PHP में RSHUTDOWN के साथ पंजीकृत है। यह वही दिनचर्या है जो एपीसी PHP में आंतरिक संघर्ष बनाने के लिए उपयोग करता है और आपके कस्टम सत्र हैंडलर सभी स्थितियों में बंद नहीं होगा।

तो क्या आप वाकई मैन्युअल बंद

पर कस्टम सत्र हैंडलर बंद का सबसे अच्छा तरीका है कि मामले में आप किसी भी बाहर निकलने की क्या ज़रूरत है करने के लिए है अपने index.php के अंत में एक "Zend_Session::writeClose(true);" लाना नहीं करना होगा; कहीं भी अपनी स्क्रिप्ट में कॉल करता है।

यह इस तरह से बंद हैंडलर रजिस्टर करने के लिए बेहतर है:

function shutdown() 
{ 
Zend_Session::writeClose(true); 
} 

register_shutdown_function('shutdown'); 

रखो कि अपने index.php फ़ाइल के शीर्ष में यकीन है कि पहले किसी भी अन्य लिपियों चलाए जा रहे हैं कि बंद प्रक्रिया पंजीकृत है बनाने के लिए।

0

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

अपनी स्क्रिप्ट के अंत में Zend_Session::writeClose(true); रखने हमेशा इसे काट नहीं सकता है, क्योंकि आप अपने कोड में exit; की, die(); की, आदि हो सकता है। इस मामले में, आप

register_shutdown_function(array('Zend_Session', 'writeClose'), true);

उपयोग कर सकते हैं या, बस

register_shutdown_function('session_write_close');

यदि आप सत्रों के लिए Zend का उपयोग नहीं करते।

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