Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle instantclient DYLD_LIBRARY_PATH kesalahan

Saya juga telah berjuang selama beberapa waktu untuk menemukan solusi untuk "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" kesalahan pada Mac OS X. Akhirnya setelah banyak penelitian, saya menemukan solusi yang secara berkelanjutan memperbaiki kesalahan ini, dan ingin membagikannya di sini untuk membantu orang lain.

Sebagai sedikit latar belakang, saya menggunakan instalasi PHP yang disediakan Apple pada OS X 10.8.4 (PHP 5.3.15 dengan Suhosin-Patch), dan menggunakan repositori PECL untuk menginstal ekstensi OCI8 setelah saya mengunduh Oracle Instant Client unduhan dari Oracle.com.

Saya juga telah menguji semua solusi untuk kesalahan ini yang dapat saya temukan secara online, termasuk menyetel DYLD_LIBRARY_PATH , ORACLE_HOME , dan LD_LIBRARY_PATH variabel lingkungan sistem di ~/.bash_profile saya dan ~/.bashrc file; mencoba mengonfigurasi variabel lingkungan melalui mod_env Apache modul dan SetEnv di httpd.conf; menyetel variabel lingkungan melalui putenv("DYLD_LIBRARY_PATH=/...") dalam kode PHP; serta saran lainnya, tetapi semuanya gagal mengatasi kesalahan.

Satu-satunya solusi kerja yang saya temukan di masa lalu, yang saya gunakan pada instalasi OS X 10.7.8 saya sebelumnya melibatkan penyalinan konten perpustakaan Oracle Instant Client ke folder sistem yang selalu dicari, namun tersembunyi:/usr/include , /usr/bin , dan /usr/lib . Namun, saya merasa bahwa solusi ini tidak ideal dan berpotensi mempersulit pemeliharaan dan peningkatan versi perpustakaan dalam jangka panjang, dan saya merasa bahwa solusi berkelanjutan untuk masalah ini harus ada di suatu tempat.

Akhirnya setelah banyak penelitian tambahan, saya menemukan sebuah posting di forum OpenSUSE yang merinci bagaimana sekelompok pengguna di sana telah memecahkan kesalahan OCI yang sama di bawah Apache/PHP di OpenSUSE. Posting forum juga memperluas komentar yang saya lihat di posting forum lain yang berbicara tentang ada beberapa jenis 'variabel lingkungan' dalam pengaturan Apache/PHP yang khas:

  • Ada Variabel Lingkungan Apache, yang biasanya dikonfigurasi melalui mod_env - ini muncul di Apache Environment bagian php_info() halaman.
  • Ada variabel lingkungan PHP, biasanya diatur melalui php.ini atau putenv() , dan dapat diakses di skrip Anda melalui getenv() dan metode serupa.
  • Akhirnya, yang saya maksud di sini sebagai 'variabel lingkungan khusus proses' - ini adalah variabel lingkungan yang harus dikonfigurasi sebelum proses Apache diluncurkan, dan sebagai bagian dari proses peluncuran Apache itu sendiri. Tidak cukup untuk menentukan variabel lingkungan ini dalam ~/.bash_profile seseorang Misalnya. Variabel lingkungan khusus ini diwarisi oleh proses Apache saat diluncurkan, dan yang terpenting , dengan semua proses turunannya termasuk turunan lain dari proses Apache dan oleh PHP itu sendiri - dan 'variabel lingkungan khusus proses' inilah yang perlu kita konfigurasikan untuk menyelesaikan masalah kita dengan perpustakaan OCI8 secara permanen dan berkelanjutan. Jika dikonfigurasi dengan benar, variabel lingkungan ini akan muncul di Environment Variables bagian php_info() halaman.

