Установка PHP-OCI8
|
(09:04) 27.09.2004
|
|
В этой заметке я приведу краткую инструкция по установке PHP-OCI8. PHP-OCI8 - это модуль расширения для PHP, позволяющий вызывать функции OCI8 (Oracle Call Interface version 8) из PHP. Что необходимо иметь перед началом работ?
Установленный Oracle8i клиент или сервер (гнусные инсинуации на тему установки Oracle 8.1.6 на Fedora Core 1 можно найти здесь :-))
Установленную правильным образом переменную окружения ORACLE_HOME (то есть она должна указывать на каталог, вкоторый был установлен Oracle)
Заголовочные файлы OCI в $ORACLE_HOME/rdbms/demo
Если у вас RPM-based дистрибутив, то лучше всего скачать SRPM-файл для вашей версии PHP (для Fedora Core 1 его можно взять здесь). К несчастью, в SPEC-файле именно этой версии лежит страшный баг :-), поэтому необходимо распаковать эту RPM-ку:
# rpm2cpio php-4.3.3-6.src.rpm | cpio -i
Распаковывать этот файл лучше в каком-нибудь пустом каталоге. После завершения распаковки надо "раскидать" файлы по каталогам: php.spec в /usr/src/redhat/SPECS, остальные в /usr/src/redhat/SOURCES:
# mv php.spec /usr/src/redhat/SPECS
# mv * /usr/src/redhat/SOURCES
Идем в /usr/src/redhat/SPECS, и ищем в php.spec строку, в которой генерируются вспомогательные списки файлов. Строка эта выглядит примерно так:
for mod in pgsql [...пропущено...] %{!?oracle:oci8} %{!?ms sql:mssql}; do
В ней содержится явный ляп, который не дает сгенерироваться служебному файлу files.oci8, и этот ляп мы исправляем следующим образом:
for mod in pgsql [...пропущено...] %{?oracle:oci8} %{?ms sql:mssql}; do
Все, осталось проверить, что переменная среды ORACLE_HOME установлена, проэкспортирована и указывает на каталог с установленным Oracle8i (без этого сборка PHP с поддержкой OCI8 прервется еще на этапе configure). Если переменная установлена, запускаем процесс сборки:
# cd /usr/src/redhat/SPECS
# rpmbuild -ba --define 'oracle 1' php.spec
По окончани процесса сборки мы получим файл php-oci8-4.3.3-6.i386.rpm в каталоге /usr/src/redhat/RPMS/i386.
Joe Orton, который в числе других писал SPEC-файл для PHP, в курсе этого бага, и рекомендовал попробовать поставить PHP более свежей версии - по его словам, с SRPM с версией 4.3.4, которую можно утащить хотя-бы отсюда, этот баг уже был исправлен :-) и, соответственно, можно не заниматься извращениями, а просто скомандовать что-то вроде:
# rpmbuild --rebuild --define 'oracle 1' php-4.3.4-10.1.src.rpm
Но это я уже не проверял, и оставлю на усмотрение любителей свеженького :-), а для сторонников tarball'ов можно порекомендовать запустить configure с опцией --with-oci8=shared - и опять же, не забудьте установить ORACLE_HOME.
После установки соответсвующей RPM-ки:
# rpm -i /usr/src/redhat/RPMS/i386/php-4.3.3-6.i386.rpm
Необходимо перезапустить apache, но предварительно рекомендую вписать в стартовый сценарий или в конфигурационный файл установку переменной ORACLE_HOME в корректное значение, и установить LD_LIBRARY_PATH="$ORACLE_HOME/lib", либо прописать путь к библиотекам Oracle в /etc/ld.so.conf и вызвать ldconfig.
LD_LIBRARY_PATH нужен чтобы найти libclntsh.so.8.0, а ORACLE_HOME необходим для корректного обнаружения sqlnet.ora и tnsnames.ora которые ищутся в $ORACLE_HOME/network/admin. В моем случае проще всего было добавить каталог /opt/home/oracle/8i/lib в /etc/ld.so.conf:
# echo "/opt/home/oracle/8i/lib" >>/etc/ld.so.conf
# ldconfig
С переменной ORACLE_HOME я поступил следующим образом:
1. Создал файл /etc/sysconfig/oracle следующего содержания
ORACLE_BASE="/opt/home/oracle"
ORACLE_HOME="$ORACLE_BASE/8i"
NLS_LANG="american_america.cl8koi8r"
export NLS_LANG ORACLE_HOME ORACLE_BASE
2. В начало файла /etc/init.d/httpd.conf добавил следующий фрагмент:
if [ -e /etc/sysconfig/oracle ]; then
. /etc/syconfig/oracle
if [ "_$ORACLE_SID" != "_" ]; then
export ORACLE_SID
fi
fi
Такой же фрагмент я добавил в конец /etc/profile, что позволило сосредоточить установку всех оракловских переменных в одном месте, чтобы не нужно было судорожно вспоминать где и что надо исправить/добавить/удалить в случае каких-либо изменений.
Итак, теперь перезапускаем apache:
# /etc/init.d/httpd restart
Все, начинаем проверку. Проверка делится на две части: проверку того, что у нас активизирована поддержка OCI8, и собственно проверку работоспособности PHP-OCI8. Для объединения этих двух функций был написан маленький PHP-скриптик следующего содержания:
<html>
<head>
<title>PHP-OCI8 test page</title>
</head>
<body>
<?php
$login="".$_GET["LOGIN"].$_POST["LOGIN"];
$passwd="".$_GET["PASSWD"].$_POST["PASSWD"];
$alias="".$_GET["ALIAS"].$_POST["ALIAS"];
if (($login!="")&&($passwd!="")&&($alias!="")) {
$conn = OCINLogon($login,$passwd,$alias)
or die("Logon failed: ".OCIError($conn));
print "<h1>Connect to $alias as $login done</h1>";
OCILogoff($conn);
print "<h1>Disconnect from $alias done</h1>";
} else {
?>
<center><form action="orademo.php" method="POST">
<table cellspacing="0" cellpadding="3">
<tr>
<td align="right" valign="middle">Login name</td>
<td align="left" valign="middle"><input
name="LOGIN" size="15"></td>
</tr>
<tr>
<td align="right" valign="middle">Password</td>
<td align="left" valign="middle"><input
type="password" name="PASSWD" size="30"></td>
</tr>
<tr>
<td align="right" valign="middle">Alias</td>
<td align="left" valign="middle"><input
name="ALIAS" size="10"></td>
</tr>
<tr>
<td align="right" valign="middle"> </td>
<td align="left" valign="middle"><input
value="Test connection" type="submit"></td>
</tr>
</table>
</form><center>
<?php
phpinfo();
}
?>
</body>
</html>
При вызове этого сценария без параметров он покажет форму для указания параметров подключения к Oracle и сведения о PHP. В частности, в выводе phpinfo() можно найти секцию описания расширения oci8 и информации о нем. После того, как вы заполните в форме имя пользователя, пароль и имя источника данных Oracle, вы можете проверить корректность входа пользователя в СУБД.
Код для вставки в блог:
Оставьте свой комментарий
Новостная лента
"Лаборатория Касперского": рост бизнеса замедляется
Microsoft выровняет все корпоративные цены для Европы
SpaceX заключила контракт на вывод двух спутников AsiaSat
Компания Airvana подает в суд на Ericsson и требует 330 млн долларов
Anonymous Russia продолжают публиковать архивы о "продажных чиновниках и блогерах"
Hitachi выпускает новые SSD-накопители
Российский веб-сервер Nginx обзаводится коммерческой техподдержкой
Rambus и Nvidia урегулировали все патентные разногласия
Eset начала открытое тестирование бета-версий пятого поколения продуктов
Mail.ru открывает представительство в Волгограде
Создан компьютер, способный работать в суперхолодных условиях
Оператор связи ТТК открыл новый узел доступа во Франкфурте
Ученые создали антитела, способные доставлять противораковые препараты в клетки опухоли
Telenor получила крупные убытки в четвертом квартале
