RedHat EL v6 पर 5.5.14 पर अपने PHP इंस्टॉलेशन को अपडेट करने के बाद मुझे यह त्रुटि आई। मैंने Yum पैकेज मैनेजर के माध्यम से PHP को स्थापित किया था, और फिर मेरे द्वारा उपयोग किए जा रहे कुछ PHP एक्सटेंशन को फिर से स्थापित करने की आवश्यकता थी। इस मुद्दे को कैसे हल किया जाए, इसके सुझाव के बारे में, मैं इस सवाल पर आया था, और अब जब मैंने एक काम करने वाला समाधान खोज लिया है तो मैं यहां अपने निष्कर्षों को साझा करना चाहता था। अन्य सुझाव जो मुझे ऑनलाइन मिले थे, जिनमें PECL / PEAR को मिटाना और फिर से स्थापित करना शामिल था और यहां तक कि मेरे PHP इंस्टॉलेशन ने भी इस समस्या को हल नहीं किया। अंत में कुछ और शोध और PECL / PEAR के स्रोत कोड की समीक्षा करने के बाद मुझे असली कारण मिला। उम्मीद है कि दूसरों की मदद के लिए क्या होगा:
PECL को चलाने का प्रयास करते समय आपको यह त्रुटि दिखाई दे सकती है यदि आपके PHP इंस्टॉलेशन में डिफ़ॉल्ट रूप से XML सक्षम नहीं है, लेकिन इसके बजाय XML समर्थन आमतौर पर एक PHP एक्सटेंशन मॉड्यूल के माध्यम से आपके PHP इंस्टॉलेशन में लोड किया जाता है (यह तब हो सकता है ./configure --disable-xml
जब PHP का निर्माण करते समय ध्वज निर्दिष्ट किया गया था स्रोत से, या यदि आपने विभिन्न पैकेज प्रबंधकों के माध्यम से PHP स्थापित किया है, जहां PHP का निर्माण एक्सएमएल को एक विस्तार मॉड्यूल के माध्यम से लोड करने के लिए कॉन्फ़िगर किया गया है)।
ध्यान दें कि PECL से त्रुटि आउटपुट की अंतिम पंक्ति कैसे है XML Extension not found
- यह त्रुटि दिखाई देने का कारण है क्योंकि PECL अपने XMLParser.php वर्ग का उपयोग करने का प्रयास करता है, क्योंकि यह XML एक्सटेंशन तक पहुंच नहीं सकता है (यह XML मॉड्यूल के लिए जाँच करता है extension_loaded('xml')
लाइन के आसपास) XMLParser.php स्रोत का 259), और XML मॉड्यूल अनुपलब्ध होने के कारण, यह इसकी कॉन्फ़िगरेशन / सेटिंग्स फ़ाइलों को पार्स नहीं कर सकता है और ऊपर देखी गई अन्य त्रुटियों के सभी आउटपुट करता है।
PECL संचालित करने के तरीके के कारण यह समस्या होती है। PECL कमांड अपने आप में केवल एक शेल स्क्रिप्ट है, जो पहले यह बताती है कि आपके सिस्टम इंस्टॉलेशन पर PHP कहाँ स्थापित है, और फिर मुख्य PECL PHP स्क्रिप्ट फ़ाइल को पथ प्रदान करने से पहले PHP को कमांड लाइन पर कई झंडों के साथ कॉल करता है। समस्या ध्वज जो PECL शेल स्क्रिप्ट का उपयोग कर रहा है, वह -n
विकल्प है, जो PHP को किसी भी php.ini
फाइल को अनदेखा करने के लिए कहता है (और इसलिए PHP आपकी php.ini
फ़ाइल के निर्दिष्ट अतिरिक्त एक्सटेंशन को लोड नहीं करेगा , इस मामले में XML भी शामिल है)।
-n
निम्नलिखित दो आदेशों को चलाकर ध्वज के प्रभाव को देख सकते हैं :
- पहले
php -m
कमांड लाइन पर चलने का प्रयास करें
- तब आउटपुट की तुलना करें
php -n -m
जब आप दूसरी कमांड चलाते हैं तो आपको एक्सएमएल एक्सटेंशन को सूचीबद्ध नहीं देखना चाहिए क्योंकि -n
ध्वज ने बताया कि PHP हमारी php.ini
फाइल को पार्स नहीं करता है ।
यदि आप vi `which pecl`
कमांड लाइन पर चलते हैं, तो आपको PECL कमांड की सामग्री को देखना चाहिए (जैसा कि ऊपर उल्लेख किया गया है, इसकी सिर्फ एक शेल स्क्रिप्ट है), और यदि आप अंतिम लाइन का निरीक्षण करते हैं, तो आपको कुछ इस तरह दिखाई देगा:
exec $PHP -C -n -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d safe_mode=0 -d register_argc_argv="On" $INCDIR/peclcmd.php "$@"
आप देखना चाहिए -n
के बीच सूचीबद्ध झंडा -C
और -q
झंडे। यदि आप PECL शेल स्क्रिप्ट को संपादित करते हैं, तो उस -n
ध्वज को छोड़ना चाहिए जिसे अब आप PECL को बिना किसी समस्या के फिर से चला सकते हैं।
वैकल्पिक रूप से, आप PHP को स्रोत से यह सुनिश्चित कर सकते हैं कि XML मॉड्यूल रन-टाइम पर PHP एक्सटेंशन मॉड्यूल से लोड किए जाने के बजाय PHP बाइनरी में संकलित हो। स्पष्ट रूप से -n
ध्वज को हटाने के लिए PECL शेल स्क्रिप्ट को संपादित करना केवल समस्या को ठीक करेगा जब तक कि PECL / PEAR पुनः स्थापित नहीं हो जाता, उम्मीद है कि हालांकि PECL / PEAR के अनुरक्षक इस फिक्स के साथ अपने रेपो को अपडेट कर सकते हैं। यह सुनिश्चित करना कि PHP का निर्माण XML समर्थन के साथ किया गया है, हालांकि समाधान के लिए एक दीर्घकालिक फिक्स है, लेकिन हर किसी की परिस्थितियों के लिए आदर्श नहीं हो सकता है।
पूर्णता के लिए, यदि आप चलाते vi `which pear`
हैं तो आप PECL द्वारा उपयोग की जाने वाली एक समान शेल स्क्रिप्ट देखेंगे, हालांकि -n
ध्वज उस कमांड से गायब है जो PHP को कॉल करता है और जैसे PEAR कमांड इन समान मुद्दों के अधीन नहीं है।