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 diApache Environment
bagianphp_info()
halaman. - Ada variabel lingkungan PHP, biasanya diatur melalui
php.ini
atauputenv()
, dan dapat diakses di skrip Anda melaluigetenv()
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 diEnvironment Variables
bagianphp_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.