Installer informix client

Un article de Wiki SOS-ADMIN.

Guide proposé par Stéphane Primault 9 mar 2007 à 18:15 (CET)

Sommaire

Introduction

Pour la société dont je suis employé actuellement, il me faut interroger des bases de données sous informix, depuis des scripts php.
Je vous propose une methode pour l'installation du client informix pour permettre des connexions externe en utilisant php.
Cette installation repose en grande partie sur ce tutoz :http://forums.gentoo.org/viewtopic.php?t=245249
Cette méthode doit pouvoir s'adapter pour d'autre distribution.

Télècharger le client

Vous trouverez les clients informix sur le site d'ibm (CSDK).
http://www14.software.ibm.com/webapp/download/search.jsp?rs=ifxdl
Sélectionner la version pour votre machine. Attention tou de même certain CSDK utilise rpm pour l'installation.
Pour ma part, j'ai utilisé : Informix Client SDK V2.81.UC3 32 bit for Linux on Intel
Vous le trouverez :
http://www14.software.ibm.com/webapp/download/search.jsp?q=&cat=&pf=&k=ALL&pn=&pid=&rs=ifxdl&S_TACT=104CBW71&status=Active&S_CMP=&b=&sb=rd&sr=11&fpf=Linux&fdt=

Installer le client

Création group et user

groupadd informix ; useradd -g informix -d /dev/null informix

Création répertoire

mkdir /opt/informix

Copie du client dans le répertoire créé

Copier le client que vous avez télécharger sur le site d'ibm, dans le répertoire nouvellement créé

Rajouter cpio sur votre système

Cpio vas servir à décompresser et installer les différentes lib nécessaire.

emerge cpio

Création variables d'environement

Des variables d'environnements sont nécessaire pour l'installation du client et la compilation du client pour php.

vi /etc/env.d/99informix

Copié les ligne ci-dessous dans le fichier, en modifiant les paramétres si nécessaire.

INFORMIXDIR=/opt/informix
PATH=/opt/informix/bin
ODBCINI=/opt/informix/etc/odbc.ini
INFORMIXSERVER=nom_du_serveur_pour_la_connexion
LDPATH=/opt/informix/lib:/opt/informix/lib/esql:/opt/informix/lib/cli:/opt/informix/lib/client

INFORMIXSERVER contient le nom du serveur pour la connexion, qui n'a rien à voir avec le nom propre de la machine.
Exemple :
Nom du serveur informix : donnee_net
Nom du serveur hébergeant le serveur de données : ns.xxxx.xxxxxxx

Ce nom se trouve dans le fichier sqlhosts de l'installation sur le serveur informix (en générale serveur_net) pour une connexion via tcp.

Ensuite mettre les variables d'environnement à jour.

env-update

Décompresser le client

cd /opt/informix
cpio -idumB < csdk.cpi

Cela vas décompresser les différents fichiers et scripts pour l'installation.

Installer le client

Avec votre éditeur préféré, editer les fichiers :

  1. installclientsdk
  2. install_gls
  3. install_msg

Rechercher dans ces fichiers cpio -idumB et enlever le c ce trouvant dans les options.
Cela est nécessaire, car autrement cpio plante lors de la décompression des fichiers.
Une fois les modifications effectuées, lançais la commande d'installation.

cd /opt/informix/
sh installclientsdk -o

ou

cd /opt/informix/
./installclientsdk -o

les options pour l'installation du client sont :

  1. -i : Pour installer ClientSDK avec un serveur de bases de données informix version 9.x
  2. -o : Pour installer ClientSDK avec un serveur de bases de données informix qui n'est pas une version 9.x
  3. -f : Pour forcer l'installation

Si pendant l'installation vous rencontrez une erreur du programme cpio, vérifier bien dans les différents scripts que vous n'avez pas oublié de supprimer le c des options.
Corriger le problème est relancé l'installation.

Configurer les fichiers

De nouveau avec votre éditeur préféré, édité le fichier slqhosts.

cd /opt/informix/etc/
vi sqlhosts

Vous avez un fichier ressemblant à ceci :

# ************************************************************************
#
#                                 IBM INC.
#
#                             PROPRIETARY DATA
#
#    Licensed Material - Property Of IBM
#
#    "Restricted Materials of IBM"
#
#    IBM Informix Client SDK
#
#    (c)  Copyright IBM Corporation 2002. All rights reserved.
#
#   Title:      sqlhosts.demo
#   Description:
#               Default sqlhosts file for running demos.
#
#**************************************************************************

demo_on      onipcshm        on_hostname     on_servername
demo_se      seipcpip        se_hostname     sqlexec

