Připojení z PHP k Oracle databázi

Tento článek se Maců týká jen okrajově, neboť ačkoli Oracle lze provozovat i na Mac OS X, pochybuji, že kombinace Oracle & Mac OS X bude v Československu nějak rozšířená. Smiling

Přestože v tomto článku jde o Linux, musím se s vám podělit, protože je to jednak určitě technicky zajímavé, řadě lidí to díky Googlu může pomoci a až to budu jednou znovu opakovat, vím kde jsem si to poznačil Laughing out loud

První co potřebujete je mít Oracle server - ať už vzdáleně někde na serveru nebo lokálně. Oracle nabízí své produkty pro vývoj, testování a sebevzdělávání zcela zdarma, pro komerční nasazení je možné použít zdarma například Oracle XE, pokud vám nevadí že nebudou dostupné aktuliazace, podpora a některá omezení. Dobře, server máme, protože nám ho hodný správce někde nakonfiguroval nebo nám dal přístup, případně jsme byli šikovní a rozběhali si ho sami Eye-wink

Drtivá většina Linuxových distribucí má v PHP přímo zkompilovánu podporu pro MySQL, pro Oracle by bylo potřeba PHP překompilovat. Do toho se řadě lidí nechce, ať už kvůli tomu, že neví jak do toho, nebo prostě proto, že mají už připravené balíčky ze své distribuce a pokud si PHP překompilují, budou si ho muset od toho okamžiku udržovat sami. My si ale ukážeme jak to udělat méně bolestivě bez nutnosti rekompilace PHP v distribuci.

Na počítač ze kterého chceme z PHP k Oracle databázi přistupovat je třeba nejprve nainstalovat potřebné balíčky, já jsem použil distribuci openSUSE 10.3 a potřebné balíčky pro Oracle byly:
autoconf
php5
apache2-mod_php5
php5-pdo
php5-devel
php5-pear

Poté je potřeba stáhnout Oracle InstantClienta - a sice Basic a navíc SDK:
http://www.oracle.com/technology/tech/oci/instantclient/index.html
Budeme ještě potřebovat oci8 z http://pecl.php.net/get/oci8

Teď začneme telegraficky, protože kdo umí, pochopí, kdo neumí tomu ani tisíc slov nepomůže...

Vytvoříme si složku třeba /opt/oracle:
mkdir /opt/oracle
cd /opt/oracle

nakopírujeme tam všechny tři balíčky (basic, sdk, oci8) a rozbalíme oba dva instantclienty a sice v tomto pořadí:
unzip instantclient-basic-linux-*.zip
unzip instantclient-sdk-linux-*.zip

vlezeme si do vytvořené složky:
/opt/oracle/instantclient_10_2

vytvoříme si symbolický link:
ln -s libclntsh.so.10.1 libclntsh.so

Pokud máme Oracle databázový server lokálně, provedeme následující, pokud ho máme vzdáleně, následující 3 příkazy přeskočíme a jdeme rovnou instalovat oci8
echo $ORACLE_HOME
ORACLE_HOME=/path/to/oracle/database/server
export ORACLE_HOME

Instalujeme oci8 - nejprve si skočíme na původní místo kam jsme kopírovali 3 balíčky (2 jsme rozbalovali) a vrhneme se na instalaci oci8
cd /opt/oracle
pear5 install oci8-1.3.1.tgz
(nahraďte pochopitelně aktuální verzí)

Po chvíli chroupání vyskočí bubák ve stylu:
Please provide the path to ORACLE_HOME dir. Use 'instantclient,/path/to/instant/client/lib'
if you're compiling against Oracle Instant Client [autodetect] :

my se nelekneme a zadáme mu cestu kam jsme rozbalili instantclienta:
instantclient,/opt/oracle/instantclient_10_2

a pokračujeme. Po další chvilce chroupání vyskočí kouzelná slovíčka jako "successfully" a věta "You should add "extension=oci8.so" to php.ini"
což my právě uděláme.

zeditujeme soubor /etc/php5/apache2/php.ini a /etc/php5/cli/php.ini
Do obou přidáme:
extension=oci8.so

Nakonec je potřeba říci systému kde najde knihovny:
Do souboru /etc/ld.so.conf přidáme:
/opt/oracle/instantclient_10_2

a spustíme příkaz:
ldconfig

restart je už jen nepovinný, volitelný a tak vůbec, ale raději ho uděláme Eye-wink

Jestli nám to funguje zjistíme samozřejmě kódem Eye-wink ale jinak se můžeme podívat i na phpinfo() a měli byste vidět něco podobného jako na obrázku:



