Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Błąd DYLD_LIBRARY_PATH klienta natychmiastowego Oracle

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 w Apache Environment sekcja php_info() strona.
  • Istnieją zmienne środowiskowe PHP, zwykle ustawiane przez php.ini lub putenv() i stań się dostępny w swoich skryptach przez getenv() 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ę w Environment Variables sekcja php_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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja CONCAT() w Oracle

  2. po wstawieniu znaku perskiego w Oracle db widzę znak zapytania

  3. brak ocijdbc9 w java.library.path

  4. Niejawna różnica konwersji CAST vs ssis przepływu danych

  5. Jak udokumentować bazę danych