私もしばらくの間、"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"
Mac OS Xでのエラー。最後に多くの調査の結果、このエラーを持続的に修正するソリューションを見つけ、他の人を助けるためにここで共有したいと思いました。
少し背景として、Appleが提供するOS X 10.8.4へのPHPのインストール(Suhosin-Patchを使用したPHP 5.3.15)を使用しており、Oracle Instant Clientをダウンロードした後、PECLリポジトリを使用してOCI8拡張機能をインストールしました。 Oracle.comからのダウンロード。
また、DYLD_LIBRARY_PATH
の設定など、オンラインで見つけたこのエラーのすべての解決策をテストしました。 、ORACLE_HOME
、およびLD_LIBRARY_PATH
~/.bash_profile
のシステム環境変数 および~/.bashrc
ファイル; Apacheのmod_env
を介して環境変数を構成しようとしています モジュールとSetEnv
httpd.conf
で; putenv("DYLD_LIBRARY_PATH=/...")
を介して環境変数を設定する PHPコードで;他の提案と同様に、しかしすべてがエラーを解決できませんでした。
以前のOSX10.7.8のインストールで使用した、過去に見つけた唯一の有効なソリューションは、OracleInstantClientライブラリのコンテンツを常に検索されているが非表示のシステムフォルダにコピーすることでした。/usr/include
、/usr/bin
、および/usr/lib
。ただし、このソリューションは理想的ではなく、長期的にライブラリを維持およびアップグレードすることが困難になる可能性があると感じました。また、この問題に対する持続可能なソリューションはどこかに存在する必要があると感じました。
最後に、さらに多くの調査を行った後、OpenSUSEフォーラムに投稿され、OpenSUSEのApache/PHPで同じOCIエラーをユーザーのグループがどのように解決したかを詳しく説明しました。フォーラムの投稿は、他のフォーラムの投稿で見た、典型的なApache/PHPのセットアップに複数のタイプの「環境変数」があることについて話しているコメントも拡張しました。
- Apache環境変数があり、通常は
mod_env
を介して構成されます。 -これらはApache Environment
に表示されますphp_info()
のセクション ページ。 - PHP環境変数があり、通常は
php.ini
を介して設定されます。 またはputenv()
、getenv()
を介してスクリプトでアクセスできるようになります および同様の方法。 - 最後に、ここで「プロセス固有の環境変数」と呼んでいるものがあります。これらは、Apacheプロセスを起動する前に、Apache起動プロセス自体の一部として構成する必要がある環境変数です。これらの環境変数を
~/.bash_profile
で指定するだけでは不十分です。 例えば。これらの特別な環境変数は、Apacheプロセスが起動したときに、そして決定的に継承されます。 、Apacheプロセスの他のスポーンを含むすべての子プロセスおよびPHP自体によって-そして、OCI8ライブラリの問題を永続的かつ持続的に解決するために構成する必要があるのは、まさにこれらの「プロセス固有の環境変数」です。正しく構成されると、これらの環境変数はEnvironment Variables
に表示されます。php_info()
のセクション ページ。
Mac OS Xでの解決策に私を導いた手がかりは、フォーラムのメンバーである key_napによるコメントを含むOpenSUSEフォーラムへの投稿からでした。 、ApacheプロセスがOpenSUSEで起動されたときに、特別な構成ファイルもロードされていることに気づきました。このファイル、/usr/share/apache2/load_configuration
bashスクリプトであることが判明し、関連するexport DYLD_LIBRARY_PATH=...
を含めることができることに気づきました。 このbashスクリプト内のステートメント、およびそこで環境変数を構成することにより、起動時にApacheプロセスとその子に継承されるというステートメント。
これにより、MacOSXのどこでこれらの同じ「プロセス固有の環境変数」を正しく構成できるのか疑問に思いました。 launchd
として システムプロセスのロードを処理するためにOSXでほぼ独占的に使用されているので、Apacheのlaunchd
で必要な環境変数を構成できるかどうか疑問に思いました。 設定ファイル? OS X 10.8では、Apacheのlaunchd
が見つかります。 構成.plist
/System/Library/LaunchDaemons/org.apache.httpd.plist
にあるファイル 。システムでファイルを開くと、すぐに環境変数を指定するセクションに気づきました!
したがって、私たちの解決策(Mac OS X 10.8.4で動作することがテストされています)は、org.apache.httpd.plist
を編集することでした。 以下に示すようにファイルします(ORACLE_HOME
が含まれていることに注意してください 、DYLD_LIBRARY_PATH
、およびLD_LIBRARY_PATH
ファイルのEnvironmentVariablesセクションに移動し、sudo apachectl restart
を実行してApacheを再起動します。 ターミナルから。
<?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>
これらの「プロセス固有の環境変数」定義をApacheのlaunchd
に追加することによって 構成ファイルでは、これらの環境変数がApacheとそのすべての子プロセスに正しく継承されていることを確認します。これには、PHPおよびPHPがロードするOCI8などのモジュールが含まれます。明らかにパス/Users/workstation/Oracle/...
を置き換える必要があります 上記の例に示すように、Oracleクライアントライブラリの独自のインストールへの正しいパス– ~/.bash_profile
でこれらの環境変数を指定する場合と同じ値を使用します 。
また、システムに正しいバージョンのOracle Instant Client Librariesがインストールされていることを確認してください。つまり、実行しているOS Xのバージョン、およびApacheとPHPが実行されているかどうかに応じて、32ビットまたは64ビットのバリアントのいずれかです。 32ビットまたは64ビットモード。 OS X 10.8以降では、Apache/PHPは64ビットプロセスとして実行されている必要があります。よくわからない場合は、以前のMacで行ったことを実行し、lipo
を使用して、32ビットバージョンと64ビットバージョンのOracleInstantClientライブラリバイナリを単一のマルチアーキテクチャファットバイナリに結合できます。 いずれかのプラットフォームにロードされるバイナリを作成するXCodeのツール。
最後に、Apacheのlaunchd
で環境変数を構成するための上記のソリューション 構成ファイルは、リンクされたライブラリを見つけるために環境変数に依存するApacheを介して実行される他のPHPモジュールの同様のエラーを解決するためにも機能するはずです。コマンドラインからPHPを実行する場合は、~/.bash_profile
で必要なすべての環境変数を指定できるはずです。 および/または~/.bashrc
ファイル。