Čili ve zkratce:
- potřebujeme si stáhnout InstantClienta (Basic + SDK)
- oba rozbalíme a vytvoříme symlink
- potřebujeme si stáhnout oci8
- nainstalujeme přes pear
- přidáme si extension do php.ini
- zadáme si LD_LIBRARY_PATH (/etc/ld.so.conf)

Průměr: 5 (1 hlas)

Komentáře

Obrázek uživatele hroch32

Pěkné

Jako ne že bych to využil, ale je to pěkné a vychytané.

BTW: Už jsem se bál, že jsi Netmanii opustil, ale i podle příspěvků na MM tipuju, že spíš máš asi takový přebytek času jako já Eye-wink

Obrázek uživatele Radek Šíp

cau, jj, tak nějak

cau, jj, tak nějak Smiling
člověk musí mít náladu něco psát a já mám teď nějakou jarní únavu Smiling

Obrázek uživatele hroch32

Roční cyklus

Jj, to znám. Plynule přecházím z jarní únavy v letní estivaci, podzimní deprese a zimní spánek Laughing out loud

tak to ja zacinam jarni

tak to ja zacinam jarni aktivitou, letnim koprem, podzimni melancholii a zimnim zachvatem prace Laughing out loud

Obrázek uživatele hroch32

ale fuj

Což si nepamatuješ, co pravil klasik? "Hlavně, chlapče, neepracuuj!" Evil

Obrázek uživatele Radek Šíp

jen doplním zpětně

jen doplním zpětně komentář který mě vzal 3 hodiny života Smiling
Oracle umožňuje mít jiné kódování databázového stroje, jiné jednotlivých databází a připojující se klient pak může mít také jiné kódování a navíc si může některé parametry ještě měnit za chodu v každé session.
kombinace klient<->session<->server<->db si pak může za chodu zcela korektně přehazovat kódování.

Pokud chcete aby vám správně fungovala výše uvedená podpora i s češtinou, musíte mít zřejmě v systému před kompilací správně nastavené NLS_LANG, protože oci8 si pro něj sáhne a použije. Na pro češtinu v UTF-8 by to mělo být např.:
NLS_LANG="CZECH_CZECH REPUBLIC.AL32UTF8"

Já jsem strašně dlouho řešil, proč když je databáze v UTF-8, klient i server ho mají nastavené tak stránky pořád zobrazují obsah databáze bez diakritiky v ASCII... důvodem bylo že oci8 jsem zkompiloval v době, kdy na klientovi ještě nebylo správně nastavené NLS_LANG a použila se proto americká výchozí nastavení.

tip:
Na svém openSUSE jsem to udělal tak, že jsem vytvořil soubor /etc/profile.local, do něj dal:
export NLS_LANG="CZECH_CZECH REPUBLIC.AL32UTF8"

a překompiloval znovu pear5 install oci8-atd... v době kdy NLS_LANG bylo správné jak jsem ho chtěl.

Update: Tímto je vyhráno až do příštího restartu. Apache je mrcha a před jeho startem by tohle už mělo být nastavené, jinak si natáhne PHP bez této proměnné a opět jedeme ASCII... takže do startovacího skriptu Apache /etc/init.d/apache2 dejte někam na vhodné místo (mluvme o začátku skriptu Smiling ) toto:
export NLS_LANG="CZECH_CZECH REPUBLIC.AL32UTF8"
Apache by se tak měl vždy startovat s nastavenou proměnnou a natažené oci8 v PHP by mělo podporovat UTF8 a české prostředí. Asi by to šlo dát i jinam do /etc/init.d ale takhle je to jistota Smiling

DIK !

Diky,
tohle je presne to co sem hledal a potreboval !

Poslat nový komentář

Smajlíci
:);):(:D}:):P:O:?8):jawdrop::sick:
Obsah tohoto pole je soukromý a nebude veřejně zobrazen.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <center> <embed> <embed> <img> <table> <td> <tr> <th> <font> <hr>
  • Řádky a odstavce se zalomí automaticky.
  • Textové smajlíky budou nahrazeny grafickými variantami.

Více informací o možnostech formátování

CAPTCHA
Tento dotaz je zde pro otestování zda jste skutečný návštěvník a pro zabránění automatizovaným robotům ve vkládání spamu do komentářů a stránek.
9 + 6 =
Vyřešte tento jednoduchý matematický problém a zadejte výsledek. Např. pro 1+3, napište 4.