Установка расширений OCI8 и PDO_OCI для PHP5

В настоящее время я работаю в компании, которая очень любит использовать в проектах на PHP СУБД Oracle, причем иногда версии 11g.

Большая часть разработчиков этой компании работает под ОС Windows. За последний месяц несколько из них решили приобщиться к Linux и поставили себе Ubuntu. По прошествии нескольких дней после установки самой ОС, ребята столкнулись с задачей установки драйверов PHP для работы с СУБД Oracle — OCI8 и PDO_OCI на базе Oracle instant client 11.2, которую не смогли решить самостоятельно.

Я не нашел подробного, полностью рабочего мануала на русском, по которому новичок в Linux смог бы выполнить все манипуляции сам. В результате мне пришлось несколько раз проделать серию одних и тех же действий на их машинах и написать мануал, который я вам и представляю.

Мануал написан для пользователей Ubuntu Linux, но с некоторыми изменениями подойдет для пользователей большинства Linux'ов.


Подготовка к установке


  1. У вас должна быть возможность выполнять команды под администратором;
  2. У вас должен быть установлен php5 со следующими пакетами (команда установки со списком):
    sudo apt-get install php5 php5-dev php-pear php5-cli
    sudo pecl install pdo
  3. У вас должна быть установлена библиотека libaio1:
    sudo apt-get install libaio1

Установка Oracle instant client


Скачиваем instant client Oracle с официального сайта http://oracle.com для своей архитектуры процессора и ОС.
Для Linux instant client поставляется в двух вариантах:
  • RPM пакет — Linux, CentOS, Fedora, Red Hat Enterprise Linux, Mandriva Linux, SUSE Linux и д.р. у кого есть поддержка RPM;
  • ZIP архив — всем остальным.

Необходимо скачать 2 файла:
  • instantclient-basic — сам Oracle instant client
  • instantclient-sdk — набор библиотек для разработки приложений под Oracle instant client

Также можете скачать:

Создаем директорию, в которой будут лежать файлы Oracle instant client (каталог /opt, зарезервированный для дополнительных пакетов программного обеспечения, хорошо для этого подходит):
sudo mkdir -p /opt/oracle/

Перемещаем скачанные файлы в /opt/oracle и переходим в папку назначения (допустим что вы скачали «zip архивы» в папку «downloads» Вашего пользователя):
sudo mv ~/downloads/instantclient-*.zip /opt/oracle/
cd /opt/oracle/


Разархивируем все скачанные архивы:
sudo unzip instantclient-basic-*-*.zip
sudo unzip instantclient-sdk-*-*.zip

Если вы скачивали SQL*Plus:
sudo unzip instantclient-sqlplus-*-*.zip

В итоге в каталоге /opt/oracle был создан, для Oracle instant client 11.2.0.2.0, каталог instantclient_11_2. Переименуем этот каталог в instantclient (если у вас другая версия/каталог измените команду) и перейдем в него:
sudo mv instantclient_11_2 instantclient
cd instantclient


Далее необходимо создать несколько дополнительных каталогов и символьных ссылок для нормальной работы клиента (обратите внимание на версию и если она у вас другая измените команды):
sudo ln -s /opt/oracle/instantclient/libclntsh.so.* /opt/oracle/instantclient/libclntsh.so
sudo ln -s /opt/oracle/instantclient/libocci.so.* /opt/oracle/instantclient/libocci.so
sudo ln -s /opt/oracle/instantclient/ /opt/oracle/instantclient/lib

sudo mkdir -p include/oracle/11.2/
cd include/oracle/11.2/
sudo ln -s ../../../sdk/include client
cd -

sudo mkdir -p lib/oracle/11.2/client
cd lib/oracle/11.2/client
sudo ln -s ../../../ lib
cd -


Создаем конфигурационный файл, в котором будет указан каталог для поиска библиотек Oracle instant client, и подключаем его:
echo /opt/oracle/instantclient/ | sudo tee -a /etc/ld.so.conf.d/oracle.conf
sudo ldconfig


Так как в Ubuntu нет каталога /usr/include/php, а клиент его все равно ищет создадим символьную ссылку на его эквивалент php5:
sudo ln -s /usr/include/php5 /usr/include/php

Устанавливаем OCI8


