2016-02-09 15:28:52

Установка Oracle Client на Mac OS

PHP Oracle Mac OS

В продолжение темы про установку Oracle Client на Windows расскажу про свой опыт установки аналогичной связки для Mac OS.

На старте имеем Mac OS X 10.10 Yosemite в которой уже работает штатный web сервер apache и php 5.4. Цель первая - получить рабочий Oracle Client, иметь возможность работать с Oracle через Toad (да да, для мака есть тоад, и он бесплатный). Цель вторая - иметь возможность работать с Oracle из PHP.

Для начала качаем Oracle Instant Client для Mac OS с сайта oracle.com (там нужно регистрироваться):

  • instantclient-basic-macos.x64-11.2.0.4.0.zip (обязательно)
  • instantclient-sqlplus-macos.x64-11.2.0.4.0.zip (если хотим проверить, а тоад ставить нет планов)
  • instantclient-sdk-macos.x64-11.2.0.4.0.zip (если планируем использовать в PHP)

* я для себя выбрал 11-ю версию для того чтоб иметь возможность работы со старыми БД, например 9-й версии.

Распаковываем содержимое архивов в удобное место, для меня это /Library/Oracle. Возможны и другие варианты, но для меня более логично показалось так, далее все описания будут производиться относительно этого пути.

В результате получаем вот такую структуру папок:

/Library/Oracle/instantclient_11_2
/Library/Oracle/instantclient_11_2/sdk (если решили с SDK)

Далее создаем линки:

cd /Library/Oracle/instantclient_11_2
ln -s libclntsh.dylib.11.1 libclntsh.dylib
ln -s libocci.dylib.11.1 libocci.dylib.dylib


Переменные окружения

Для работы нам потребуются

ORACLE_HOME
NLS_LANG
TNS_ADMIN
PATH
DYLD_LIBRARY_PATH
CLASSPATH

Для начала в свой ~/.bash_profile пишем следующее

export ORACLE_HOME=/Library/Oracle
export NLS_LANG=American_America.UTF8
export TNS_ADMIN=/Library/Oracle # здесь у меня будет лежать уже имеющийся tnsnames.ora
export PATH=/Library/Oracle/instantclient_11_2:$PATH
export DYLD_LIBRARY_PATH=/Library/Oracle/instantclient_11_2:$DYLD_LIBRARY_PATH
export CLASSPATH=$ORACLE_HOME:$CLASSPATH

Для продолжения в /etc/launchd.conf пишем следующее

setenv ORACLE_HOME /Library/Oracle
setenv NLS_LANG American_America.UTF8
setenv TNS_ADMIN /Library/Oracle

В принципе этот метод считается не рабочим начиная с Mac OS X 10.10 Yosemite.

Кладем свой tnsnames.ora в TNS_ADMIN и после того как все файлы на своих местах меняем права на ORACLE_HOME:

sudo chgrp –R wheel /Library/Oracle
sudo chmod –R 755 /Library/Oracle

Теперь можно перезагружаться и проверять соединение при помощи SQLPlus.

Настраиваем Toad

Toad для Mac OS бесплатен и доступен в AppStore. Ставим привычным путем. После запуска Toad надо в настройках в разделе Databases > Oracle Database жмем кнопку Add и выбираем файл /Library/Oracle/instantclient_11_1/ojdbc6.jar

Важно! Далее при создании соединения нужно в разделе JDBC Driver выбирать наш свеже добавленный JAR от Oracle Instatnt Client, в противном случае нормально работать не будет.

На этом простая часть нашей работы завершена, у нас есть возможность работы с Oracle через Toad.

Включаем OCI8 в PHP

В моем случае это PHP 5.5.14 который изначально был в Mac OS X Yosemite, это подкинуло несколько проблем. Так же хочу заметить что у нас установлен Instant Client SDK (точнее просто распакован в нужное место).

Для начала нам потребуется PEAR для того, чтоб при помощи входящего в его состав PECL получить и собрать расширение OCI8. Итак качаем и ставим PEAR:

curl -O http://pear.php.net/go-pear.phar
sudo php -d detect_unicode=0 go-pear.phar

После этого вам будет предложено куда что ставить из нескольких пунктов, для себя я решил так:

1. /usr/local/pear
4. /usr/local/bin

Теперь при помощи PECL нужно поставить oci8, тут начинаются сложности:

  1. Нам нужен oci8 правильной версии, для PHP 5.x это 2.0.10
  2. Чтоб собрать oci8 нам потребуется autoconf (ну по крайней мере в моем случае)
  3. А для того чтоб собрать autoconf нам потребуется XCode с инструментами командной строки

Чтоб не повторять всех моих ошибок опишу как надо было поступить в правильном порядке

Ставим XCode

Тут все просто, в консоли говорим

gcc

и в появившемся диалоге жмем установить, дожидаемся завершения установки и продолжаем.

Собираем autoconf

В принципе, он должен поставиться вместе с XCode, но если такого не произошло то качаем и собираем его:

curl http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz > autoconf.tar.gz
tar -xvzf autoconf.tar.gz
cd autoconf-2.69
./configure
sudo make
sudo make install

Ставим oci8

sudo pecl install oci8-2.0.10

в процессе установки нужно будет указать путь к ORACLE_HOME, скрипт задаст вопрос:

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] :

На который нужно ответить

instantclient,/Library/Oracle/instantclient_11_2

Когда установка завершится, идем в /etc/php.ini, находим где описаны расширения и раскомментируем или добавляем

extension=oci8.so

На всякий случай можно проверить наличие расширения oci8.so в файловой системе, у меня оно оказалось в /usr/lib/php/extensions/no-debug-non-zts-20121212/oci8.so

И еще очень важный момент, чтоб все работало нужно сказать нашему серверу Apache переменные окружения для Oracle. Делается это следующим образом:

cd /System/Library/LaunchDaemons
sudo vim org.apache.httpd.plist

Добавляем туда DYLD_LIBRARY_PATH и TNS_ADMIN, в общем после правки файл выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <true/>
        <key>Label</key>
        <string>org.apache.httpd</string>
        <key>EnvironmentVariables</key>
        <dict>
                <key>XPC_SERVICES_UNAVAILABLE</key>
                <string>1</string>
                <key>DYLD_LIBRARY_PATH</key>
                <string>/Library/Oracle/instantclient_11_2</string>
                <key>TNS_ADMIN</key>
                <string>/Library/Oracle</string>
        </dict>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/sbin/httpd</string>
                <string>-D</string>
                <string>FOREGROUND</string>
        </array>
        <key>OnDemand</key>
        <false/>
</dict>
</plist>

То, что надо добавить выделено жирным, пути соответственно тому что у меня. На этом все готово, перезапускаем апач:

sudo apachectl restart

И убеждаемся что у нас появилась информация о расширении oci8 в phpinfo.

На все эти изыскания у меня ушло примерно пол дня, надеюсь информация будет вам полезна и у вас получится повторить мой опыт и избежать ошибок, с которыми пришлось повозиться мне :)

Ссылки на использованные материалы: