Ja też od jakiegoś czasu zmagam się ze znalezieniem rozwiązania "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"
błąd w systemie Mac OS X. W końcu po wielu badaniach znalazłem rozwiązanie, które trwale naprawia ten błąd i chciałem się nim podzielić, aby pomóc innym.
Jako małe tło używam dostarczonej przez Apple instalacji PHP na OS X 10.8.4 (PHP 5.3.15 z Suhosin-Patch) i użyłem repozytorium PECL do zainstalowania rozszerzenia OCI8 po pobraniu Oracle Instant Client pliki do pobrania z Oracle.com.
Przetestowałem również wszystkie rozwiązania tego błędu, które udało mi się znaleźć w Internecie, w tym ustawienie DYLD_LIBRARY_PATH
, ORACLE_HOME
i LD_LIBRARY_PATH
zmienne środowiskowe systemu w moim ~/.bash_profile
i ~/.bashrc
akta; próba skonfigurowania zmiennych środowiskowych za pomocą mod_env
Apache moduł i SetEnv
w httpd.conf
; ustawianie zmiennych środowiskowych przez putenv("DYLD_LIBRARY_PATH=/...")
w kodzie PHP; jak również inne sugestie, ale wszystkie nie rozwiązały błędu.
Jedyne działające rozwiązanie, jakie znalazłem w przeszłości, którego użyłem przy poprzedniej instalacji OS X 10.7.8, polegało na skopiowaniu zawartości bibliotek Oracle Instant Client do zawsze przeszukiwanych, ale ukrytych folderów systemowych:/usr/include
, /usr/bin
i /usr/lib
. Czułem jednak, że to rozwiązanie nie jest idealne i może utrudnić utrzymanie i modernizację bibliotek w dłuższej perspektywie, i czułem, że gdzieś musi istnieć trwałe rozwiązanie tego problemu.
W końcu, po wielu dodatkowych badaniach, natknąłem się na post na forach OpenSUSE, w którym szczegółowo opisano, jak grupa użytkowników rozwiązała ten sam błąd OCI w Apache/PHP w OpenSUSE. Post na forum rozszerzył się również o komentarze, które widziałem w innych postach na forum, które mówiły o wielu typach „zmiennych środowiskowych” w typowej konfiguracji Apache/PHP:
- Istnieją zmienne środowiskowe Apache, które zwykle są konfigurowane przez
mod_env
- pojawiają się one wApache Environment
sekcjaphp_info()
strona. - Istnieją zmienne środowiskowe PHP, zwykle ustawiane przez
php.ini
lubputenv()
i stań się dostępny w swoich skryptach przezgetenv()
i podobne metody. - Na koniec, tutaj nazywam to „zmiennymi środowiskowymi specyficznymi dla procesu” — są to zmienne środowiskowe, które należy skonfigurować przed uruchomieniem procesu Apache oraz jako część samego procesu uruchamiania Apache. Nie wystarczy określić te zmienne środowiskowe w swoim
~/.bash_profile
na przykład. Te specjalne zmienne środowiskowe są dziedziczone przez proces Apache po uruchomieniu i co najważniejsze , przez wszystkie jego procesy potomne, w tym inne odrodzenie procesu Apache i przez samo PHP - i to właśnie te "zmienne środowiskowe specyficzne dla procesu" musimy skonfigurować, aby trwale i trwale rozwiązać nasz problem z biblioteką OCI8. Po prawidłowym skonfigurowaniu te zmienne środowiskowe pojawią się wEnvironment Variables
sekcjaphp_info()
strona.
Wskazówka, która doprowadziła mnie do rozwiązania w systemie Mac OS X, pochodziła z posta na forum OpenSUSE, który zawierał komentarz członka forum, key_nap , który zauważył, że kiedy proces Apache był uruchamiany w OpenSUSE, ładowany był również specjalny plik konfiguracyjny. Ten plik, /usr/share/apache2/load_configuration
okazał się skryptem bash i przyszło im do głowy, że mogą zawierać odpowiedni export DYLD_LIBRARY_PATH=...
instrukcji w tym skrypcie bash, a także poprzez skonfigurowanie tam zmiennych środowiskowych, które zostaną odziedziczone przez proces Apache i jego dzieci po uruchomieniu.
To doprowadziło mnie do zastanowienia się, gdzie w systemie Mac OS X moglibyśmy poprawnie skonfigurować te same „zmienne środowiskowe specyficzne dla procesu”. Jako launchd
jest używany prawie wyłącznie w OS X do obsługi ładowania procesów systemowych, zastanawiałem się, czy będziemy w stanie skonfigurować niezbędne zmienne środowiskowe w launchd
Apache plik konfiguracyjny? W systemie OS X 10.8 powinieneś znaleźć launchd
Apache konfiguracja .plist
plik w /System/Library/LaunchDaemons/org.apache.httpd.plist
. Kiedy otworzyłem plik w moim systemie, od razu zauważyłem sekcję do określania zmiennych środowiskowych!
Dlatego nasze rozwiązanie (przetestowane pod kątem działania na Mac OS X 10.8.4) polegało na edycji org.apache.httpd.plist
plik, jak pokazano poniżej (zwróć uwagę na włączenie ORACLE_HOME
, DYLD_LIBRARY_PATH
i LD_LIBRARY_PATH
do sekcji EnvironmentVariables pliku), a następnie zrestartuj Apache, uruchamiając sudo apachectl restart
z terminala.
<?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>
Dodając te definicje „zmiennych środowiskowych specyficznych dla procesu” do Apache launchd
konfiguracyjnym, zapewniamy, że te zmienne środowiskowe są poprawnie dziedziczone przez Apache i wszystkie jego procesy potomne, w tym PHP i wszelkie moduły ładowane przez PHP, takie jak OCI8! Powinieneś oczywiście zastąpić ścieżkę /Users/workstation/Oracle/...
pokazany w powyższym przykładzie z poprawnymi ścieżkami do własnej instalacji Oracle Client Libraries – użyj tych samych wartości, jak podczas określania tych zmiennych środowiskowych w swoim ~/.bash_profile
.
Upewnij się również, że masz zainstalowaną poprawną wersję Oracle Instant Client Libraries w swoim systemie — tj. wersję 32-bitową lub 64-bitową, w zależności od używanej wersji OS X i tego, czy Apache i PHP są uruchomione. Tryb 32- lub 64-bitowy. W systemie OS X 10.8 i nowszych Apache/PHP powinien działać jako procesy 64-bitowe. Jeśli nie masz pewności, możesz zrobić to samo, co ja na moim poprzednim Macu i połączyć 32- i 64-bitowe wersje plików binarnych biblioteki Oracle Instant Client w pojedyncze pliki binarne z wieloma architekturami za pomocą lipo
narzędzie z XCode, które utworzy pliki binarne, które ładują się na dowolnej platformie.
Wreszcie, rozwiązanie opisane powyżej, aby skonfigurować zmienne środowiskowe w launchd
Apache plik konfiguracyjny powinien również działać w celu rozwiązania podobnych błędów w innych modułach PHP uruchamianych przez Apache, które opierają się na zmiennych środowiskowych w celu znalezienia powiązanych bibliotek. Jeśli uruchamiasz PHP z wiersza poleceń, powinieneś być w stanie określić wszystkie potrzebne zmienne środowiskowe w swoim ~/.bash_profile
i/lub ~/.bashrc
pliki.