Mac$OS$X$Snow$Leopard:$IBM$InformixIDS11.5+PHP5.3...Copyright*©2009*–Antonio*Musarra*–** *...
Transcript of Mac$OS$X$Snow$Leopard:$IBM$InformixIDS11.5+PHP5.3...Copyright*©2009*–Antonio*Musarra*–** *...
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Mac OS X Snow Leopard: IBM Informix IDS 11.5 + PHP 5.3
1.1 Introduzione Da quando IBM1 ha esteso il supporto di Informix Dynamic Server (IDS) a
Mac OS X, definendo vincente la combinazione dei due, IBM ha fatto la felicità di migliaia di sviluppatori e DBA non più costretti ad avere un server IDS remoto sui cui lavorare.
In quest’articolo vedremo come installare e configurare in semplici passi IBM Informix IDS 11.5 sul nostro Mac OS X Snow Leopard. La particolarità illustrata nella parte finale dell’articolo è l’installazione del modulo informix su PHP 5.3, ricordiamo che PHP 5.3 è parte integrante di Mac OS X Snow Leopard.
1.2 Installazione IDS Informix 11.5 Dal sito di IBM dovremmo scaricare la versione di IBM IDS Informix 11.5
per Mac OS X, in particolare la versione Developer2 di Informix, il download richiede però la registrazione al portale IBM. Il software è distribuito sottoforma di un unico file dmg (iif.11.50.FC5DE.macosx64.dmg) della dimensione di circa 138MByte, al suo interno è disponibile il package d’installazione. Il processo d’installazione è molto semplice, non ci sono particolari indicazioni da seguire eccetto che per la directory di installazione: è consigliabile scegliere la directory /opt/IBM/informix invece della directory /Application proposta dall’installer.
Tramite l’ausilio delle Figure illustrate di seguito, vedremo come avviene il processo d’installazione.
Figura 1 Installer IDS Informix 11.5
1 Portale IDS Mac http://www-‐01.ibm.com/software/data/informix/mac/ 2 Download della versione IDS 11.50 FC5 DE dall’URL: http://www14.software.ibm.com/webapp/download/preconfig.jsp?id=2008-‐05-‐23+14%3A54%3A11.294505R&S_TACT=104CBW71&S_CMP=
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Figura 2 Esecuzione dello script d’installazione
Figura 3 Richiesta della password di amministratore.
Figura 4 Installer IDS Informix 11.50
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Figura 5 Directory d’installazione da cambiare in /opt/IBM/informix
Figura 6 Componenti IDS che saranno installati
Figura 7 Separazione dei ruoli. Lasciare il valore di default
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Figura 8 Creazione di una demo IDS instance. Lasciare il valore di default
Figura 9 Riepilogo installazione IDS
Figura 10 Note di fine installazione
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Figura 11 Termine installazione
Il processo d’installazione, oltre alla sola copia del software nella directory indicata, è responsabile della creazione sul nostro Mac OS X dell’utenza informix, questa sarà utilizzata per compiere le operazioni solitamente affidate al ruolo di DBA.
Nel prossimo paragrafo vedremo la fase di configurazione dell’ambiente d’esecuzione e dello stesso Informix.
1.3 Configurazione Il processo di configurazione potremmo divederlo in due fasi:
• Configurazione ambiente d’esecuzione; • Configurazione Informix.
Per quel che riguarda l’ambiente d’esecuzione occorre impostare le variabili d’ambiente indicate di seguito:
• INFORMIXDIR => Directory d’installazione Informix; • INFORMIXSERVER => Nome assegnato all’istanza Informix; • INFORMIXSQLHOSTS => File di configurazione SQL HOSTS; • ONCONFIG => File di configurazione dell’instanza Informix; • DYLD_LIBRARY_PATH => Path Informix Libs; • TERMCAP => File di configurazione terminali; • DB_LOCALE => Imposta il Locale per DB; • CLIENT_LOCALE => Imposta il Local per client.
E’ possibile impostare le variabili d’ambiente Informix direttamente all’interno del file .profile dell’utenza informix (vedi Listato 1).
Per la configurazione di Informix dovremmo apportare delle modifiche alla configurazione standard, sono due i file di configurazione sui quali agire,
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
ambedue definiti dalle due variabili di ambiente: ONCONFIG e INFORMIXSQLHOSTS.
Per il file definito da ONCONFIG è consigliabile modificare le sezioni che riguardano:
• Root Dbspace Configuration Parameters; • System Configuration Parameters; • Network Configuration Parameters
Procedendo con l’ordine indicato in precedenza andremo a modificare e/o aggiungere le configurazioni di seguito indicate (vedi Listato 2).
Listato 2 Modifica della configurazione standard di Informix.
################################################################### # Root Dbspace Configuration Parameters ################################################################### ROOTPATH $INFORMIXDIR/dbs/amusarra_ifx.rootdbs MIRRORPATH $INFORMIXDIR/dbs/amusarra_ifx.root_mirror ################################################################### # System Configuration Parameters ################################################################### DBSERVERNAME amusarra_ifx DBSERVERALIASES shirus,amusarra_shm ################################################################### # Network Configuration Parameters ################################################################### NETTYPE soctcp,1,30,NET
Ho preferito collocare i file del Root Dbspace in dbs invece che in tmp e assegnare loro il nome dell’istanza Informix come suffisso.
Nella configurazione standard è configurato il solo protocollo ipcshm, nella nostra configurazione è stato aggiunto il protocollo soctcp. Per maggiori informazioni su questa parte di configurazione consiglio la lettura della documentazione ufficiale IDS Informix su NETTYPE Configuration Parameter.
Listato 3 Modifica delle configurazione SQL Hosts
# IANA (www.iana.org) assigned port number/service names for Informix: # sqlexec 9088/tcp # sqlexec-ssl 9089/tcp #demo_on onipcshm on_hostname on_servername #demo_se seipcpip se_hostname sqlexec amusarra_ifx onsoctcp amusarra-mobile.local sqlexec shirus onsoctcp amusarra-mobile.local sqlexec-admin amusarra_shm onipcshm amusarra-mobile.local amusarra-mobile
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Il Listato 3 indica la configurazione del file sqlhosts opportunamente modificato sulla base delle nostre esigenze (per maggiori informazioni fare riferimento alla documentazione ufficiale IDS Informix su The sqlhosts File). Lo IANA ha definito delle porte TCP specifiche per i servizi Informix, queste devono essere aggiunte al file di configurazione dei servizi di rete (vedi Listato 4).
Listato 4 Aggiunta delle porte TCP per i servizi di rete Informix (/etc/services).
sqlexec-admin 9087/tcp # IBM Informix SQL Interface - Admin Port sqlexec 9088/tcp # IBM Informix SQL Interface sqlexec-ssl 9089/tcp # IBM Informix SQL Interface - Encrypted
1.4 Preparazione e inizializzazione di Informix Prima di procedere con il processo d’inizializzazione di Informix, occorre
creare il file “vuoti” dei root dbspace assegnando loro i permessi di lettura e scrittura per il solo utente informix. Dal Terminal, come utente informix, procediamo così come indicato nel Listato 5.
Listato 5 Creazione directory e file “vuoti” root dbspace
amusarra-mobile:~ informix$ mkdir $INFORMIXDIR/dbs amusarra-mobile:~ informix$ touch $INFORMIXDIR/dbs/amusarra_ifx.rootdbs amusarra-mobile:~ informix$ touch $INFORMIXDIR/dbs/amusarra_ifx.rootdbs_mirror amusarra-mobile:~ informix$ chmod 660 $INFORMIXDIR/dbs/amusarra_ifx.rootdbs amusarra-mobile:~ informix$ chmod 660 /opt/IBM/informix/dbs/amusarra_ifx.rootdbs_mirror
Ricordo che la variabile di ambiente INFORMIXDIR fa riferimento alla directory d’installazione del software IBM IDS Informix, nel nostro caso la variabile INFORMIXDIR vale: /opt/IBM/informix. Le condizioni per inizializzare la nostra istanza ci sono tutte, procediamo quindi con l’inizializzazione eseguendo il comando:
amusarra-mobile:~ informix$ oninit -y -i –v
Il comando oninit esegue l’inizializzazione dei dbspaces e della shared memory lasciando on-line l’istanza informix. L’opzione –v indicata al comando oninit consente di vedere in output il dettaglio delle operazioni eseguite durante il processo d’inizializzazione (vedi Listato 6).
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Listato 6 Parte di output del comando oninit
Checking group membership to determine server run mode...succeeded Reading configuration file '/opt/IBM/informix/etc/onconfig.std'...succeeded Creating /INFORMIXTMP/.infxdirs...succeeded Checking config parameters...succeeded Allocating and attaching to shared memory...succeeded Creating resident pool 14708 kbytes...succeeded Allocating 200016 kbytes for buffer pool of 4K page size...succeeded Creating infos file "/opt/IBM/informix/etc/.infos.amusarra_ifx"...succeeded Linking conf file "/opt/IBM/informix/etc/.conf.amusarra_ifx"...succeeded Initializing rhead structure...succeeded Writing to infos file...succeeded Initialization of Encryption...succeeded Initializing ASF...succeeded Forking 1 'soctcp' listener threads...succeeded Forking 1 'soctcp' listener threads...succeeded Forking 1 'ipcshm' listener threads...succeeded Starting tracing...succeeded Initializing 8 flushers...succeeded Initializing log/checkpoint information...succeeded Initializing dbspaces...succeeded Opening primary chunks...succeeded Opening mirror chunks...succeeded Validating chunks...succeeded Creating database partition...succeeded
Per verificare che tutto sia andato per il verso giusto, con il data base in modalità on-line, eseguiamo il comando:
amusarra-mobile:~ informix$ onstat –
l’output dovrebbe essere simile a:
IBM Informix Dynamic Server Version 11.50.FC5DE -- On-Line -- Up 00:00:25 -- 250928 Kbytes
1.5 Creazione Stores Demo data base Da qualche minuto la nostra istanza di informix è on-‐line, dovremo quindi
creare almeno un data base su cui poter effettuare tutte le nostre prove. L’installazione di IBM IDS Informix comprende una serie di schemi demo completi di dati, noi utilizzeremo lo schema Stores Demo. Per creare lo schema e caricare i dati (sempre come utente informix) eseguiamo il comando:
amusarra-mobile:~ informix$ dbaccessdemo
Per verificare che schema e dati siano stati creati correttamente eseguiremo una connessione al data base stores_demo ed una query di selezione sulla tabella Customer, procediamo eseguendo il comando: amusarra-mobile:~ informix$ echo "SELECT * FROM CUSTOMER;" | dbaccess stores_demo -
in output il comando restituirà i record della tabella Customer del data base stores_demo (vedi Listato 7).
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Listato 7 Output della query sulla tabella Customer
Database selected. …. customer_num 128 fname Frank lname Lessor company Phoenix University address1 Athletic Department address2 1817 N. Thomas Road city Phoenix state AZ zipcode 85008 phone 602-533-1817 28 row(s) retrieved. Database closed.
Adesso che abbiamo l’istanza Informix on-line e il data base stores_demo, il prossimo step consiste nell’installazione del modulo Informix per PHP 5.3, in questo modo saremo in grado di poter accedere a Informix utilizzando il linguaggio di scripting più diffuso al mondo.
1.6 PHP & Informix E’ cosa molto comune sentir parlare della coppia PHP e MySQL o PHP e
PostgreSQL al contrario della coppia PHP e Informix quasi sconosciuta, assai rara nelle medie e piccole realtà, forse sarà la natura commerciale e l’ambito di utilizzo di Informix a rendere la coppia meno nota.
Dalla versione 5.2 di PHP il modulo Informix non è più disponibile perché abbandonato in favore del modulo PDO Informix. Nel resto dell’articolo vedremo come compilare il “vecchio” modulo Informix per renderlo funzionate sulla versione 5.3 di PHP.
1.6.1 Compilazione del modulo Informix Il modulo Informix non è disponibile sulla versione 5.3 di PHP installata di
serie sul nostro Mac OS X, occorre quindi scaricare i sorgenti del modulo direttamente dal sito http://pecl.php.net/package/informix. L’archivio tar.gz del modulo non è disponibile, non importa, eseguiremo il checkout dei sorgenti del modulo direttamente dal repository SVN utilizzando il comando: amusarra-mobile:~ informix$ svn co http://svn.php.net/repository/pecl/informix/trunk php_ext_informix
In questo modo otterremo i sorgenti del modulo Informix dentro la directory ~/php_ext_informix. Nel Listato 8 è illustrato il risultato ottenuto dall’operazione di checkout eseguita sul repository SVN.
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Listato 8 Risultato operazione di checkout modulo Informix.
amusarra-mobile:~ informix$ svn co http://svn.php.net/repository/pecl/informix/trunk php_ext_informix A php_ext_informix/config.w32 A php_ext_informix/config.m4 A php_ext_informix/php_informix.h A php_ext_informix/Makefile.frag A php_ext_informix/ifx.dsp A php_ext_informix/ifx.ec A php_ext_informix/CREDITS A php_ext_informix/php_informix_includes.h U php_ext_informix Checked out revision 290780.
Spostiamoci dentro la directory ~/php_ext_informix e procediamo come da manuale alla compilazione del modulo.
amusarra-mobile:php_ext_informix informix$ phpize amusarra-mobile:php_ext_informix informix$ ./configure
Prima di proseguire con il make del modulo è necessario modificare il Makefile per far in modo che il modulo Informix sia linkato correttamente con libreria Informix checkapi.o, in caso contrario l'utilizzo del modulo produrrà l'errore:
undefined symbol: ifx_checkAPI.
Sul Makefile bisogna aggiungere l’indicazione della libreria checkapi.o alla direttiva INFORMIX_SHARED_LIBADD:
/opt/IBM/informix/lib/esql/checkapi.o
A questo punto procediamo con la compilazione e installazione del modulo Informix. L’utente informix deve essere tra i sudores oppure è necessario eseguire il comando d’installazione come utente root.
amusarra-mobile:php_ext_informix informix$ make amusarra-mobile:php_ext_informix informix$ sudo make install
Il modulo Informix sarà installato in /usr/lib/php/extensions/no-debug-non-zts-20090626/. Per verificare il corretto link alla libreria Informix checkapi.o basta utilizzare il comando nm in coppia con il comando grep. L’output dovrebbe restituire l’entry point ifx_chekAPI.
amusarra-mobile:php_ext_informix informix$ nm /usr/lib/php/extensions/no-debug-non-zts-20090626/informix.so | grep checkAPI
000000000000a0a0 T _ifx_checkAPI
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
1.6.2 Attivazione e test modulo Informix Per attivare il modulo appena installato, è necessario modificare (come
utente root) il file di configurazione php.ini (collocato in /etc) e aggiungere nella sezione extensions la direttiva:
extension=informix.so
E’ possibile verificare che il modulo Informix sia attivo eseguendo il comando:
amusarra-mobile:php_ext_informix informix$ php -i|grep Informix Informix support => enabled
Il comando ha risposto confermando l’attivazione del modulo Informix, è possibile comunque utilizzare l’opzione –m del comando php per verificare che il modulo sia attivo.
In questo momento il modulo Informix è operativo solo se utilizzato da PHP CLI, non è però disponibile in ambiente Apache perché quest’ultimo non vede le variabili di ambiente Informix necessarie al corretto funzionamento del modulo. Dai file di log di Apache (vedi Listato 9) è evidente come il modulo Informix non sia caricato a causa del fallimento nel caricamento delle librerie informix richieste dal modulo. La variabile DYLD_LIBRARY_PATH (che indica la posizione delle librerie Informix) deve essere visibile al processo Apache.
Listato 9 Estratto dai file di log di Apache, evidenza errore caricamento modulo Informix
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20090626/informix.so' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20090626/informix.so, 9): Library not loaded: isqls09b.dylib\n Referenced from: /usr/lib/php/extensions/no-debug-non-zts-20090626/informix.so\n Reason: image not found in Unknown on line 0
In Mac OS X dalla versione 10.4 (Tiger), Apple ha introdotto un nuovo sistema per l’avvio dei servizi base, questo sistema si chiama Launchd. Il servizio Apache è quindi governato da Launchd che per motivi di sicurezza azzera le variabili di ambiente allo stretto indispensabile, per questa ragione il modulo Informix fallisce il caricamento; le variabili di ambiente Informix non sono visibili al processo Apache. La configurazione di Launchd, o meglio del processo da gestire, avviene per mezzo di un file di tipo plist, mentre il file /etc/launchd.conf contiene delle direttive (esempio: comandi per il set di variabili di ambiente) per Launchd. Il nostro obiettivo è quindi quello di rendere visibili le variabili di ambiente Informix al servizio Apache, sul file di configurazione /etc/launchd.conf aggiungiamo le direttive illustrate nel Listato 10.
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
Listato 10 Direttive per il set delle variabili di ambiente Informix
setenv INFORMIXDIR /opt/IBM/informix setenv ONCONFIG onconfig.std setenv INFORMIXSERVER amusarra_ifx setenv INFORMIXSQLHOSTS /opt/IBM/informix/etc/sqlhosts setenv DYLD_LIBRARY_PATH /opt/IBM/informix/lib:/opt/IBM/informix/lib/esql:/opt/IBM/informix/lib:/opt/IBM/informix/lib/cli setenv CLIENT_LOCALE en_US.819
Con le direttive appena inserite, abbiamo fatto in modo che i processi controllati da Launchd siano nelle condizioni di poter accedere alle variabili di ambiente Informix.
A questo punto non resta che riavviare il servizio Apache con il solito comando apachectl (o da Preferenze di Sistema) e verificare che il modulo Informix sia correttamente caricato, è possibile fare questa verifica con un semplice script PHP che all’interno abbia l’istruzione phpinfo(), in Figura 1 l’estratto della sezione Informix.
Figura 1 Esempio di phpinfo con evidenza della configurazione modulo Informix.
In uno dei precedenti paragrafi abbiamo caricato il data base Stores_Demo sulla nostra istanza Informix, a conclusione di quest’articolo faremo un semplice
Copyright © 2009 – Antonio Musarra – http://musarra.wordpress.com
script PHP (vedi Listato 11) che mostra in forma tabellare i record presenti sulla tabella Orders.
Listato 11 Script PHP per la selezione dei record della tabella Orders
<?php $conn_id = ifx_connect ("stores_demo@amusarra_ifx", "informix", "password"); $res_id = ifx_query("select * from orders", $conn_id); if (! $res_id) { printf("Can't select orders : %s\n<br />%s<br />\n", ifx_error(),ifx_errormsg()); ifx_close($conn_id); die; } ifx_htmltbl_result($res_id, "border=\"1\""); ifx_free_result($res_id); ifx_close($conn_id); ?>
Figura 2 Risultato dello script PHP di Listato 11