среда, 20 декабря 2006 г.

Как включить поддержку Firebird / Interbase в PHP на Linux

Однажды возникла необходимость добавить в PHP, установленный на сервере с ОС Fedora Core 3 поддержку СУБД Interbase, а точнее Firebird 1.5, т.к. именно этот сервер был установлен. Так получилось, что PHP был установлен и настроен при инсталляции ОС. Для решения проблемы всего то требовалось заполучить библиотеку interbase.so.
У меня PHP имел версию 4.3.9, поэтому пришлось искать именно такую версию исходников.
Далее был процесс разархивирования исходников и компиляции, НО БЕЗ УСТАНОВКИ!
./configure --with-interbase=shared
make

ВСЕ, НИКАКИХ make install
в папке modules появляется interbase.so.
Далее переносим его в папку, где хранятся аналогичные библиотеки для PHP и редактируем php.ini
Место, где PHP будет искать библиотеки определяется параметром extension_dir
В разделе Dynamic Extensions прописываем строчку extension=interbase.so
Далее рестартим apache (service httpd restart или как там у вас) и наслаждаемся.
© Ramzaj

Как поставить IBPerl на Linux

Предыстория.
Работал веб-сервер на RedHat какой то 6 в
ерсии, крутился Interbase и было много скриптов на Perl, которые использовали библиотеку IBerl(когда все разрабатывалось драйвера DBD:Interbase для DBI и впомине не было) для общения с СУБД Interbase. И однажды слетела ОС. Хотя все данные остались.
Выбрали:
ОС - FedoraCore 3
СУБД - Firebird 1.5
Языки - Perl, PHP
библиотеки API - IBerl, новые скрипты на DBI+DBD:Interbase
К тому времени IBPerl уже не поддерживался и найти сам дистрибутив стоило труда, но еще большего труда стоило бы перевести все эти многие сотни скриптов на связку DBI+DBD:Interbase
История
Начал устанавливать IBPerl.
Разархивировал.
Начал собирать.
[root@www install]# gunzip IB
IB/ IBPerl-08p3.tar.gz
[root@www install]# gunzip IBPerl-08p3.tar.gz
[root@www install]# tar -xvf IBPerl-08p3.tar
[root@www IBPerl-0.8p3]# perl Makefile.PL
IBPerl 0.8p3 detecting InterBase LI-V1.5.2.4731 Firebird 1.5 (1.5) on the linux platform...

Checking if your kit is complete...
Looks good
Writing Makefile for IBPerl

You must now run 'make'.
[root@www IBPerl-0.8p3]# make
cp IBPerl.pm blib-linux-gcc/lib/IBPerl.pm
/usr/bin/perl /usr/lib/perl5/5.8.5/ExtUtils/xsubpp -noprototypes -typemap /usr/lib/perl5/5.8.5/ExtUtils/typemap IBPerl.xs > IBPerl.xsc && mv IBPerl.xsc IBPerl.c
gcc -c -I"/opt/firebird/include" -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -m32 -march=i386 -mtune=pentium4 -DVERSION=\"0.8p3\" -DXS_VERSION=\"0.8p3\" -fPIC "-I/usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE" -UIBDEBUG -DIBVERSION=1.5 IBPerl.c
In file included from IBPerl.xs:17:
IBPerl.h:74: error: redefinition of `struct vary'
make: *** [IBPerl.o] Ошибка 1
[root@www IBPerl-0.8p3]#
Стал выяснять что за структура такая.
Она имела следующий вид:
typedef struct vary {
short vary_length;
char vary_string [1];
} VARY;
Выяснил, что структура vary нужна для работы с varchar. Раньше эту структуру надо было декларировать самостоятельно, теперь она задекларирована в ibase.h. Отсюда и ошибка. Поэтому надо было внести изменения в виде условной компиляции такого вида:
if FB_API_VER >= 15
typedef struct vary VARY;
else
typedef struct vary {
short vary_length;
char vary_string[1];
} VARY;
endif

Так как у меня СУБД - Firebird 1.5, то я с условной компиляцией не заморачивался, а просто заменил тот кусочек кода на такой:
typedef struct vary VARY;
И все отлично поставилось. Потом я исправленный дистрибутив заархивировал и держу его у себя на винчестере на "всякий пожарный случай".
© Ramzaj