PHP 4.1 et Sybase Adaptive Server Enterprise 12.5 sous Windows

Introduction

La présente documentation a pour objectif de décrire la communication entre Sybase ASE 12.5 et PHP version 4.1.0 sous Windows pour des développements en local grâce à l'extension php_sybase_ct.dll (PHP/ Sybase Open Client CT-LIB).

Dans un premier temps, les raisons de la montée de version de la machine PHP sont indiquées et les manipulations à réaliser dans le fichier php.ini pour la communication avec Sybase 12.5 (Open Client CT-LIB) sont décrites en détail.

Montées de version de la machine PHP (4.0.4 à 4.1.0)

Problème avec la version 4.0.4

Sous Windows, l'appel des fonctions sybase_connect() et sybase_pconnect(), fonctions php disponibles grâce à l'extension php_sybase_ct.dll, engendrent un GPF (crash) avec la version 4.0.4 de PHP.

Montée de version de la machine PHP (4.0.4 => 4.0.6)

Des tests d'appel des méthodes sybase_connect et sybase_pconnect ont été réalisés avec la version 4.0.6 de la machine PHP et effectivement les problèmes sont résolus comme l'indique le site www.php.net. Toutefois il ne s'agit pas de cette version de machine qui a été retenue (voir prochain paragraphe)

Montée de version de la machine PHP (4.0.6 => 4.1.0)

La version 4.1.0 de PHP indique des performances accrues sous Windows. Ce qui est effectivement le cas. Les tests avec les méthodes sybase_connect et sybase_pconnect ont été par ailleurs réalisés avec succès sur cette version.

La version 4.1.0 de PHP est actuellement retenue pour les développements PHP avec Sybase 12.5.

Paramétrage de PHP pour interroger un serveur Sybase ASE 12.5

Pour utiliser l'extension Sybase disponible avec PHP, le fichier php.ini doit être retouché en vue d'implémenter cette extension. Les manipulations à effectuer dans ce fichier sont décrites dans les paragraphes qui suivent.

L'extension Sybase CT-LIB de PHP sous Windows : php_sybase_ct.dll

L'extension Sybase pour PHP sous Windows est disponible avec la bibliothèque php_sybase_ct.dll. Cette dernière extension est située dans le répertoire %INSTALL_PHP%\extensions. php_sybase_ct.dll utilise la couche Open Client CT-LIB de Sybase Adaptive Server Enterprise.

Il existe également l'extension php_sybase.dll, mais celle-ci communique avec la couche DB-LIB de Sybase ASE, couche en cours de décommissionnement.

Si ce n'est pas encore le cas, indiquer dans le fichier php.ini la localisation des extensions PHP dans le système de fichiers. Cette information est renseignées avec la directive extension_dir du paragraphe [Paths and Directories] du fichier php.ini.

Exemple :

%INSTALL_PHP%\php.ini
[Paths and Directories]
...
; Directory in which the loadable extensions (modules) reside.
extension_dir = "C:\Php\extensions"

Dans une seconde étape, indiquer dans le fichier php.ini que l'utilisation de la bibliothèque Sybase CT-LIB php_sybase_ct.dll est autorisée. Pour activer cette extension, décommenter la ligne php_sybase_ct.dll dans la rubrique [Extensions] du fichier php.ini

%INSTALL_PHP%\php.ini
[Extensions]
...
php_sybase_ct.dll
...

Variable d'environnement PATH et %SYBASE%\%SYBASE_OCS%

L'extension php_sybase_ct.dll communique avec les librairies Sybase Open Client Sybase 12.5, parmi les plus importantes :

  • libcs.dll
  • libct.dll
  • libblk.dll

Ces librairies sont dans le répertoire %SYBASE%\OCS-12_5\dll, %SYBASE% étant le répertoire d'installation du client ou du serveur Sybase Adaptive Server Enterprise 12.5.

Pour assurer une bonne communication entre l'extension php_sybase_ct.dll et les librairies Open Client ASE 12.5, vérifier que la variable d'environnement PATH Windows contient bien le répertoire %SYBASE%\OCS-12_5\dll. Si le répertoire d'installation %SYBASE% est C:\Sybase :

DOS> echo %PATH%
C:\Sybase\OCS-12_5\dll;%PATH%

Fichier Interfaces ou sql.ini de Sybase

La fonction PHP sybase_connect prend en premier argument le nom logique du serveur ASE :

<?php sybase_connect("DBA_T1_ASE",user,password); ?>

Les machines et ports correspondant aux noms logiques des serveurs ASE sont référencés dans le fichier $SYBASE/interfaces sous Unix et %SYBASE%\ini\sql.ini sous Windows :

%SYBASE%\ini\sql.ini
[DBA_T1_ASE]
master=NLWNSCK,N-000505-PAR,30000 
query=NLWNSCK,N-000505-PAR,30000 

