sql >> Database teknologi >  >> RDS >> Oracle

Oracle instantclient DYLD_LIBRARY_PATH fejl

Jeg har også kæmpet i nogen tid for at finde en løsning på "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" fejl på Mac OS X. Efter megen research fandt jeg endelig en løsning, der på bæredygtig vis retter denne fejl, og jeg ønskede at dele den her for at hjælpe andre.

Som en lille baggrund bruger jeg den Apple-leverede installation af PHP på OS X 10.8.4 (PHP 5.3.15 med Suhosin-Patch), og brugte PECL-lageret til at installere OCI8-udvidelsen, efter at jeg havde downloadet Oracle Instant Client downloads fra Oracle.com.

Jeg har også testet alle de løsninger på denne fejl, som jeg har været i stand til at finde online, inklusive indstilling af DYLD_LIBRARY_PATH , ORACLE_HOME og LD_LIBRARY_PATH systemmiljøvariabler i min ~/.bash_profile og ~/.bashrc filer; forsøger at konfigurere miljøvariablerne via Apaches mod_env modul og SetEnv i httpd.conf; indstilling af miljøvariablerne via putenv("DYLD_LIBRARY_PATH=/...") i PHP-kode; samt andre forslag, men alle formåede ikke at løse fejlen.

Den eneste fungerende løsning, jeg havde fundet tidligere, som jeg brugte på min tidligere OS X 10.7.8-installation involverede kopiering af indholdet af Oracle Instant Client-bibliotekerne til de altid søgte, men skjulte systemmapper:/usr/include , /usr/bin , og /usr/lib . Jeg følte dog, at denne løsning ikke var ideel og potentielt ville gøre det vanskeligt at vedligeholde og opgradere bibliotekerne på lang sigt, og jeg følte, at der måtte eksistere en bæredygtig løsning på dette problem et eller andet sted.

Til sidst, efter meget yderligere research, faldt jeg over et indlæg på OpenSUSE-foraene, som beskrev, hvordan en gruppe brugere dér havde løst den samme OCI-fejl under Apache/PHP på OpenSUSE. Forumindlægget udvidede også kommentarer, jeg havde set i andre forumindlæg, der talte om, at der er flere typer af 'miljøvariable' i en typisk Apache/PHP-opsætning:

  • Der er Apache-miljøvariabler, som normalt konfigureres via mod_env - disse vises i Apache Environment sektionen af ​​php_info() side.
  • Der er PHP-miljøvariabler, som normalt indstilles via php.ini eller putenv() , og bliv tilgængelig i dine scripts via getenv() og lignende metoder.
  • Til sidst er der det, jeg her refererer til som 'processpecifikke miljøvariabler' - disse er miljøvariabler, der skal konfigureres, før Apache-processen startes, og som en del af selve Apache-lanceringsprocessen. Det er ikke tilstrækkeligt at specificere disse miljøvariabler i ens ~/.bash_profile for eksempel. Disse specielle miljøvariabler nedarves af Apache-processen, når den starter, og afgørende , af alle dens underordnede processer, inklusive andre gyder af Apache-processen og af PHP selv - og det er disse meget 'processpecifikke miljøvariabler', som vi skal konfigurere til for permanent og bæredygtigt at løse vores problem med OCI8-biblioteket. Når de er konfigureret korrekt, vises disse miljøvariabler i Environment Variables sektionen af ​​php_info() side.

Den ledetråd, der førte mig til løsningen på Mac OS X, var fra indlægget på OpenSUSE-forummet, der indeholdt en kommentar fra forummedlemmet, key_nap , som bemærkede, at da Apache-processen blev lanceret på OpenSUSE, blev der også indlæst en speciel konfigurationsfil. Denne fil, /usr/share/apache2/load_configuration viste sig at være et bash-script, og det gik op for dem, at de kunne inkludere den relevante export DYLD_LIBRARY_PATH=... udsagn i dette bash-script, og at ved at konfigurere miljøvariablerne der, at de ville blive nedarvet af Apache-processen og dens børn ved lanceringen.

Dette fik mig til at spekulere på, hvor på Mac OS X vi ville være i stand til at konfigurere de samme 'processpecifikke miljøvariabler' korrekt. Som launchd bruges næsten udelukkende på OS X til at håndtere indlæsning af systemprocesser, spekulerede jeg på, om vi ville være i stand til at konfigurere de nødvendige miljøvariabler i Apaches launchd konfigurationsfil? På OS X 10.8 bør du finde Apaches launchd konfiguration .plist fil på /System/Library/LaunchDaemons/org.apache.httpd.plist . Da jeg åbnede filen på mit system, bemærkede jeg straks en sektion til specificering af miljøvariabler!

Vores løsning (testet til at virke på Mac OS X 10.8.4) var derfor at redigere org.apache.httpd.plist fil som vist nedenfor (bemærk medtagelsen af ​​ORACLE_HOME , DYLD_LIBRARY_PATH og LD_LIBRARY_PATH til sektionen EnvironmentVariables i filen), og for derefter at genstarte Apache ved at køre sudo apachectl restart fra terminalen.

<?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>

Ved at tilføje disse 'processpecifikke miljøvariable' definitioner til Apache launchd konfigurationsfil, sikrer vi, at disse miljøvariabler nedarves korrekt af Apache og alle dens underordnede processer, som inkluderer PHP og eventuelle PHP-moduler, såsom OCI8! Du bør naturligvis erstatte stien /Users/workstation/Oracle/... vist i eksemplet ovenfor med de korrekte stier til din egen installation af Oracle Client Libraries – brug de samme værdier, som du ville, når du angiver disse miljøvariabler i din ~/.bash_profile .

Sørg også for, at du har den korrekte version af Oracle Instant Client Libraries installeret til dit system - dvs. enten 32-bit eller 64-bit varianterne afhængigt af hvilken version af OS X du kører, og hvorvidt Apache og PHP kører i 32- eller 64-bit tilstand. På OS X 10.8 og nyere skal Apache/PHP køre som 64-bit processer. Hvis du er usikker, kan du gøre, hvad jeg gjorde på min tidligere Mac og kombinere 32- og 64-bit versionerne af Oracle Instant Client-bibliotekets binære filer til enkelte multi-arkitektur fedt-binære filer ved hjælp af lipo værktøj fra XCode, som vil skabe binære filer, der indlæses på begge platforme.

Til sidst, løsningen beskrevet ovenfor for at konfigurere miljøvariabler i Apaches launchd konfigurationsfilen bør også arbejde for at løse lignende fejl i andre PHP-moduler, der køres via Apache, og som er afhængige af miljøvariabler for at finde deres linkede biblioteker. Hvis du kører PHP fra kommandolinjen, bør du være i stand til at angive alle de miljøvariabler, du har brug for i din ~/.bash_profile og/eller ~/.bashrc filer.



  1. Liste lagrede funktioner, der refererer til en tabel i PostgreSQL

  2. SQL Server Management Studio (SSMS)

  3. Sådan tilføjes xml-kodning <?xml version=1.0 encoding=UTF-8?> til xml-output i SQL Server

  4. Sådan fjerner du en database-mailkonto fra en profil i SQL Server (T-SQL)