Unfortunately the informix extension has been moved to PECL but has no maintainer.
http://devzone.zend.com/node/view/id/1621#Heading11
In practic terms, it has been moved but is not available in PECL yet.
It's sad. I have a big client who uses this extension for more than 6 years and now has to change a code base of 500,000 lines of code or install an old version of PHP in the new server. They recently bought a redundant, double cpu, 8 gb ram, scsi disk server and will not be happy to run old versions of software with unmaintained extensions.
LXVI. Informix Funktionen
Einführung
Der Informix-Treiber für Informix (IDS) 7.x, SE 7.x, Universal Server (IUS) 9.x und IDS 2000 ist in "ifx.ec" und "php3_ifx.h" im Verzeichnis der Informix Erweiterung implementiert. Die Unterstützung für IDS 7.x ist mit der vollen Unterstützung für TEXT- und BYTE-Felder ziemlich vollständig. Die Unterstützung von IUS 9.x ist nur teilweise fertig: die neuen Datentypen gibt es zwar, aber die Unterstützung von SLOB- und CLOB-Datentypen ist noch in Arbeit.
Anforderungen
Bemerkungen zur Konfiguration: Sie brauchen ESQL/C, um den PHP Informix-Treiber zu kompilieren. ESQL/C Versionen ab 7.2x sollten genügen. ESQL/C ist jetzt Teil des Informix Client SDK.
Versichern Sie sich, dass die Variable "INFORMIXDIR" gesetzt ist und dass Sie $INFORMIXDIR/bin in Ihren Pfad eingebunden haben, bevor Sie das "configure" Skript aufrufen.
Installation
Um die Funktionen dieses Moduls benutzen zu können, müssen Sie Ihren PHP-Interpreter mit der Option --with-informix[=DIR] kompilieren. DIR ist das Basis-Installationsverzeichnis von Informix, das in der Standardeistellung leer ist.
Laufzeit Konfiguration
Das Verhalten dieser Funktionen wird durch Einstellungen in der php.ini beeinflusst.
Anmerkung: Die Umgebungsvariablen INFORMIXDIR und INFORMIXSERVER müssen für den PHP-Treiber verfügbar sein und das INFORMIX bin-Verzeichnis muss im Pfad enthalten sein. Prüfen Sie diese Voraussetzungen mit einem Skript, das einen Aufruf von phpinfo() enthält, bevor Sie testen. Die Ausgabe von phpinfo() sollte diese Umgebungsvariablen auflisten. Dies ist sowohl für CGI PHP als auch Apache mod_php TRUE. Möglicherweise müssen Sie diese Umgebungsvariablen in Ihrem Apache Startskript setzen.
Die Informix shared libraries sollten für den Lader ebenfalls verfügbar sein (überprüfen Sie den LD_LIBRARY_PATH oder ld.so.conf/ldconfig).
Einige Anmerkungen zum Gebrauch von BLOBs (TEXT- und BYTE Felder) : BLOBs werden normalerweise durch blob-Identifikatoren adressiert. Select Abfragen geben eine "blob-ID" für alle TEXT- und BYTE-Felder zurück. Sie können die Inhalte mit "string_var = ifx_get_blob($blob_id);" auslesen, falls Sie die BLOBS in den Speicher schreiben möchten (mit "ifx_blobinfile(0);"). Wenn Sie die Inhalte von BLOB-Felder lieber in eine Datei ausgeben möchten, benutzen Sie "ifx_blobinfile(1);" und mit "ifx_get_blob($blob_id);" ermitteln Sie den Dateinamen. Mit den normalen I/O-Routinen des Dateisystems erhalten Sie die Inhalte von BLOBs.
Bei insert/update Abfragen müssen Sie diese "blob-ID's" mit der Funktion ifx_create_blob() selber erzeugen. Danach schreiben Sie die blob-ID's in ein Array und ersetzen die BLOB-Felder durch ein Fragezeichen (?) im Abfragestring. Für die Inhalte der BLOBs, die mit der Funktion ifx_update_blob() gesetzt werden, sind Sie bei updates/inserts selber verantwortlich.
Das Verhalten einer BLOB-Spalte kann auch zur Laufzeit durch Konfigurationsvariablen verändert werden.
Konfigurationsvariable: ifx.textasvarchar
Konfigurationsvariable: ifx.byteasvarchar
Laufzeitfunktionen:
ifx_textasvarchar(0): benutzt bei SELECT Abfragen von TEXT-Feldern die blob-ID
ifx_byteasvarchar(0): benutzt bei SELECT Abfragen von BYTE-Feldern die blob-ID
ifx_textasvarchar(1): gibt TEXT-Felder so zurück, als wären es VARCHAR Felder, so dass Sie keine blob-ID für select Abfragen brauchen.
ifx_byteasvarchar(1): gibt BYTE-Felder so zurück, als wären es VARCHAR Felder, so dass Sie keine blob-ID für select Abfragen brauchen.
Konfigurationsvariable: ifx.blobinfile
Laufzeitfunktionen:
ifx_blobinfile_mode(0): gibt BYTE-Felder in den Speicher zurück, mit der blob-ID können Sie auf den Inhalt zugreifen.
ifx_blobinfile_mode(1): gibt BYTE-Felder in einer Datei zurück, mit der blob-ID können Sie den Dateinamen ermitteln.
Wenn Sie ifx_text/byteasvarchar auf 1 setzen, können Sie TEXT- und BYTE-Felder in select Abfragen genauso benutzen, wie normale (allerdings sehr lange) VARCHAR-Felder. Da alle Zeichenketten in PHP "gezählt" werden, bleibt dies "binary safe". Es bleibt Ihnen überlassen, korrekt damit umzugehen. Die zurückgegebenen Daten können alles mögliche enthalten, so dass Sie für die Inhalte verantwortlich sind.
Wenn Sie ifx_blobinfile auf 1 setzen, benutzen Sie den Dateinamen, der von ifx_get_blob(..) zurückgegeben wird, um auf den Inhalt des BLOB zuzugreifen. Beachten Sie, dass Sie in diesem Fall FÜR DAS LÖSCHEN DER TEMPORÄREN DATEIEN, DIE VON INFORMIX ERSTELLT WERDEN VERANTWORTLLICH SIND, wenn sie ein Tupel auslesen. Jedes neue Tupel, das gelesen wird, erzeugt für jedes BYTE-Feld eine neue temporäre Datei.
Der Speicherort für die temporären Dateien kann mit der Umgebungsvariablen "blobdir" beeinflusst werden, die Standardeinstellung ist "." (das aktuelle Verzeichnis). Etwas Ähnliches wie : putenv(blobdir=tmpblob"); erleichtert das Bereinigen der temporären Dateien, die versehentlich stehen geblieben sind (ihre Namen beginnen alle mit "blb").
Automatisches Abschneiden von Leerzeichen bei "char" (SQLCHAR und SQLNCHAR) Daten : Dies kann mit einer Konfigurationsvariablen eingestellt werden.
ifx.charasvarchar : falls auf 1 gesetzt, werden abschliessende Leerzeichen automatisch abgeschnitten. Dies erspart den Aufruf der chop() Funktion.
NULL-Werte: Wenn die Konfigurationsvariable ifx.nullformat (und die Laufzeitfunktion ifx_nullformat()) auf TRUE gesetzt sind, werden NULL-werte in Spalten als Zeichenkette NULL zurückgegeben, wenn die Variable auf FALSE gesetzt ist, werden leere Strings für NULLwerte zurückgegeben. So können sie zwischen NULLwerten und leeren Spalten unterscheiden.
Tabelle 114. Informix Konfigurationsoptionen
| Name | Standardwert | Änderbar | Changelog |
|---|---|---|---|
| ifx.allow_persistent | "1" | PHP_INI_SYSTEM | |
| ifx.max_persistent | "-1" | PHP_INI_SYSTEM | |
| ifx.max_links | "-1" | PHP_INI_SYSTEM | |
| ifx.default_host | NULL | PHP_INI_SYSTEM | |
| ifx.default_user | NULL | PHP_INI_SYSTEM | |
| ifx.default_password | NULL | PHP_INI_SYSTEM | |
| ifx.blobinfile | "1" | PHP_INI_ALL | |
| ifx.textasvarchar | "0" | PHP_INI_ALL | |
| ifx.byteasvarchar | "0" | PHP_INI_ALL | |
| ifx.charasvarchar | "0" | PHP_INI_ALL | |
| ifx.nullformat | "0" | PHP_INI_ALL |
Weitere Details und die Definitionen der PHP_INI_*-Konstanten finden Sie im Anhang G, php.ini Einstellungen.
Hier eine kurze Erklärung der Konfigurationsoptionen:
- ifx.allow_persistent boolean
Bestimmt, ob persistente Verbindungen zugelassen sind.
- ifx.max_persistent integer
Gibt die maximale Anzahl persistenter Verbindungen pro Prozess an.
- ifx.max_links integer
Gibt die maximale Anzahl der Verbindungen zum Informix Server pro Prozess an, einschliesslich der persistenten Verbindungen.
- ifx.default_host string
Der Standardhost, zu dem verbunden wird, wenn kein Host in ifx_connect() oder ifx_pconnect() angegeben wurde. Diese Einstellung kann im Safe Mode nicht verwendet werden.
- ifx.default_user string
Der Standardbenutzer, wenn kein Benutzer in ifx_connect() oder ifx_pconnect() angegeben wurde. Diese Einstellung kann im Safe Mode nicht verwendet werden.
- ifx.default_password string
Das Standardpasswort, wenn kein Passwort in ifx_connect() oder ifx_pconnect() angegeben wurde. Diese Einstellung kann im Safe Mode nicht verwendet werden.
- ifx.blobinfile boolean
TRUE, falls blob-Spalten in eine Datei ausgegeben werden sollen, FALSE, falls blob-Spalten in den Speicher ausgegeben werden sollen. Sie können diese Einstellung mit der Funktion ifx_blobinfile_mode() zur Laufzeit ändern.
- ifx.textasvarchar boolean
TRUE, falls text-Spalten in select Abfragen als normale Strings zurückgegeben werden sollen. FALSE, falls Sie blob-ID Parameter benutzen wolen. Sie können diese Einstellung mit der Funktion ifx_textasvarchar() zur Laufzeit ändern.
- ifx.byteasvarchar boolean
TRUE, falls BYTE-Spalten in select Abfragen als normale Strings zurückgegeben werden sollen. FALSE, falls Sie blob-ID Parameter benutzen wolen. Sie können diese Einstellung mit der Funktion ifx_textasvarchar() zur Laufzeit ändern.
- ifx.charasvarchar boolean
TRUE, falls Sie abschliesende Leerzeichen von CHAR Spalten beim Auslesen abschneiden wollen.
- ifx.nullformat boolean
TRUE, falls der Spaltenwert NULL als Literal "NULL" zurückgegeben werden soll. FALSE, falls für Nullwerte als leere Strigs "" zurückgegeben werden sollen. Sie können diese Einstellung mit der Funktion ifx_nullformat() zur Laufzeit ändern.
Resource Typen
Vordefinierte Konstanten
Diese Erweiterung definiert keine Konstanten.
Inhaltsverzeichnis
- ifx_affected_rows — Gibt die Anzahl der Datensätze zurück, die von einer Abfrage betroffen sind
- ifx_blobinfile_mode — Setzt den Standardmodus für BLOBs bei allen SELECT Abfragen
- ifx_byteasvarchar — Setzt den Standard Byte-Modus
- ifx_close — Schliesst eine Informix Verbindung
- ifx_connect — Öffnet eine Verbindung zu einem Informix Server
- ifx_copy_blob — Dupliziert ein gegebenes BLOB (Binary Large Object)
- ifx_create_blob — Erzeugt ein BLOB (Binary Large Object)
- ifx_create_char — Erzeugt ein Zeichen-Objekt
- ifx_do — Führt eine vorbereitete Abfrage aus
- ifx_error — Gibt den Fehlercode des letzten Informix Aufrufs zurück
- ifx_errormsg — Gibt die Fehlermeldung des zuletzt aufgetretenen Informix Fehlers zurück
- ifx_fetch_row — Holt eine Zeile als assoziatives Array
- ifx_fieldproperties — Gibt eine Liste mit den Feldeigenschaften zurück
- ifx_fieldtypes — Gibt eine Liste der Informix SQL Felder zurück
- ifx_free_blob — Löscht ein Blob Objekt
- ifx_free_char — Löscht ein CHAR Objekt
- ifx_free_result — Gibt den belegten Speicher einer Ergebnismenge wieder frei
- ifx_get_blob — Gibt den Inhalt eines Large Objects zurück
- ifx_get_char — Gibt den Inhalt eines Zeichen-Objekts zurück
- ifx_getsqlca — Gibt den Inhalt von sqlca.sqlerrd[0..5] nach einer Abfrage zurück
- ifx_htmltbl_result — Gibt alle Zeilen einer Abfrage als HTML-Tabelle formatiert zurück
- ifx_nullformat — Setzt den aktuellen Rückgabewert für Nullwerte beim Lesen von Zeilen
- ifx_num_fields — Gibt die Anzahl der Spalten einer Abfrage zurück
- ifx_num_rows — Count the rows already fetched from a query
- ifx_pconnect — Öffnet eine persistente Informix Verbindung
- ifx_prepare — Bereitet eine Abfrage zur späteren Ausführung vor
- ifx_query — Schickt eine Informix Abfrage an den Server
- ifx_textasvarchar — Setzt den Standard-Textmodus
- ifx_update_blob — Aktualisiert den Inhalt eines Blob-Objekts
- ifx_update_char — Aktualisiert den Inhalt eines Char-Objekts
- ifxus_close_slob — Löscht ein Slob-Objekt
- ifxus_create_slob — Erzeugt ein Slob-Objekt und öffnet es
- ifxus_free_slob — Löscht ein Slob-Objekt
- ifxus_open_slob — Öffnet ein Slob-Objekt
- ifxus_read_slob — Liest nbytes aus einem Slob-Objekt
- ifxus_seek_slob — Setzt die aktuelle Dateizeiger- oder Suchposition
- ifxus_tell_slob — Gibt die aktuelle Dateizeiger- oder Suchposition zurück
- ifxus_write_slob — Schreibt einen String in ein Slob-Objekt
One very frustrating experience with interfacing
Informix and unixODBC (on RHEL4 - PHP 5.20)
was the constant Informix error:
[SQLSTATE=IX 001 SQLCODE=-1829]
Unable to load locale categories
& the non existant handles from unixODBC calls.
This is an issue of the environment being set correctly
which I thought was - phpinfo() reported that the apache
environment was correct <_server=> I even went as far as
to Put/Setenv in httpd.conf.
The hint is in the php 'environment' block
- it did not contain the env strings.
The fix was to insert the environment strings in the httpd
start-up script (/etc/init.d/httpd) which pushed the
environment correctly when the server starts up.
Hope to save someone else the hours....
Installation on RedHat Fedore Core (or in that matter any Linux OS which has a version of glibc of 2.3.* ~or above~) will need to have the latest Informix CSDK (downloadable from IBM). 2.90.UC1.LINUX at the time of this post.
http://www-306.ibm.com/software/data/informix/tools/connect/
I was unable to make PHP with v2.80 of the csdk (as it complained about mktemp being dangerous and how ctype was undefined. After downloading csdk 2.90, I was able to make PHP with no problems at all. (--with-informix).
There goes 2 days of my life!
Feel free to drop me an email at ian_at_devtonic_dot_com if you have any questions.
I just wrote a mini-HOWTO about adding Informix support to mod_php running on a Gentoo Linux server (x86). I wanted to post it here but it was too long. You can find it on http://forums.gentoo.org/viewtopic.php?t=245249 (just in case for some reason they change the thread number, the title is "HOWTO: PHP Informix client support").
add the following to /etc/profile (right before unset i (adjust to your needs)
export INFORMIXDIR=/opt/informix
export ODBCINI=/usr/local/etc/odbc.ini
export INFORMIXSERVER=m_srv
then add the following to your httpd.conf
PassEnv INFORMIXDIR
PassEnv ODBCINI
PassEnv INFORMIXSERVER
(or you can use SetEnv SetEnv INFORMIXDIR /opt/informix etc.)
I upgraded to csdk-2.70.UC3-1 and got the following error when trying to start apache:
Syntax error on line 205 of /usr/local/apache/conf/httpd.conf:
Cannot load /usr/local/apache/libexec/libphp4.so into server: /opt/informix/lib/esql/libifgen.so: undefined symbol: stat
/usr/local/apache/bin/apachectl start: httpd could not be started
This machine has glibc 2.3.5
The following fixed the problem for me (surely there's a better fix) but i'm not sure how it might affect other programs linked to libifgen
mkdir /tmp/ifx
cd /tmp/ifx
ar x $INFORMIXDIR/lib/esql/libifgen.a
gcc -shared -o libifgen.so *.o
cp libifgen.so $INFORMIXDIR/lib/esql
I have compile php-4.0.6 with informix support (dynamic) and when I try to
start apache, it gives me this error message:
Syntax error on line 246 of /etc/httpd/httpd.conf:
Cannot load /usr/lib/apache/libphp4.so into server: /home/informix7/lib/esql/lib
ifgen.so: undefined symbol: stat
/usr/sbin/apachectl start: httpd could not be started
If you are tring to access an Informix Online 5.x server over the
network (ie from a webserver) using PHP, be aware that Online
doesn't support network communications as standard unlike later versions.
You need the Informix product 'I-Star' on your Online server.
This will allow your webserver with the informix client SDK
installed to communicate natively (ESQL).
Thanks go to Mario @ PRS for this info.
An intermittent SQL error -25580 is caused by using the wrong glibc version in Linux.
I have this working correctly in Linux (x86) with Informix Client SDK for 2.70UC-1 for Linux, with glibc 2.1.3.
Originally I had glibc 2.1.1 (Red Hat 6), which gave the intermittent error, but upgrading glibc fixed it.
The Informix Client SDKs can be downloaded from www.informix.com (you need to own an Informix database to log on), and glibc is at ftp://ftp.gnu.org/gnu/glibc .
There's also a FreeBSD version of the client libraries that'll work with PHP. It's not available for download from their website, but you can request a copy (cd or electronic delivery) by calling Informix Customer Support at 1-800-274-8184 option 3.
Some customer service reps know more about alternative operating systems than others, so you may have to do a bit of educating before they can locate the product in their database, but it's definitely there.
My e-mail confirmation referred to it as "Orderable Part Number 100-15871-204057-1", although that number may be specific to the electronically-delivered edition.
Verify with phpinfo() that you have informix module compiled in php.
Also verify that env vars INFORMIXDIR, INFORMIXSERVER, LD_LIBRARY_PATH are set, and that PATH have a route to your informix subdir.