Petunjuk yang membawa saya ke solusi di Mac OS X berasal dari posting di forum OpenSUSE yang menyertakan komentar oleh anggota forum, key_nap , yang memperhatikan bahwa ketika proses Apache diluncurkan pada OpenSUSE, file konfigurasi khusus juga sedang dimuat. File ini, /usr/share/apache2/load_configuration ternyata menjadi skrip bash, dan terpikir oleh mereka bahwa mereka dapat menyertakan export DYLD_LIBRARY_PATH=... yang relevan pernyataan dalam skrip bash ini, dan bahwa dengan mengonfigurasi variabel lingkungan di sana, variabel tersebut akan diwarisi oleh proses Apache dan turunannya saat diluncurkan.

Ini membuat saya bertanya-tanya di mana di Mac OS X kami dapat mengonfigurasi 'variabel lingkungan spesifik proses' yang sama ini dengan benar. Saat launchd digunakan hampir secara eksklusif pada OS X untuk menangani pemuatan proses sistem, saya bertanya-tanya apakah kami dapat mengonfigurasi variabel lingkungan yang diperlukan di launchd Apache berkas konfigurasi? Pada OS X 10.8, Anda akan menemukan launchd Apache Apache konfigurasi .plist file di /System/Library/LaunchDaemons/org.apache.httpd.plist . Ketika saya membuka file di sistem saya, saya segera melihat bagian untuk menentukan Variabel Lingkungan!

Oleh karena itu, solusi kami (diuji untuk bekerja pada Mac OS X 10.8.4), adalah mengedit org.apache.httpd.plist file seperti yang ditunjukkan di bawah ini (perhatikan penyertaan ORACLE_HOME , DYLD_LIBRARY_PATH , dan LD_LIBRARY_PATH ke bagian EnvironmentVariables dari file), dan kemudian restart Apache dengan menjalankan sudo apachectl restart dari terminal.

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

Dengan menambahkan definisi 'proses variabel lingkungan khusus' ini ke launchd Apache file konfigurasi, kami memastikan variabel lingkungan ini diwarisi dengan benar oleh Apache dan semua proses turunannya, yang mencakup PHP dan modul apa pun yang dimuat PHP seperti OCI8! Anda jelas harus mengganti jalur /Users/workstation/Oracle/... ditunjukkan pada contoh di atas dengan jalur yang benar ke instalasi Anda sendiri dari Oracle Client Libraries – gunakan nilai yang sama seperti yang Anda lakukan saat menentukan variabel lingkungan ini di ~/.bash_profile Anda .

Pastikan juga bahwa Anda memiliki versi yang benar dari Oracle Instant Client Libraries yang diinstal untuk sistem Anda - yaitu varian 32-bit atau 64-bit tergantung pada versi OS X yang Anda jalankan dan apakah Apache dan PHP sedang berjalan atau tidak. mode 32- atau 64-bit. Pada OS X 10.8 dan yang lebih baru, Apache/PHP harus dijalankan sebagai proses 64-bit. Jika Anda tidak yakin, Anda dapat melakukan apa yang saya lakukan pada Mac saya sebelumnya dan menggabungkan binari perpustakaan Oracle Instant Client versi 32 dan 64-bit menjadi binari lemak multi-arsitektur tunggal menggunakan lipo alat dari XCode yang akan membuat binari yang dimuat di kedua platform.

Terakhir, solusi yang dirinci di atas untuk mengonfigurasi variabel lingkungan di launchd Apache Apache file konfigurasi juga harus bekerja untuk memecahkan kesalahan serupa di modul PHP lain yang dijalankan melalui Apache yang mengandalkan variabel lingkungan untuk menemukan pustaka yang ditautkan. Jika menjalankan PHP dari baris perintah, Anda harus dapat menentukan semua variabel lingkungan yang Anda butuhkan di ~/.bash_profile Anda dan/atau ~/.bashrc file.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi daftar ORACLE SQL

  2. SQL Terus mendapatkan kesalahan dengan ON UPDATE CASCADE

  3. Menggunakan Oracle JDeveloper 12c dengan Oracle Database, Bagian 1

  4. Menyebarkan Pusat Data Cloudera CDP di Oracle Cloud Infrastructure (OCI)

  5. Basis Data:Fungsi Pipeline