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á. 
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 
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 
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 
Jestli nám to funguje zjistíme samozřejmě kódem
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)
Komentáře
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á
cau, jj, tak nějak
cau, jj, tak nějak

člověk musí mít náladu něco psát a já mám teď nějakou jarní únavu
Roční cyklus
Jj, to znám. Plynule přecházím z jarní únavy v letní estivaci, podzimní deprese a zimní spánek
tak to ja zacinam jarni
tak to ja zacinam jarni aktivitou, letnim koprem, podzimni melancholii a zimnim zachvatem prace
ale fuj
Což si nepamatuješ, co pravil klasik? "Hlavně, chlapče, neepracuuj!"
jen doplním zpětně
jen doplním zpětně komentář který mě vzal 3 hodiny života
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
) 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
DIK !
Diky,
tohle je presne to co sem hledal a potreboval !
Poslat nový komentář