मैं भी कुछ समय से "PHP Warning: oci_new_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that DYLD_LIBRARY_PATH includes the directory with Oracle Instant Client libraries"
मैक ओएस एक्स पर त्रुटि। अंत में बहुत शोध के बाद, मुझे एक समाधान मिला जो इस त्रुटि को स्थायी रूप से ठीक करता है, और दूसरों की मदद के लिए इसे यहां साझा करना चाहता हूं।
एक छोटी सी पृष्ठभूमि के रूप में, मैं ओएस एक्स 10.8.4 (सुहोसिन-पैच के साथ पीएचपी 5.3.15) पर ऐप्पल द्वारा प्रदान की गई PHP की स्थापना का उपयोग कर रहा हूं, और ओरेकल इंस्टेंट क्लाइंट को डाउनलोड करने के बाद ओसीआई 8 एक्सटेंशन को स्थापित करने के लिए पीईसीएल भंडार का उपयोग कर रहा हूं। Oracle.com से डाउनलोड।
मैंने इस त्रुटि के लिए उन सभी समाधानों का भी परीक्षण किया है, जिन्हें मैं DYLD_LIBRARY_PATH
सेट करने सहित ऑनलाइन ढूंढने में सक्षम हूं। , ORACLE_HOME
, और LD_LIBRARY_PATH
मेरे ~/.bash_profile
. में सिस्टम पर्यावरण चर और ~/.bashrc
फ़ाइलें; अपाचे के mod_env
. के माध्यम से पर्यावरण चर को कॉन्फ़िगर करने का प्रयास मॉड्यूल और SetEnv
httpd.conf
. में; putenv("DYLD_LIBRARY_PATH=/...")
के माध्यम से पर्यावरण चर सेट करना PHP कोड में; साथ ही अन्य सुझाव, लेकिन सभी त्रुटि को हल करने में विफल रहे।
एकमात्र काम करने वाला समाधान जो मैंने अतीत में पाया था, जिसका उपयोग मैंने अपने पिछले OS X 10.7.8 इंस्टॉलेशन में किया था, जिसमें Oracle इंस्टेंट क्लाइंट लाइब्रेरी की सामग्री को हमेशा खोजे गए, फिर भी छिपे हुए सिस्टम फ़ोल्डर में कॉपी करना शामिल था:/usr/include
, /usr/bin
, और /usr/lib
. हालांकि, मुझे लगा कि यह समाधान आदर्श नहीं था और संभावित रूप से लंबी अवधि में पुस्तकालयों को बनाए रखना और अपग्रेड करना मुश्किल बना देगा, और मुझे लगा कि इस समस्या का स्थायी समाधान कहीं न कहीं मौजूद होना चाहिए।
अंत में बहुत अधिक शोध के बाद, मैं ओपनएसयूएसई मंचों पर एक पोस्ट पर ठोकर खाई, जिसमें बताया गया था कि कैसे उपयोगकर्ताओं के एक समूह ने ओपनएसयूएसई पर अपाचे/पीएचपी के तहत उसी ओसीआई त्रुटि को हल किया था। फ़ोरम पोस्ट उन टिप्पणियों पर भी विस्तारित हुई जिन्हें मैंने अन्य फ़ोरम पोस्ट में देखा था, जिसमें एक विशिष्ट Apache/PHP सेटअप में कई प्रकार के 'पर्यावरण चर' होने की बात की गई थी:
- अपाचे पर्यावरण चर हैं, जिन्हें आमतौर पर
mod_env
. के माध्यम से कॉन्फ़िगर किया जाता है - येApache Environment
. में दिखाई देते हैंphp_info()
. का अनुभाग पेज. - PHP पर्यावरण चर हैं, जो आमतौर पर
php.ini
. के माध्यम से सेट किए जाते हैं याputenv()
, औरgetenv()
. के माध्यम से अपनी स्क्रिप्ट में पहुंच योग्य बनें और इसी तरह के तरीके। - आखिरकार, मैं यहां 'प्रक्रिया विशिष्ट पर्यावरण चर' के रूप में संदर्भित कर रहा हूं - ये पर्यावरण चर हैं जिन्हें अपाचे प्रक्रिया शुरू होने से पहले और अपाचे लॉन्च प्रक्रिया के हिस्से के रूप में कॉन्फ़िगर किया जाना चाहिए। किसी के
~/.bash_profile
में इन पर्यावरण चरों को निर्दिष्ट करना पर्याप्त नहीं है उदाहरण के लिए। इन विशेष पर्यावरण चरों को अपाचे प्रक्रिया द्वारा लॉन्च होने पर विरासत में मिला है, और महत्वपूर्ण रूप से , अपाचे प्रक्रिया के अन्य स्पॉन सहित और स्वयं PHP द्वारा अपनी सभी चाइल्ड प्रक्रियाओं द्वारा - और यह बहुत ही 'प्रक्रिया विशिष्ट पर्यावरण चर' है जिसे हमें OCI8 लाइब्रेरी के साथ अपनी समस्या को स्थायी और स्थायी रूप से हल करने के लिए कॉन्फ़िगर करने की आवश्यकता है। सही तरीके से कॉन्फ़िगर किए जाने पर, ये पर्यावरण चरEnvironment Variables
. में दिखाई देंगेphp_info()
. का अनुभाग पेज.
मैक ओएस एक्स पर समाधान के लिए मुझे जो सुराग मिला वह ओपनएसयूएसई फोरम पर पोस्ट से था जिसमें फोरम सदस्य, key_nap द्वारा एक टिप्पणी शामिल थी। , जिन्होंने देखा कि जब ओपनएसयूएसई पर अपाचे प्रक्रिया शुरू की गई थी, तो एक विशेष कॉन्फ़िगरेशन फ़ाइल भी लोड की जा रही थी। यह फ़ाइल, /usr/share/apache2/load_configuration
एक बैश स्क्रिप्ट बन गई, और उनके साथ ऐसा हुआ कि वे प्रासंगिक export DYLD_LIBRARY_PATH=...
को शामिल कर सकते हैं इस बैश स्क्रिप्ट के भीतर बयान, और वहां पर्यावरण चर को कॉन्फ़िगर करके, कि वे अपाचे प्रक्रिया और उसके बच्चों द्वारा लॉन्च होने पर विरासत में प्राप्त होंगे।
इससे मुझे आश्चर्य होता है कि मैक ओएस एक्स पर हम इन 'प्रक्रिया विशिष्ट पर्यावरण चर' को सही ढंग से कॉन्फ़िगर करने में सक्षम होंगे। launchd
सिस्टम प्रक्रियाओं की लोडिंग को संभालने के लिए ओएस एक्स पर लगभग विशेष रूप से उपयोग किया जाता है, मुझे आश्चर्य हुआ कि क्या हम अपाचे के launchd
में आवश्यक पर्यावरण चर को कॉन्फ़िगर करने में सक्षम होंगे। विन्यास फाइल? OS X 10.8 पर, आपको Apache का launchd
. खोजना चाहिए कॉन्फ़िगरेशन .plist
/System/Library/LaunchDaemons/org.apache.httpd.plist
पर फ़ाइल करें . जब मैंने अपने सिस्टम पर फ़ाइल खोली, तो मैंने तुरंत पर्यावरण चर निर्दिष्ट करने के लिए एक अनुभाग देखा!
इसलिए हमारा समाधान (मैक ओएस एक्स 10.8.4 पर काम करने के लिए परीक्षण किया गया), org.apache.httpd.plist
को संपादित करना था। नीचे दिखाए अनुसार फ़ाइल (ORACLE_HOME
को शामिल करने पर ध्यान दें) , DYLD_LIBRARY_PATH
, और LD_LIBRARY_PATH
फ़ाइल के EnvironmentVariables अनुभाग में), और फिर sudo apachectl restart
चलाकर Apache को पुनरारंभ करें टर्मिनल से।
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>Label</key>
<string>org.apache.httpd</string>
<key>EnvironmentVariables</key>
<dict>
<key>XPC_SERVICES_UNAVAILABLE</key>
<string>1</string>
<key>ORACLE_HOME</key>
<string>/Users/workstation/Oracle</string>
<key>DYLD_LIBRARY_PATH</key>
<string>/Users/workstation/Oracle/lib</string>
<key>LD_LIBRARY_PATH</key>
<string>/Users/workstation/Oracle/lib</string>
</dict>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/httpd-wrapper</string>
<string>-D</string>
<string>FOREGROUND</string>
</array>
<key>OnDemand</key>
<false/>
<key>SHAuthorizationRight</key>
<string>system.preferences</string>
</dict>
</plist>
Apache launchd
. में इन 'प्रक्रिया विशिष्ट पर्यावरण चर' परिभाषाओं को जोड़कर कॉन्फ़िगरेशन फ़ाइल, हम सुनिश्चित करते हैं कि ये पर्यावरण चर Apache और इसकी सभी चाइल्ड प्रक्रियाओं द्वारा सही ढंग से विरासत में मिले हैं, जिसमें PHP और कोई भी मॉड्यूल PHP लोड जैसे OCI8 शामिल हैं! आपको स्पष्ट रूप से पथ को बदलना चाहिए /Users/workstation/Oracle/...
ऊपर दिए गए उदाहरण में आपके द्वारा Oracle क्लाइंट लाइब्रेरी की स्थापना के लिए सही पथ के साथ दिखाया गया है - उन्हीं मानों का उपयोग करें जैसे आप अपने ~/.bash_profile
में इन पर्यावरण चरों को निर्दिष्ट करते समय करेंगे। ।
यह भी सुनिश्चित करें कि आपके पास अपने सिस्टम के लिए स्थापित Oracle इंस्टेंट क्लाइंट लाइब्रेरी का सही संस्करण है - यानी या तो 32-बिट या 64-बिट वेरिएंट इस पर निर्भर करता है कि आप OS X का कौन सा संस्करण चला रहे हैं और Apache और PHP चल रहे हैं या नहीं 32- या 64-बिट मोड। OS X 10.8 और इसके बाद के संस्करण पर, Apache/PHP को 64-बिट प्रक्रियाओं के रूप में चलना चाहिए। यदि आप अनिश्चित हैं, तो आप वही कर सकते हैं जो मैंने अपने पिछले मैक पर किया था और Oracle इंस्टेंट क्लाइंट लाइब्रेरी बायनेरिज़ के 32- और 64-बिट संस्करणों को lipo
का उपयोग करके सिंगल मल्टी-आर्किटेक्चर फैट-बायनेरिज़ में संयोजित कर सकते हैं। XCode से टूल जो किसी भी प्लेटफॉर्म पर लोड होने वाले बायनेरिज़ बनाएगा।
अंत में, अपाचे के launchd
. में पर्यावरण चर को कॉन्फ़िगर करने के लिए ऊपर वर्णित समाधान कॉन्फ़िगरेशन फ़ाइल को अपाचे के माध्यम से चलने वाले अन्य PHP मॉड्यूल में समान त्रुटियों को हल करने के लिए भी काम करना चाहिए जो कि उनके लिंक किए गए पुस्तकालयों को खोजने के लिए पर्यावरण चर पर निर्भर हैं। यदि कमांड लाइन से PHP चला रहे हैं तो आपको अपने ~/.bash_profile
में आवश्यक सभी पर्यावरण चर निर्दिष्ट करने में सक्षम होना चाहिए और/या ~/.bashrc
फ़ाइलें.