
私は、Vagrant VM (Ubuntu 12.04 を実行) の初期プロビジョニングを実行するシェル スクリプトを作成しようとしています。最後のステップ (PHP OCI8 拡張機能のインストール) を除いて、すべて (PHP、Apache、Oracle InstantClient のインストールなど) は正常に動作します。
pecl install oci8
このコマンドを手動で実行すると (sudo プレフィックス付き) 正常に動作します。ただし、スクリプトでこのコマンドを実行すると、次のように失敗します。
running: make
/bin/bash /tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/libtool --mode=compile cc -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/include -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/main -I/tmp/pear/temp/oci8 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/temp/oci8/oci8.c -o oci8.lo
libtool: compile: cc -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/include -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/main -I/tmp/pear/temp/oci8 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/temp/oci8/oci8.c -fPIC -DPIC -o .libs/oci8.o
In file included from /tmp/pear/temp/oci8/oci8.c:48:0:
/tmp/pear/temp/oci8/php_oci8_int.h:60:17: fatal error: oci.h: No such file or directory
compilation terminated.
make: *** [oci8.lo] Error 1
ERROR: `make' failed
スクリプトpecl
はインストールの開始時にパスを要求しますが、ここに問題があると思います。
Please provide the path to the ORACLE_HOME directory. Use 'instantclient,/path/to/instant/client/lib' if you're compiling with Oracle Instant Client [autodetect] :
インストールを続行するには、ORACLE_HOME ディレクトリを指定するか、 を押す必要がありますEnter。他の場所で提案されている次の方法を試しましたが、機能しません。出力に改行がないため (コマンドを手動で実行した場合と比較してpecl
)、キーストロークが適切にエミュレートされませんEnter。
printf "\n" | pecl install oci8
これを適切に実行するための方法について何か提案はありますか?
答え1
私の解決策は、次のコマンドを実行することでした。
export C_INCLUDE_PATH=/usr/include/oracle/11.2/client
再起動します:
pecl insatlla oci8
答え2
この問題に対する汎用的な解決策は実際には見つかりませんでした。私の特定のシナリオ (Vagrant によるプロビジョニング) で最終的に機能したのは、この特定のプロビジョニング ステップに Puppet マニフェストを使用することでした。これは、Shell プロビジョナーの後の Vagrant 構成で指定するだけで済むため簡単でした。
"pecl-install-oci8":
command => "pecl install oci8",
user => root,
timeout => 0,
tries => 5,
unless => "/usr/bin/php -m | grep -c oci8";
まだ理由はわかりませんが、puppet は問題なく oci8 をインストールします。
そして、これを実行した後、スクリプト全体を Puppet マニフェストに移植しましたが、これは本題から外れます。
答え3
通常、この種のインストールでは、設定したいパラメータをエコーすることができます。ステートメント全体をラップして、sudo権限で実行できるようにしました。
sudo sh -c "echo 'instantclient,/opt/oracle/instantclient' | pecl install oci8"