PHP e Informix: un connubio possibile

Dopo aver passato gli ultimi 4 giorni cercando di configurare una connessione ad un database Informix tramite uno script PHP e dopo aver raccolto qualche insuccesso, sono finalmente riuscito a venirne a capo, quindi ho deciso di scrivere questo articolo per condividere quanto ho appreso da questa esperienza.

Configurazione iniziale

La procedura che vado a descrivere è stata testata su un pc con installato:

  • Windows XP SP2
  • Apache 2.2
  • PHP 5.2.8
  • Informix Client SDK 3.30

La procedura

Dopo aver installato l’Informix Client SDK, è necessaria una adeguata configurazione utilizzando il tool Setnet32:

Nel primo tab, cercare le variabili INFORMIXDIR e INFORMIXSERVER. Nella prima deve essere impostato il percorso di installazione del client di Informix, nella seconda deve essere impostato il nome del server informix.

Nel secondo tab, bisogna definire i parametri di accesso al server:

Informix Server – Informix database server/ nome dell’instanza
HostName – il nome dell’host della macchina su cui risiede il database server
Protocolname – il protocollo di comunicazione
Service Name – il nome del servizio, come definito nel file “services” che corrisponde al nome della porta in ascolto
Options – è usato per definire i gruppi

Dopo che sono state inserite le informazioni, cliccare su “Make Default Server”. Cliccare su “Applica” per confermare le impostazioni.

Nel terzo tab, dovrebbe già essere settato il nome dell’host, non sono necessarie altri parametri.

Ora è necessario creare le seguenti variabili di sistema (tasto dx su Risorse del computer => Proprietà => Avanzate => Variabili d’ambiente):

  • INFORMIXDIR => cartella di installazione di Informix, ad es. “C:\Programmi\informix”
  • INFORMIXSERVER => nome del server informix, ad es. “informix1”

I valori di queste due variabili devono corrispondere a quelli settati precedentemente con Setnet32.

Nella PATH di sistema deve essere presente il percorso della cartella “bin” dentro la cartella di installazione del client (ad esempio C:\Programmi\informix\bin)

Se non sono già presenti, aggiungere le info necessarie dentro il file “C:\WINDOWS\system32\drivers\etc\hosts”, il nome deve corrispondere al valore del campo “HostName”:
172.16.1.10  host1

Aggiungere le info necessarie dentro il file “C:\WINDOWS\system32\drivers\etc\services”, il nome deve corrispondere al valore del campo “Service Name”:
informix  1584/tcp

Aprire e modificare i file allegati HKEY_USERS.reg e HKEY_LOCAL_MACHINE.reg: settare le direttive INFORMIXDIR e INFORMIXSERVER con gli stessi valori impostati precedentemente, dopodichè eseguire gli script per apportare le modifiche al registro di sistema (prima di eseguire gli script è consigliabile eseguire un backup del registro).

Riavviare la macchina.

Configurazione di PHP

Nel file php.ini inserire la seguente riga:

extension=php_ifx.dll

nella cartella delle estensioni (ad esempio C:\PHP\ext) deve essere presente il file php_ifx.dll
Questo file è reperibile nel repository di PECL
Per Windows ci sono due tipi della DLL: thread safe e non thread safe. Questo valore deve combaciare con il tipo di PHP installato. Per sapere quale dei due è necessario, dalla pagina di phpinfo cercare il valore “Thread Safety”.

Riavviare Apache.

Consultare nuovamente la pagina di phpinfo e controllare se l’estensione è stata caricata (deve essere presente un paragrafo intitolato “informix”).
In caso contrario, controllare il file di errori di PHP (per sapere dov’è, cercare la direttiva “error_log” dentro il file php.ini).

Uno degli errori più probabile è il seguente:

PHP Startup: Unable to load dynamic library 'C:\PHP\ext\php_ifx.dll'

che è molto generico.
Dal prompt dei comandi digitare:

php -m

verrà mostrata una lista dei moduli caricati. Controllare di nuovo il file di errori di PHP per vedere se ha scritto qualche altra informazione.
Se è stata copiata la DLL con una diversa gestione dei thread rispetto al PHP verrà scritto un errore di questo genere:

PHP Warning:  PHP Startup: informix: Unable to initialize module
Module compiled with module API=20060613, debug=0, thread-safety=1
PHP    compiled with module API=20060613, debug=0, thread-safety=0
These options need to match

Test del funzionamento

Se fino a questo punto è andato tutto bene, possiamo testare il funzionamento con un semplice script:

$db_name = "databasename@informix1";
$db_user = "my_username";
$db_pass = "my_password";

$conn_id = ifx_connect($db_name, $db_user, $db_pass);
if (!$conn_id)
{
  printf("Error : %s\n<br />%s<br />\n", ifx_error(), ifx_errormsg());
  die;
}

$res_id = ifx_query("SELECT * FROM SYSTABLES", $conn_id);
if (!$res_id)
{
  printf("Error : %s\n<br />%s<br />\n", ifx_error(), ifx_errormsg());
  die;
}
ifx_htmltbl_result($res_id, "border=\"1\"");
ifx_free_result($res_id);

Conclusioni

Come ho cercato di mostrare, la procedura per far funzionare tutto quanto non è proprio semplice e lineare, e presenta un alto margine di errore.
Per quanto mi è noto, con l’ultima release dell’Informix CSDK, si dovrebbe aggiornare automaticamente la configurazione del registro di sistema, ciò significa poter saltare lo step di modifica manuale del registro.

6 thoughts to “PHP e Informix: un connubio possibile”

  1. Ciao, ho seguito passo passo ma l’unica php_ifx.dll che ho trovato è per php4 che richiede php4ts.dll. Posso sapere dove hai trovato php_ifx.dll? Grazie

  2. Ciao, riprendo questo bell’articolo perchè ora devo configurare una connessione ad una database informix ma da un server web linux (Ubuntu).
    Hai qualche dritta da darmi per procedere con la connessione da questo tipo di server?
    Grazie

Rispondi a Antonio Musarra Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.