
Ich versuche, ein Shell-Skript zu erstellen, das die anfängliche Bereitstellung einer Vagrant-VM (mit Ubuntu 12.04) durchführt. Alles (Installation von PHP, Apache, Oracle Instantclient usw.) funktioniert einwandfrei, mit Ausnahme des letzten Schritts – Installation der PHP-OCI8-Erweiterung:
pecl install oci8
Wenn ich diesen Befehl manuell ausführe (mit dem Präfix „sudo“), funktioniert er einwandfrei. Wenn das Skript diesen Befehl jedoch ausführt, schlägt er folgendermaßen fehl:
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
Das pecl
Skript fragt zu Beginn der Installation nach einem Pfad und ich denke, hier liegt das Problem:
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] :
Damit die Installation fortgesetzt werden kann, müssen Sie entweder das Verzeichnis ORACLE_HOME angeben oder drücken Enter. Ich habe Folgendes versucht, was anderswo vorgeschlagen wurde, aber es funktioniert nicht – der Zeilenumbruch fehlt in der Ausgabe (im Vergleich zur pecl
manuellen Ausführung des Befehls), sodass der Tastendruck nicht richtig emuliert wird Enter:
printf "\n" | pecl install oci8
Irgendwelche Vorschläge, wie ich das ordnungsgemäß zum Laufen bringen kann?
Antwort1
Meine Lösung bestand darin, den folgenden Befehl auszuführen:
export C_INCLUDE_PATH=/usr/include/oracle/11.2/client
und neu starten:
pecl insatlla oci8
Antwort2
Ich habe keine wirkliche allgemeine Lösung für dieses Problem gefunden. Was in meinem speziellen Szenario (Bereitstellung über Vagrant) funktionierte, war die Verwendung eines Puppet-Manifests für diesen speziellen Bereitstellungsschritt, was einfach war, da Sie es nur in der Vagrant-Konfiguration nach dem Shell-Provisioner angeben müssen:
"pecl-install-oci8":
command => "pecl install oci8",
user => root,
timeout => 0,
tries => 5,
unless => "/usr/bin/php -m | grep -c oci8";
Aus irgendeinem Grund, den ich noch nicht herausgefunden habe, installiert Puppet OCI8 ohne Probleme.
Und als ich das getan hatte, habe ich mein gesamtes Skript auf ein Puppet-Manifest portiert, aber das ist nicht das Thema.
Antwort3
Normalerweise können Sie bei dieser Art der Installation die Parameter, die Sie festlegen möchten, in das Echo eingeben. Ich habe die gesamte Anweisung so verpackt, dass sie mit Sudo-Berechtigungen ausgeführt werden kann.
sudo sh -c "echo 'instantclient,/opt/oracle/instantclient' | pecl install oci8"