Vérifier que le fichier sql.ini est présent et à jour dans le répertoire %SYBASE%\ini

Il existe effectivement une directive sybase.interface_file dans le fichier php.ini pour indiquer le chemin d'accès au fichier interfaces ou sql.ini, mais cette directive concerne uniquement l'extension php_sybase.dll qui utilise la couche DB-LIB prochainement obsolète. Cette directive est sans effet avec l'extension php_sybase_ct.dll.

%INSTALL_PHP%\php.ini
[Sybase]
; Extension sybase utilisant DB-LIB, prochainement décommissionné
 ...
sybase.interface_file = "C:\Sybase\ini\sql.ini"

Paramétrages annexes (sévérité)

Un serveur Sybase ASE peut renvoyer un numéro de message ou d'erreur.

Les seuils de ces valeurs à partir desquels PHP doit lever des alertes sont définis dans les directives sybct.min_server_severity et sybct.min_client_severity du paragraphe [Sybase-CT] dans le fichier php.ini :

%INSTALL_PHP%\php.ini
[Sybase-CT]
 ...
; Minimum server message severity to display.
sybct.min_server_severity = 10

; Minimum client message severity to display.
sybct.min_client_severity = 10

Par défaut, ces directives sont fixées à 10, aussi lorsque la directive display_errors est à on, le simple message informatif "Changed database context to <dbname>" (sévérité 10) est levé comme une alerte par PHP :

Warning: sybase_connect() [function.sybase-connect.html]: Sybase: Server message: Changed database context to 'SYB_STATS'. (severity 10, procedure N/A) in D:\intranet\sqlpac\sybconnect.php5 on line 5

La sévérité niveau 10 est un peu basse pour ces directives car tous les messages informatifs seront traités comme des alertes par PHP. Le seuil le plus adéquat est une sévérité fixée à 11, voire 16.

[Sybase-CT]
 ...
; Minimum server message severity to display.
sybct.min_server_severity = 11

; Minimum client message severity to display.
sybct.min_client_severity = 11

Les sévérités 10 à 16 sont des erreurs qui peuvent être fixées côté utilisateur :

  • Severity Level 10 : Information de statut
  • Severity Level 11 : Objet base de données non trouvé
  • Severity Level 12 : Type de données inadéquat
  • Severity Level 13 : Erreur utilisateur dans la syntaxe d'une transaction
  • Severity Level 14 : Permission refusée pour exécuter une commande
  • Severity Level 15 : Erreur de syntaxe dans une commande SQL
  • Severity Level 16 : Erreurs utilisateurs diverses

Les sévérités 17 à 26 sont des erreurs systèmes (ressources insuffisantes, problèmes hardware, tables corrompues...).

Un simple programme PHP 4.1 interrogeant une base Sybase 12.5

$objRessource = sybase_connect("DBA_T1_ASE","inv_maj","****");

$_select_db = sybase_select_db("SYB_STATS",$objRessource);

$result = sybase_query("select id,name from sysobjects where type='U'",$objRessource);

while($row = sybase_fetch_row($result)) {
      print $row[0].";". $row[1]."<br>";
}
    
echo sybase_num_rows($result)." lignes<br>";
  
sybase_free_result($result);
  
sybase_close($objRessource);
1040722760;INV_APPLICATIONS_20080619
461244698;GDHQPlans
4195065;INV_HAPPS
 ...
75 lignes

1. Ouverture de la connexion avec la fonction sybase_connect(servername, username, password) :
$objRessource = sybase_connect("DBA_T1_ASE","inv_maj","******");
Un objet ressource $objRessource est obtenu en retour de la fonction sybase_connect
2. La base utilisateur SYB_STATS est sélectionnée avec la fonction sybase_select_db(dbname,<objet ressource>) :
$_select_db = sybase_select_db("SYB_STATS",$objRessource);
3. La requête "select id,name from sysobjects where type='U'" est envoyée au serveur ASE avec la fonction sybase_query(query,<objet ressource>) :
$result = sybase_query("select id,name from sysobjects where type='U'",$objRessource);
Un objet résulat $result de type curseur est obtenu en retour de la fonction sybase_query
4. Les lignes sont extraites de l'objet result avec la fonction sybase_fetch_row(<objet resultat>) :
while($row = sybase_fetch_row($result)) {
    print $row[0].";". $row[1]."<br>";
}
5. Le nombre de lignes est affiché avec la fonction sybase_num_rows(<objet resultat>) :
echo sybase_num_rows($result);
6. L'objet résultat $result est libéré avec la fonction sybase_free_result(<objet resultat>) :
sybase_free_result($result);
7. La connexion est fermée avec la fonction sybase_close(<objet ressource>) :
sybase_close($objRessource);