Les différents paramètres sont :

  1. DataBase Server Name : le nom du serveur
  2. Protocol : Type de connexion à utiliser. La valeur est composée de 8 lettres.
    1. Les deux premières correspondent au produit (« se » pour Informix Standard Engine (SE) 7.x, « ol » pour Informix Dynamic Server (son ancien nom était Informix OnLine)
    2. Les trois suivantes à l’interface (« ipc » pour la communication inter-processus, « soc » pour Sockets)
    3. Les trois dernières au protocole réseau (« spx » pour IPX/SPX, « tcp » pour TCP/IP). Sous Windows, on choisira le plus souvent olsoctcp
  3. Host : Le nom ou l’adresse IP de la machine hébergeant le serveur. Vous devez vous assurer que le nom de la machine peut être résolu en adresse IP, grâce au fichier hosts ou à un serveur WINS ou DNS.
  4. Service : Correspond au nom du service, tel que défini dans le fichier services de la machine hébergeant le serveur. Le fichier services du client doit aussi contenir la référence.

Pris sur : http://www.supinfo-projects.com/fr/2004/dynamic_server_94_fr/1/
Pour les paramétres, regardez sur le serveur de données ce qui est noté dans le fichier sqlhosts pour une connexion tcp/ip.
En régle générale, vous devriez trouver deux type de connexion dans ce fichier, un connexion sur socket et une connexion tcp/ip.
Rechercher sur le serveur de données le port de connexion ce trouvant dans le fichiers services :

less /etc/services

le port se trouve en face de sqlexec.
Par exemple :

sqlexec 1525/tcp  # Informix connect

Une fois trouvé le numéro du port utilisé et le nom du service, sur la machine cliente, edité le fichier services et recopié les lignes dans celui-çi (pensez à vérifier que ce port ne soit pas déjà utiliser par un autre service.
Il se peut que le nom du service ne soit pas sqlexec. Dans ce cas adapter en fonction de votre configuration.

Compiler PHP

Maitenant il ne vous reste plus qu'à compiler PHP.

USE="informix iodbc" emerge -av php

Pour ma part sur le servuer de ma société, j'utilise plutôt :

USE="informix iodbc" emerge -av "dev-lang/php-5*"

Car je me sers aussi bien de php4 que php5 en fonction de certaines applis interne.

APACHE httpd.conf

Rajouter dans httpd.conf les lignes suivante :

SetEnv INFORMIXDIR /opt/informix
SetEnv ODBCINI /opt/informix/etc/odbc.ini
SetEnv INFORMIXSQLHOSTS /opt/informix/etc/sqlhosts
SetEnv INFORMIXSERVER nom_du_serveur_pour_la_connexion

Ensuite redemarer apache pour prendre en compte les modifications

/etc/init.d/apache2 restart

Faite une page de test avec phpinfo() pour vérifier que vous voyez bien les variables d'environnment. Extrait phpinfo()

INFORMIXDIR 	/opt/informix
INFORMIXSERVER 	nom_du_serveur_pour_la_connexion
INFORMIXSQLHOSTS /opt/informix/etc/sqlhosts
ODBCINI 	/opt/informix/etc/odbc.ini
PATH 	/bin:/usr/bin:/opt/informix/bin:/opt/informix/lib:/opt/informix/lib/esql:/opt/informix/lib/cli:/opt/informix/lib/client

SUPHP

Si vous utilisez SUPHP, il vous faut rahouter dans le fichier de configuration le PATH pour informix :

vi /etc/suphp.conf

Rechercher et modifier la ligne env_path

;PATH environment variable
env_path=/bin:/usr/bin:/opt/informix/bin:/opt/informix/lib:/opt/informix/lib/esql:/opt/informix/lib/cli:/opt/informix/lib/client

Pour finir relancer apache pour la prise en compte des modifications.

Pour finir

Vous pouvez utiliser ce petit script pour tester :

<?php
$conn_id = ifx_connect ("basededonnees@nomduserveur", "login", "pwd");
if (!$conn_id){
  echo "Connexion impossible => ".ifx_error()."<br />".ifx_errormsg();
}else{
  echo "Connexion réussi</br />";
  $sql="SELECT  * FROM votretable";
  ifx_textasvarchar(1);
  ifx_byteasvarchar(1);
  $rid = ifx_prepare ($sql, $conn_id, IFX_SCROLL);
  //echo $rid.'<br />';
  if (! $rid) {
    //    ... erreur ...
    echo "Probleme requête => ".ifx_error()."<br />".ifx_errormsg();
  }
  $rowcount = ifx_affected_rows($rid);
  if ($rowcount > 1000) {
     printf ("Trop de lignes dans le résultat : (%d)\n<br />", $rowcount);
     die ("Recommencez votre requête <br />\n");
  }
  if (!ifx_do($rid)) {
  //  ... erreur ...
    echo "Probleme exécution requête => ".ifx_error()."<br />".ifx_errormsg();
  }
  ifx_htmltbl_result($rid, 'border="2"');
  ifx_free_result($rid);
}
@ifx_close($conn);
?> 

Bonne utilisation...