nginx + php-fpm + pdo_oci

Автор mardoksp, 22 марта 2016, 02:54:46

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

mardoksp

Доброй ночи.

Сегодня весь день пытаюсь подключиться к базе данных Oracle (11.1).

На борту

Debian 8
nginx/1.9.10
PHP 5.6.17-3 (cli)


Мой не легкий путь:

1. Скачал basic-11.1.0.6.0-linux-x86_64.zip и sdk-11.1.0.6.0-linux-x86_64.zip и распаковал в /opt/oracle/instantclient

2. Сделали линки
$ ln -s libclntsh.so.* libclntsh.so
$ ln -s libocci.so.* libocci.so


3. Создал папку network/admin и туда слил sqlnet.ora и tnsnames.ora

4. Поставил oci8
$ apt-get install --yes php5 php5-cli php5-dev php-db php-pear
$ apt-get install --yes build-essential libaio1
$ pecl install oci8
$ echo "extension=oci8.so" > /etc/php5/mods-available/oci8.ini
$ php5enmod oci8

   
5. Рестартанул все что можно и в модулях появился oci. Но это не поможет, так как используется yii2, нужен pdo_oci. Идем дальше

6. Фиксим пути
$ cd /usr/include/
$ ln -s php5 php
$ cd /opt/oracle/instantclient
$ mkdir -p include/oracle/11.1/
$ cd include/oracle/11.1/
$ ln -s ../../../sdk/include client
$ cd -
$ mkdir -p lib/oracle/11.1/client
$ cd lib/oracle/11.1/client
$ ln -s ../../../../ lib
$ cd -


7. Качаю pdo из pecl
$ pecl channel-update pear.php.net
$ pecl download pdo_oci


Опа, тут ругается, что
This package is not maintained anymore and has been superseded. Package has moved to channel http://www.php.net/pdo_oci, package ext/pdo_oci.

Все мои попытки собрать не удались, ну ладно, идем на http://php.net и сливаем дистр пыха моей версии
http://php.net/get/php-5.6.17.tar.gz/from/a/mirror

8. Анзипаем и идем в папку */ext/pdo_oci
$ phpize 
$ ./configure --with-pdo-oci=instantclient,/usr,11.1 
$ make && make install
$ echo "extension=pdo_oci.so" > /etc/php5/fpm/conf.d/20-pdo_oci.ini
$ echo "extension=pdo_oci.so" > /etc/php5/cli/conf.d/20-pdo_oci.ini


Нужный файлик pdo_oci.so лежит по адресу /usr/lib/php5/20131226

9. Рестартуем все
$ service php5-fpm restart
$ service nginx restart


10. Проверяем
$ php -m
PDO_OCI


$ php -i | grep pdo
/etc/php5/cli/conf.d/10-pdo.ini,
/etc/php5/cli/conf.d/20-pdo_mysql.ini,
/etc/php5/cli/conf.d/20-pdo_oci.ini,
/etc/php5/cli/conf.d/20-pdo_sqlite.ini,
pdo_mysql
pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock
pdo_sqlite


Ну ладненько, создаем простенький файлик

<?php
$user 
'a';
$pass 'b';

try {
    
$dbh = new PDO('oci:dbname=//192.168.90.1:1521/orcl'$user$pass);
    foreach(
$dbh->query('SELECT 2+2 FROM dual') as $row) {
        
print_r($row);
    }
    
$dbh null;
} catch (
PDOException $e) {
    print 
"Error!: " $e->getMessage() . "<br/>";
    die();
}

?>


И получаем ошибку

Error!: SQLSTATE[42S02]: pdo_oci_handle_factory: Error while trying to retrieve text for error ORA-12154 (/root/Downloads/php-5.6.17/ext/pdo_oci/oci_driver.c:635)

Добавил, на всякий случай, окружение в php5-fpm по адресу /etc/php5/fpm/pool.d/www.conf
env[ORACLE_HOME] = /opt/oracle/instantclient/
env[LD_LIBRARY_PATH]=/opt/oracle/instantclient/lib
env[NLS_LANG]="AMERICAN_AMERICA.AL16UTF16"


И ничего. Абсолютно ничего.

Я устал уже пытаться пробовать все возможные варианты...
Что же это может быть?

Cообщение объединено 22 марта 2016, 08:35:03

Мда, решение оказалось банальным - вместо указания пути указал tnsname

$dbh = new PDO('oci:dbname=ORCL', $user, $pass);

Ну как так можно? Вчера это не работало, даже полное описание tnsname вставлял, ну да ладно. Значит не все было настроено.
Теперь как бы это развернуть с 0 еще раз на рабочий сервер :)