После всех наших манипуляций расширение oci8 замечательно устанавливается с помощью команды pecl:
sudo pecl install oci8
нас просят ввести путь к Oracle instant client, на что необходимо ответить:
instantclient,/opt/oracle/instantclient

Создаём файл подключения расширения:
echo "; configuration for php oci8 module" | sudo tee /etc/php5/conf.d/oci8.ini
echo extension=oci8.so | sudo tee -a /etc/php5/conf.d/oci8.ini


Устанавливаем PDO_OCI


Для установки PDO_OCI нам сначала необходимо его скачать из репозитория pear.
Обновим список пакетов pear:
sudo pecl channel-update pear.php.net

Скачаем и поместим архив во временную директорию:
sudo mkdir -p /tmp/pear/download/
cd /tmp/pear/download/
sudo pecl download pdo_oci


Извлечем содержимое архива и перейдем к нему:
sudo tar xvf PDO_OCI*.tgz
cd PDO_OCI*


Здесь нам необходимо скорректировать файл config.m4, так как в нем нет данных о нашей версии Oracle instant client, последние изменения датируются 2005 годом. Запускаем любимый редактор и вносим изменения отмеченные "+" (обратите внимание на версию и если она у вас другая измените строчки):
sudo vim config.m4

Далее приведен diff двух файлов:
***************
*** 7,12 ****
--- 7,14 ----
if test -s "$PDO_OCI_DIR/orainst/unix.rgs"; then
PDO_OCI_VERSION=`grep '"ocommon"' $PDO_OCI_DIR/orainst/unix.rgs | sed 's/[ ][ ]*/:/g' | cut -d: -f 6 | cut -c 2-4`
test -z "$PDO_OCI_VERSION" && PDO_OCI_VERSION=7.3
+ elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.2; then
+ PDO_OCI_VERSION=11.2
elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.10.1; then
PDO_OCI_VERSION=10.1
elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.9.0; then
***************
*** 119,124 ****
--- 121,129 ----
10.2)
PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
;;
+ 11.2)
+ PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
+ ;;
*)
AC_MSG_ERROR(Unsupported Oracle version! $PDO_OCI_VERSION)
;;
***************

Подготавливаем окружение для расширения php c помощью команды phpize (обратите внимание на версию, если она у вас другая измените):
sudo phpize

Конфигурируем установщик пакета и устанавливаем пакет (обратите внимание на версию, если она у вас другая измените):
sudo ./configure --with-pdo-oci=instantclient,/opt/oracle/instantclient/,11.2
sudo make
sudo make install


Создаём для него файл подключения:
echo "; configuration for php PDO_OCI module" | sudo tee /etc/php5/conf.d/pdo_oci.ini
echo extension=pdo_oci.so | sudo tee -a /etc/php5/conf.d/pdo_oci.ini


Подводим итоги


Перезапускаем apache и проверяем наличие установленных расширений:
sudo /etc/init.d/apache2 restart
php -m


Заключение


Мануал основан на вот этом посте, который был несколько переработан — исправлены ошибки и внесены дополнения.

Надеюсь, статья будет полезной не только моим коллегам по работе.
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 24

    +5
    спасибо
    1. За четкое, внятное и грамотное изложение алгоритма.
    2. За то, что не страдаете убунтой головного мозга.
      +1
      Спасибо за подробную инфу.

      А под Windows, подскажите:
      1) Для разработки стоит ли ставить на свою же машину Standard/Enterprise Edition или она требует много ресурсов и все будет тормозить? (Express не подходит, так как там нет поддержки Java)

      2) Под Windows 7 64bit, если сталкивались, то подойдут ли драйвера Oracle 64 bit? А то я ставил и ничего не вышло, PHP не хотел коннектиться, пока не поставил 32 битные.
        0
        1. Разнице в потреблении ресурсов между Express и Stadndard/Enterprise Edition нет. В Express просто ограничения на кол-во используемых ресурсов для базы.

        2. 32 битные приложения требуют 32 битных драйверов, 64 битные — 64 битных ;-)
          0
          1. То есть, S/E Edition позволит мне нормально работать на том же самом компьютере?

          2. Уточните ответ, пожалуйста.
            0
            1. Да

            2. www.viva64.com/ru/l/0002/ — тут подробнее.
            А насчет PHP — в Windows обычно берут бинарные сборки, а в них библиотеки уже собраны под конкретную версию оракловой библиотеки, и с другими версиями оно работать не будет.
            Для 64х битной оракловой библиотеки надо 64х битную версию PHP, а их готовых под Windows на официальном сайте я не видел. Ну и до кучи надо будет еще 64 битную версию Apache или другого веб-сервера.
        +8
        Каждый раз вздрагиваю когда слышу Oracle. СУБД — прекрасна! Но это же надо было так все усложнить для простых смертных!
        1) Инсталлятор. Back to USSR?
        2) Квест №1: Запустить приложение на клиентской машине:
        2.1) Зарегистрироваться на их сайте (Зачем!??) Это сам по себе тот еще квест. А потом попробуйте восстановить пароль…
        2.2) Скачать (Instant Client ищу исключительно в Google). Навигацией ой как найти не просто…
        2.3) Распаковать хозяйство в корень диска (почему-то у меня так и не захотело работать в путях с пробелом)
        2.4) Прописать три переменные окружения
        2.5) Возможно и заработает. Если нет — бубен в руки.
        3) Квест №2: Пишем программу. Настраиваем клиентские библиотеки
        3.1) Взяли бубен…

        И это сделал одна из крупнейших IT-компаний в мире. ппц.
          +2
          Наконец-то я высказался, черт подери.
            0
            Полностью согласен.

            Я пока собирал, наткнулся на множество проблем в компиляции и еще много чего.

            В общем я так психовал последний раз когда играл в денди
            0
            И это сделала одна из крупнейших IT-компаний в мире.
            А «Почта России» — одно из крупнейших предприятий страны.
              0
              Недавно был на почте. Приятно удивлен. Они, судя по всему, меняются. Видимо стало трендом совковые организации (и в тоже время самостоятельные, даже частично коммерческие) пытаться повернуть к народу лицом. Посмотрите посты в блоге Сбербанка.
              Глядишь заживём лет через 10 :)
                0
                Да, Сбер хорошо апгрейднулся в лучшую сторону. Но мой пост был не об этом, а о том, что размер компании — это в первую очередь признак пропиаренности среди гос. контор и крупных заказчиков, но никак не признак качественного технического исполнения. Чем крупней заказчик, тем дальше находится человек, принимающий бизнес решения от технарей, которые «как-нибудь этот бампер да прикрутят».

                Чем больше узнаю про оракл, тем больше он у меня начинает ассоциироваться с коболом и мэйнфреймами. Сугубо по области своего применения/популярности.
            0
            Instant Client да. INSTANT.
              +1
              >подойдет для пользователей большинства Linux'ов.

              для пользователей RHEL/CentOS на сайте оракла есть готовые RPM
              ставите instantclient (http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html) и сам пакет с модулем ( oss.oracle.com/projects/php/ )

                0
                Про наличие RPM для instant client в посте указано, а вот что у Oracle есть RPM для расширений — я не знал.
                Спасибо за информацию.
                  0
                  но к сожалению их нет для RHEL6 :(
                  видимо они решили добиться таким образом конкурентного преимущества включив RPM пакеты только в свой дистрибутив
                    0
                    А при более внимательном изучении вашей ссылки обнаруживаем, что:
                    The PDO_OCI driver for the PDO extension is not currently included.

                    В итоге из этих RPM можно установить только instant client, про что я написал, и oci8. Жаль.
                    А вот для Zend Server есть все в сборке и с поддержкой:
                    If support is needed, use Zend Server.

                    Наверное Oracle не хватает мощностей, что бы сделать что-то безвозмездно, т.е. даром.
                0
                Уже не помню к сожалению точные описания всех переменных для чего, но они мне в свое время очень помогли при работе из php с oracle (прописываются в .bashrc или по аналогии):
                # oracle
                export NLS_LANG="RUSSIAN_RUSSIA.AL32UTF8"
                export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
                export NLS_LENGTH_SEMANTICS=CHAR
                export NLS_NUMERIC_CHARACTERS=".,"
                
                  0
                  Немного комментариев с моей стороны (правда, я джавист), т.к. я использую оракл на локальной машине уже довольно давно (около 4 лет).

                  У нас (под Windows XP x32) используют локальный оракл 10g / 11g Enterprise Edition (standard не подходит из-за отсутствия ряда нужных фич), проблем не наблюдается.

                  Типично он потребляет памяти где то 250-300 мегабайт (что меньше чем, например, Google Chrome c тремя десятками вкладок:))), при более интенсисной обработке данных — бывает до 500 метров. Нагрузка на процессор обычно вообще не заметна (может проявится только если у вас много сложной логике в хранимых процедурах, и самих данных много).

                  На машинах класса Core2Duo / Quad с 3-4 гигами памяти локальный оракл совершенно не обременителен. На этих же машинах локально еще работают JBoss, Eclipse (и Google Chrome, который по моему ест памяти больше чем все выше перечисленное вместе взятое).

                  Типично локальная база занимает мало места сама по себе, т.к. используется локальная база в основном при разработке и локальном тестировании, т.к. данных там обычно немного (в таблицах редко бывает больше чем несколько жалких сот тысяч записей).

                  Укажу только несколько мелочей, который имеет смысл помнить при работе с локальной базой (когда вы сами себе DBA), они в общем-то общеизвестны, но о них часто забывают. Итак:

                  — Если вы часто и много (миллионы записей и больше) вставляете и удаляете данных из какой-то таблицы (например, тестируете какие-то интеграционные интерфейсы для загрузки данных из CSV / XML или что-то такое), помните о таком понятии, как Table HWM (high water mark). Переодически не забываете делать не просто delete, а truncate. Кроме того, при очень частой вставке / удалении большого количества записей, следите за размером redo-логов и датафайла с UNDO тейблспейсом.

                  — Для таблиц, на которые есть активные ссылающиеся внешние ключи из других таблиц, перед тем как можно будет делать truncate, придется пройтись сначала по схеме и отключить все ссылающиеся на таблицу внешние ключи (даже если нет реальных записей, ссылающихся на какие-то данные, сам факт наличия active внешнего ключа не даст сделать truncate).

                  — Если не следить на местом на диске, то с течением времени оракл может легко отъесть 30-40 гигабайт на диске, даже если у вас нет схем с большим объемом данных. Для борьбы с этим, из простейших методов, не забывайте стирать старые ненужные схемы (т.е. юзеров), и следить за тейблспейсами. Иногда может потребоваться сделать shrink tablespace самому. Неожиданно много места может съедать UNDO tablespace.

                  Если еще какие то типичные вещи вспомню, напишу.
                  0
                  Спасибо за пост.
                  В закладки, потому что тоже на работе придется писать на PHP под Oracle.
                  А тут такая классная памятка под рукой!
                    0
                    Когда будете ставить PDO_OCI на php 5.3, может не сработать make. Будет что то такое
                    /tmp/pear/download/PDO_OCI-1.0/pdo_oci.c:34:1: error: unknown type name 'function_entry'

                    Решается просто, в pdo_oci.c на 34 строке — заменяем «function_entry» на «zend_function_entry»
                      0
                      В случае с PHP 5.3.x, Oracle 12c и необходимостью собрать расширение PDO_OCI (для OCI8 в принципе порядок такой же) под Ubuntu (в принципе в любой *nix):
                      1. Скачиваем исходники PHP 5.3.x.
                      2. Переходим в папку php-5.3.x/ext/pdo_oci
                      3. Выполняем phpize (если не установлен, то установить через apt-get install php5-dev).
                      4. Вносим правки в файлы configure и config.m4:
                      — в строке SUPPORTED_LIB_VERS="9.0 10.1 11.1" добавляем версию 12.1: SUPPORTED_LIB_VERS="9.0 10.1 11.1 12.1"
                      — в строке case $PDO_OCI_VERSION in 9.0|10.1|10.2|11.1|11.2) аналогично: case $PDO_OCI_VERSION in 9.0|10.1|10.2|11.1|11.2|12.1)
                      5. Снова phpize.
                      6. make (если не установлен, то установить через apt-get install make).
                      7. Копируем готовый файл pdo_oci.so из папки modules в папку с расширениями php5.
                      8. Подключаем расширение pdo_oci как описано в статье.
                      9. Перезагружаем apache2. Выполняем phpinfo() и убеждаемся в наличии подключенного расширения PDO_OCI.

                      Only users with full accounts can post comments. Log in, please.