. Последнее обновление сайта было в 22:58

Установка 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, вы можете проверить корректность входа пользователя в СУБД.


Код для вставки в блог:


Оставьте свой комментарий

Чтобы оставлять комментарии, Вам нужно ВОЙТИ или ЗАРЕГИСТРИРОВАТЬСЯ

Новостная лента