2011-01-01 19 views
20

चूंकि मैंने पीईसीएल के साथ PHP के लिए एपीसी स्थापित किया है, मुझे कभी-कभी ये त्रुटियां मिलती हैं: समय-समय पर Cannot redeclare class xxxएपीसी के साथ PHP: घातक त्रुटियां: वर्ग को पुन: वर्गीकृत नहीं कर सकते हैं

xxx परिवर्तन। मैं एपीसी अक्षम कर सकता हूं लेकिन एपीसी प्रदर्शन को बेहतर बनाता है! क्या कोई ज्ञात बग है या क्या मैं इन त्रुटियों को रोकने के लिए कुछ और कर सकता हूं? मैं PHP 5.2.4 के साथ उबंटू 8.04 एलटीएस का उपयोग कर रहा हूं।


संपादित/अद्यतन (टिप्पणियों से):

मैं ज़ेंड फ्रेमवर्क ऑटोलोडर का उपयोग करता हूं और एपीसी सक्षम करने से पहले ये त्रुटि कभी नहीं हुई। कुछ पलों पहले मुझे उदाहरण के लिए मिलता है कि त्रुटि: Fatal error: require(): Cannot redeclare class zend_db_adapter_abstract in /paths/app/lib/Zend/Db/Select.php on line 27

+1

पूरे त्रुटि संदेश पढ़ें। कहा गया फ़ाइल दो बार शामिल न करें। 'Include_once' का प्रयोग करें। या उसमें विफल होने पर, 'if (! Class_defined ("xxx")) में सभी परिभाषाओं को लपेटें {' – mario

+0

केवल include_once का उपयोग करने के अलावा, क्लास ऑटोलोडिंग का उपयोग करने के लिए एप्लिकेशन को पुन: आर्किटेक्ट करें, ताकि PHP केवल फाइलों को शामिल करे जब जरूरत। सामान्य ज्ञान की चीज़ों के साथ चिपके रहें, जैसे प्रति वर्ग एक वर्ग, आदि – Rob

+1

xxx द्वारा आपका क्या मतलब है? xxx वास्तव में वह कक्षा है जिसे आप लोड करना चाहते हैं? –

उत्तर

1

खैर यह है कि यह include_once directivse कि विभिन्न स्थानों से अपेक्षाकृत कहा जाता है ऊपर मिक्स एपीसी के साथ एक ज्ञात समस्या है।

तो यदि आप include_once myclass.php करते हैं और फिर उपनिर्देशिका में include_once ../myclass.php एपीसी इसे मिश्रित कर सकता है और इसकी अलग-अलग फाइलों को सोच सकता है और इसे दो बार लोड करता है।

हालांकि यह बाद के संस्करणों में तय किया गया है।

यदि आप दो बार लोड होने वाली कक्षा में अपना कोड ड्रिल कर सकते हैं तो आप कुछ जांच कर सकते हैं कि कक्षा class_defined या कुछ कॉल करने योग्य सामग्री के साथ पहले से लोड हो चुकी है या नहीं।

आप कुछ फ़ाइलों को कैश किए जाने से रोकने के लिए apc.filter निर्देश का भी उपयोग कर सकते हैं।

+0

ऊपर मेरी टिप्पणी देखें। – Poru

+0

अच्छी तरह से समस्या वही रहती है। अपने एपीसी संस्करण और/या ज़ेंड फ्रेमवर्क को अपग्रेड करें या आपको या तो अपने ज़ेंड फ्रेमवर्क को पैच करना होगा, ज़ेंड इश्यू ट्रैकर या मैबी पर समाधान उपलब्ध हैं, आप अपने एप्लिकेशन में अपवाद पकड़ सकते हैं। –

2

हममम, प्रतीत हो रहा है एक common issue:

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

एक समाधान ज़ेंड ऑटोलोडर को अनुकूलित करना होगा, और मैन्युअल रूप से लोड किए गए वर्गों की सूची और (पूर्ण और निचले स्तर पर) फ़ाइल नामों को include_once के बदले में proofcheck में रखना होगा।

अन्यथा, अत्यधिक xdebug-ing आज़माएं। आपके सेटअप तक पहुंच के बिना, हम यहां अनुमान लगा सकते हैं।

12

जैसे ही मैंने एपीसी सक्षम किया, मुझे PHP पुस्तकालयों के समूह के साथ एक ही समस्या थी। बहुत सारे बाल खींचने के बाद मैंने पाया कि सेटिंग apc.include_once_override = 0 चीजों को मंजूरी दे दी है। अभी भी निगरानी है लेकिन समस्या फिर से नहीं हुई है (इससे पहले कि मैं एपीसी कैश साफ़ करके त्रुटि उत्पन्न करने में सक्षम था)।सभी 3 बिना

apc.include_once_override = 0 
apc.canonicalize = 0 
apc.stat = 0 

, मैं लगातार त्रुटि मिलती हैं, लेकिन तीनों के साथ मैं अब त्रुटि मिलती है लगते हैं :):

12

निम्नलिखित कॉन्फ़िगरेशन के संयोजन मेरे लिए यह तय !

+0

ये तीन दुर्भाग्य से मेरे लिए काम नहीं कर रहे हैं (एपीसी 3.1.13 और PHP 5.4.24 सेंटोस 6.5)। वर्डप्रेस के साथ यह वाकर_Page क्लास है कि इसका दावा फिर से किया जा रहा है, भले ही फ़ाइल को एक से अधिक बार नहीं बुलाया जा रहा हो। मैं गहरी खुदाई करूंगा और देख सकता हूं कि मुझे क्या मिल सकता है। – Jason

+0

क्षमा करें जेसन, यह एपीसी और PHP के कुछ पुराने संस्करण के साथ काम किया। मुझे यकीन है कि उस समय के साथ PHP संस्करण मैं काम कर रहा था 5.3 से अधिक नया नहीं था। * – Peter

3

cron के तहत चल रहे एक php स्क्रिप्ट में PHP2 के लिए अमेज़ॅन के AWS SDK का उपयोग करते समय यह त्रुटि हुई। more info लिए

/usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php 

: एक समाधान के रूप में नीचे दिखाया गया -d apc.enabled=0 के माध्यम से apc निष्क्रिय करने के लिए किया गया था।

[APC] 
apc.cache_by_default = 0 

apc.stat = 0 सर्वर के साथ कैश में php फ़ाइलें लोड करता है, यदि आप इसे संशोधित करने, php अब भी वही लोड करता है:

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