Edit: dodałem tekst o tym co może wyniknąć z połączenia DB2 z PHP.
O tym, czemu w temacie tej notki DB2 i PHP występują w jednym zdaniu, będzie gdzie indziej. A zapewniam, że temat jest interesujący. Poniżej opis jak zainstalować DB2 na serwerze z Linuxem ( testowaliśmy to na systemach: Fedora, CentOS, RedHat, Ubuntu ). Większość tego tutoriala została najpierw przetestowana przez Kamila, mi udało się rozwiązać kluczowy problem. Ale.. po kolei.
Ten poradnik jest też dla tych, którym po instalacji DB2 i sterowników pod PHP wyskakują błędy połączenia z bazą mimo, że wszystko poszło jak trzeba (patrzcie na punkt ostatni)!
Jaki Linux?
Po pierwsze, musimy zdecydować się na jakąś dystrybucję. DB2, jako, że jest produktem IBM’a, lubi się z RedHat’em (czyli z Fedorą i CentOS’em również) oraz SuSE. Kamilowi udało się to wszystko zrobić na Ubuntu. Myślę, że i inne dystrybucje dadzą sobie radę.
Ja osobiście używam Windowsa ( tak, Windowsa ) jako środowiska do pisania kodu, natomiast Linux’a postawionego mam na SUN’owskim VirtualBox‘ie. Do plików na nim dostaje się przez Sambę. Dzięki temu PDT myśli, że pracuje na Windzie, a ja odpalam wszystko na Linuxie. Jak się komuś spodoba taki sposób, to napiszę kiedyś jak to sobie ustawić wszystko.
Ale.. nie chce wywoływać burzy Win vs. Linux, czy dystrybucja A vs. dystrybucja B, więc na tym co powyżej poprzestanę.
Czego mi potrzeba?
Na pewno wspomnianego już Linux’a ;-) Poza tym trzeba ściągnąć DB2 w wersji Express-C (testowaliśmy z wersją 9.5 jak i 9.7 ), chyba, że ktoś ma licencje na pełną wersję DB2. Ale nie sądzę, żeby wtedy wchodził na mojego bloga ;-)
Jako, że na końcu tego tutoriala mamy mieć możliwość podłączenia się do DB2 za pomocą PHP – to przyda się mieć Apache’a oraz PHP ( my używaliśmy do tego 5.3.1 ). My zaczynaliśmy od czystego, ale myślę, że nie będzie problemów z “brudnym”.
Przy instalacji DB2 przez setup graficzny trzeba mieć zainstalowaną Java’e. Sposób wytestowany jest zarówno graficznie jak i z linii poleceń, aczkolwiek druga opcja oznacza więcej ręcznego babrania się w konfiguracji. W przypadku serwerowych systemów trudno o jakiegoś managera okien, jeżeli bawimy się na Linux’owym desktopie – to droga wolna.
Aby skompilować DB2 oraz drivery do połączenia z PHP potrzebny jest.. kompilator ( d-oh! ). Wypada więc zainstalować gcc .
Instalacja DB2
Ja omówię instalacje z linii poleceń. Kamil pewnie wrzuci na swojego bloga informacje o instalacji graficznej. Chociaż ona zazwyczaj polega na czytaniu tego co na ekranie i umiejętnym klikaniu “next” ;-)
Z linii poleceń
Ściągamy plik, rozpakowujemy, wchodzimy do katalogu który powstał, potem od katalogu expc no i zaczyna się zabawa..
1. Uruchamiamy:
./db_install
2. Wybieramy katalog instalacji ( domyślnie jest to /opt/ibm/db2/V9.[x]), katalog trzeba zapamiętać! ( x to wersja DB2 którą się instaluje ).
3. Wpisujemy “EXP” i pacamy “enter”
4. Instalacja robi swoje, idziemy po herbatę/kawę/colę/lub-gdzie-chcemy ;-)
5. Jeżeli wróciliśmy i na ekranie znaleźliśmy błąd w stylu
ERROR:
The following library files could not be loaded by db2langdir
in /tmp/exp/disk1/db2/linux/install/../bin
libstdc++.so.5
libstdc++.so.5
to oznacza to iż brakuje nam niektórych bibliotek C++ i musimy zrobić coś takiego
yum install compat-libstdc++-33
Po czym wracamy do pkt. 1 .
6. Przechodzimy do konfiguracji serwera po instalacji ręcznej. Opis tego procesu, po polsku, znajduje się w InfoCenter IBM’a.
Parę wskazówek, sugestii i rzeczy pomocnych do pkt 6. :
1) nie bawcie się w zmienianie domyślnych, sugerowanych tam rzeczy, jeżeli nie wiecie co robicie. DB2 w wielu miejscach ma różne ustawienia, które również trzeba wtedy zmienić. Czasem trudno do tego dojść. Jeżeli zdecydujecie się na wprowadzenie DB2 na produkcyjny serwer – wtedy poświęćcie czas na dokładniejszą naukę i zrozumienie zasad działania DB2.
2) w podpunkcie 3cim, jako typ uwierzytelniania, wybieramy “server”. Jest to najpopularniejsza metoda uwierzytelniania do której jesteśmy przyzwyczajeni. Jako login/hasło do bazy podajemy wtedy usera którego stworzyliśmy w podpunkcie 1szym. Czyli domyślnie db2inst1 i hasło takie jakie utworzyliśmy. Jak wyżej – nie kombinujcie z tym, chyba, że wiecie co robicie :-)
3) konfiguracja komunikacji DB2. W podpunkcie 3cim wpisujemy tą komendę
update database manager configuration using svcename serwer1|3100
razem ze znakiem |. Oczywiście biorąc pod uwagę swoją nazwę usługi, port itp.
Instalacja DB2 to, aktualnie, prościzna. Jeżeli trzymamy się instrukcji i czytamy to co “mówi” nam system – to jesteśmy w domu. “Tricky” jest kolejny punkt..
Instalacja driverów do DB2 dla PHP
Do połączenia się z DB2 potrzebujemy jakichś driverów. My używamy PDO_IBM. Dostępny jest także ibm_db2 który bardziej przypomina zestaw funkcji do MySQL’a, więc nie bierzemy go nawet pod uwagę (OOP ftw ;-) ).
Bardzo ważne jest aby zainstalować PDO_IBM w wersji 1.2.5 . Wersje wyższe (podczas pisania tego tekstu dostępne są 1.3.0 i 1.3.1) powodują sporo błędów przy wykonywaniu zapytań.
Kolejną sprawą jest to, że Fedora uparcie twierdzi, że PDO jest zainstalowane gdy próbujemy je zainstalować poprzez PECL’a. Natomiast gdy próbujemy zainstalować PDO_IBM to twierdzi, że PDO nie widział na serwerze. Tworzy to pewien impas. Jedynym sposobem na przełamanie owego jest ręczna kompilacja sterowników. A oto jak sprawić, by PHP miało PDO oraz PDO_IBM :
pecl download PDO_IBM-1.2.5
tar -xzf PDO_IBM-1.2.5.tgz
cd PDO_IBM-1.2.5
phpize
Jeżeli nie mamy phpize, trzeba sobie zainstalować paczkę php-devel poprzez
yum install php-devel.i686
Teraz czas na zapamiętany wyżej katalog, w którym zostało zainstalowane DB2. Należy go wstawić w miejsce mojego /opt/ibm/db2/V9.5/ .
./configure --with-pdo-ibm=/opt/ibm/db2/V9.5/
make
make install
W tym momencie plik pdo_ibm.so znajduje się w katalogu z extensions do PHP. Teraz należy dodać extension=pdo_ibm.so . W ulubionym edytorze stwórz sobie plik pdo_ibm.ini w katalogu /etc/php.d/ i wpisz tam extension=pdo_ibm.so .
Teraz resecik apache’a i..
php -m
Jeżeli nie ma błędu, a na liście pojawia się pdo_ibm – to jesteśmy w domu :-)
Tworzenie bazy danych w DB2
W necie jest dobry “survival guide” dla DB2. Jako, że jest to baza danych z długą historią życiową ma sporo naleciałości niezrozumiałych dla ludzi którzy nigdy nie mieli nic wspólnego z bazą danych tego typu. Jednym z przykładów na “wtf?” jest długość nazwy bazy danych. Otóż maksymalna długość nazwy bazy danych to 8 znaków.
Podobną śmiesznością jest “escapowanie” stringów. Otóż żeby “uciec” znak ‘ należy go poprzedzić drugim ‘. Czyli np.
SELECT ... WHERE name = 'Don''t be stupid!';
Żeby dostać się do linii poleceń db2, zakładając, ze właściciel instancji nazywa się db2inst1 klepiemy:
su db2inst1
db2
W linii poleceń db2 klepiemy:
create database test
I mamy już bazę danych ;-)
Tworzenie bazy danych DB2 nie uwzględniającej wielkości znaków przy sortowaniu ( do czego przyzwyczaja nas każda inna baza w standardzie )
W DB2 9.7 lub wyższej możemy sprawić, aby silnik nie uwzględniał wielkości liter przy sortowaniu. Aby tak się stało musimy stworzyć bazę z odpowiednim “collate”
CREATE DATABASE test
USING CODESET UTF-8 TERRITORY PL
COLLATE USING UCA500R1_LEN_S2
Ważna sprawa! Nie można zmienić “collate” później. Więc stosujcie to domyślnie przy tworzeniu bazy danych. Pomysł zgapiono z oficjalnego poradnika IBMa dotyczącego DB2.
Problem z kodowaniem znaków do UTF8
Jeszcze jeden mały “pro tip” który może się przydać, żebyście nie musieli przechodzić przez to co ja. Aby klient zwracał do PHP dane z odpowiednim kodowaniem UTF8 trzeba przelogować się na usera db2inst1 ( su db2inst1 ) i odpalić komendę
db2set db2codepage=1208
Miłej zabawy ;-)
A o pytania, instrukcje i sugestie proszę uderzać w komentarze. Nie uważam się za guru Linux’a ani za guru DB2 – to co tu opisałem to to do czego udało mi się dojść w ciągu ostatnich 3-4 lat obcowania z tą bazą w połączeniu z PHP.
Dopisz się do RSS 2.0.
Możesz skomentować, albo trackbackować z Twojej strony WWW.
Kamil Jakubowski | 16-maja-10 at 12:13 po południu | Permalink
Sprawdziłem na fedorze również niedawno wydany nowy pecl/PDO_IBM-1.3.2
Też są identyczne błędy przy zapytaniach.
Zenobius, czyli Piotr Baranowski | 19-czerwca-10 at 2:23 przed południem | Permalink
[...] będę jeszcze rozwijał. Postaram się też opublikować kod implementujący te rozwiązania. Opis instalacji DB2 na Linuxie i połączenie z PHP znajdziecie na moim blogu parę postów niżej. Napisane przez Zenobius dnia sobota, czerwiec [...]