Einige Kunden haben immer wieder den Wunsch an IBM herangetragen, PHP unter OS/400 zu benutzen. Die alternative Möglichkeit, eine Linux-Partition auf der iSeries einzurichten und mittels virtuellem OptiConnect oder virtuellem LAN mit der OS/400-Partition zu kommunizieren, auf der die eigentliche Datenbank residiert, erschien vielen dieser Kunden als umständlich. Daher, und auch um die mächtigen Möglichkeiten des Portable Application Solutions Environment zu demonstrieren, entschloss IBM sich, einen Patch für PHP zu schreiben, der die eingebaute Unterstützung von PHP für eine AIX DB2 auf eine OS/400 DB2 abändert.
Der vorliegende Artikel, der eine überarbeitete Übersetzung des IBM RedPapers 3639 Bring PHP to your eServer iSeries Server darstellt, beschäftigt sich mit der Installation und Konfiguration dieser abgeänderten Version von PHP.
Voraussetzungen
Dieser Artikel setzt voraus, dass Sie folgende Hardware und Software auf Ihrem iSeries-Server installiert haben:
- 5722SS1: OS/400 V5R2 (diese Vorgehensweise sollte auch unter V5R1 funktionieren)
- 5722-SS1 Option 13: OS/400 System Openness Includes
- 5722-SS1 Option 33: OS/400 Portable App Solutions Environment
- 5722-DG1: IBM HTTP Server für iSeries. Dieses lizenzierte Software-Produkt beinhaltet den HTTP Server (powered by Apache), der der einzige HTTP Server ist, der PHP unterstützt. Installieren Sie bitte auch das aktuellste HTTP Server Gruppen-PTF. Für V5R2 ist dies die PTF-Nummer SF99098.
- Der Befehl make: Der make-Befehl ist in OS/400 PASE V5R2 beinhaltet. Wenn Sie OS/400 V5R1 benutzen, sollten Sie sich GNU make von folgender URL herunterladen: www.gnu.org/directory/gnu/make.html
- 5799-PTL: (Optional) PRPQ iSeries Tools for Developers: Dieses Toolkit benötigen Sie, um PHP zu übersetzen (und zur Installation der VisualAge Compiler auf der iSeries), da dieses Toolkit Perl für die iSeries beinhaltet. Perl für die iSeries wird auch unter folgender URL zum Download bereitgestellt: www.cpan.org/ports/index.html#os400
Bitte benutzen Sie die PASE-Version und beachten Sie das README (eventuell zum Übersetzen).
OS/400 und PASE
Anmerkung: Wir nehmen an, dass Sie V5R2 installiert haben. OS/400 V5R1 unterstützt einige Hardware-Konfigurationen, die von PASE nicht unterstützt werden. Sie finden eine ausführliche Liste der Hardware, die PASE unterstützt, unter folgender URL:
www-919.ibm.com/servers/eserver/iseries/developer/factory/pase/ehardware.html
Dieser Artikel setzt auch voraus, dass Sie folgende Hardware und Software auf ihrer Übersetzungs-Maschine installiert haben. Die Übersetzungs-Maschine kann entweder eine pSeries mit AIX oder eine iSeries mit OS/400 und der folgenden Software sein:
Der Befehl patch: Der
patch-Befehl ist in OS/400 PASE V5R2 beinhaltet. Wenn Sie den
patch-Befehl nicht auf Ihrem System haben, probieren Sie es mit GNU patch. Sie können Version 2.5 (nicht 2.5.4) unter folgender URL beziehen:
ftp://ftp.gnu.org/pub/gnu/patch
Um die Quellen zu übersetzen, befolgen Sie bitte folgende Schritte:
- Entpacken Sie die Quellen mit dem tar-Befehl.
- Wechseln Sie in das soeben erstellte Verzeichnis.
- Geben Sie ./configure ein.
- Geben Sie make ein.
- Geben Sie make install ein.
Der Befehl gzip:
Der
gzip-Befehl dient zum Packen und Entpacken von Dateien. Dieser Befehl ist unter folgender URL zu finden:
www.gnu.org/directory/GNU/gzip.html
Der VisualAge C++ Compiler für AIX: Informationen über diesen Compiler sind unter folgender URL zu finden:
www.ibm.com/software/ad/vacpp
Wenn Ihre Übersetzungs-Maschine AIX (nicht OS/400) ist, dann müssen Sie die Version des Compilers verwenden, die kompatibel zu der PASE-Version ist, die Sie auf Ihrer iSeries installiert haben. Weiterführende Informationen zu diesen Thema finden Sie unter der URL:
publib.boulder.ibm.com/iseries/v5r2/ic2924/info/rzalf/rzalfplanning.htm
Wir haben die beschriebene Vorgehensweise mit AIX 4.3 und höher getestet.
Alternativ unterstützt OS/400 PASE V5R2 nun auch die Installation der Softwareprodukte IBM VisualAge C++ Professional für AIX Version 6.0 oder IBM C für AIX Version 6.0.
Das bedeutet, dass OS/400 PASE-Applikationen in PASE selbst kompiliert werden können. Ein separates AIX-System ist nicht vonnöten. IBM VisualAge C++ Professional für AIX Version 6.0 (5765-F65) und IBM C für AIX Version 6.0 (5765-F57) sind separat erhältliche Lizenzprogrammprodukte. VisualAge C++ Professional beinhaltet C für AIX.
Anmerkung: Zum Zeitpunkt der Entstehung des Artikels ist eine 60-Tage-Testversion unter folgender URL erhältlich:
www14.software.ibm.com/webapp/download/search.jsp?go=y&rs=vacpp Installationsanweisungen
Befolgen Sie folgende Schritte, um die Quellen für PHP herunterzuladen und zum Kompilieren vorzubereiten:
PHP herunterladen: Laden Sie die Version von PHP herunter, die Sie für Ihre iSeries benötigen. (Anmerkung: Wir haben Patch-Dateien für die Version 4.3.0 und die ältere Version 4.2.2 von PHP vorbereitet. Diese Anleitung ist jedoch für Version 4.3.0 geschrieben. Im Anhang stehen die Unterschiede bei der Vorgehensweise beim Kompilieren der älteren Version 4.2.2.)
- Laden Sie die tar-Datei php-4.3.0.tar.gz für PHP 4.3.0 von folgender URL herunter: www.php.net.
- Bringen Sie diese Datei mittels FTP auf die Maschine, auf der Sie übersetzen. Das kann Ihre AIX-Maschine oder Ihre iSeries-Maschine mit dem VisualAge-Compiler sein. Wir nennen diese Maschine die Übersetzungs-Maschine.
- Packen Sie die Datei aus, indem Sie folgende Befehle ausführen:
gunzip php-4.3.0.tar.gz
tar -xvf php-4.3.0.tar
Patchen Sie die Quell-Dateien: Ein Patch ist vonnöten, um PHP auf der iSeries auszuführen. Wir haben Patch-Dateien für PHP 4.3.0 und die ältere 4.2.2 Version von PHP bereitgestellt. Der Patch ändert die standardmäßige PHP DB2-Datenbankunterstützung von AIX DB2 auf OS/400 DB2.
- Laden Sie die Patch-Datei herunter und sichern Sie sie auf der Übersetzungs-Maschine. Sie finden diese Datei auf der ITSO-Website unter folgender URL: www.redbooks.ibm.com.
Folgen Sie dem Link Additional materials, um zur Verzeichnis-Ansicht der zusätzlichen Materialien zu gelangen. Öffnen Sie das Verzeichnis REDP3639, in dem die Patch-Dateien php422pase.patch und php430pase.patch liegen. Speichern Sie die Patch-Datei in dem selben Verzeichnis, aus dem Sie den tar-Befehl vorhin aufgerufen haben.
- Wechseln Sie wieder in dieses Verzeichnis (cd-Befehl) und führen Sie folgenden Befehl aus:
patch -p0 < php430pase.patch

Abb. 1: Screenshot : phpinfo()
Finden Sie iSeries-spezifische Dateien: Sie müssen folgende iSeries-spezifische Dateien finden und auf die Übersetzungs-Maschine kopieren. Die Dateien
sqlcli.h und
libdb400.exp enthalten DB2 UDB für iSeries-Unterstützung. Die Datei
as400_libc.exp ist eine iSeries-spezifische Ergänzung zur AIX-Datei
libc.a. Diese Dateien sind Bestandteil von 5722-SS1 Option 13 - System Openness Includes. Führen Sie danach folgende Schritte durch, um diese Dateien von Ihrer iSeries zu erhalten:
- Führen Sie folgenden Befehl aus: CPY OBJ('/QIBM/include/sqlcli.h') TODIR('/home/yourid') TOCCSID(*STDASCII) DTAFMT(*TEXT)
- Senden Sie mit FTP die Datei /home/yourid/sqlcli.h auf die Übersetzungs-Maschine, z.B. in /home/meinname.
- Senden Sie mit FTP die Dateien libdb400.exp und as400_libc.exp aus dem iSeries-Verzeichnis /QOpenSys/QIBM/ProdData/OS400/PASE/lib auf die Übersetzungs-Maschine, z.B. in /home/meinname.
Bereiten Sie die Umgebung zum Kompilieren von PHP vor: Führen Sie folgende Schritte durch, um die Umgebung mit folgenden Dateien und Verzeichnissen vorzubereiten, um PHP auf der Übersetzungs-Maschine erfolgreich zu kompilieren. Diese Schritte setzen die ksh voraus.
- Setzen Sie die CFLAGS-, CC- und CPPFLAGS-Umgebungsvariablen wie folgt. (Anmerkung: Die Flags für -I und -bI sind der Buchstabe i großgeschrieben.)
export CFLAGS='-ma -DPASE -I /home/meinname -bI:/home/meinname/libdb400.exp
-bI:/home/meinname/as400_libc.exp'
export CC=xlC
export CPPFLAGS=-qflag=e:e
- Wechseln Sie in das php-4.3.0-Verzeichnis mit dem cd-Befehl.
- Setzen Sie die Ausführungsberechtigung für die Dateien config.guess und config.sub mit folgenden Befehlen:
chmod +x config.guess
chmod +x config.sub
- Führen Sie folgenden Befehl aus:
./configure --with-ibm-db2 \
--with-config-file-path =/QopenSys/php/etc \
--prefix=/QopenSys/php \
--enable-force-cgi-redirect \
--without-mysql \
--disable-mysql
- Wenn Sie direkt in PASE auf der iSeries kompilieren, fügen Sie folgende configure-Flags hinzu (vergessen Sie nicht, am Ende der vorherigen Zeile ein \ hinzuzufügen):
--build=ibm-aix4.3.3.0 \
--host=powerpc-ibm
Der Befehl sollte einige Zeit laufen und einiges an Ausgabe liefern. Nach dem erfolgreichen Beenden sind noch einige kleine Korrekturen an den aufgeführten Dateien in den folgenden Schritten notwendig.
- Editieren Sie das Makefile:
Entfernen Sie -ldb2 aus ODBC_LIBS
Entfernen Sie -ldb2 aus EXTRA_LIBS
- Editieren Sie die Datei main/build-defs.h:
Entfernen Sie -ldb2 aus PHP_ODBC_LIBS
- Editieren Sie die Datei main/php_config.h:
Löschen Sie die Zeile #define HAVE_MMAP 1
Löschen Sie die Zeile #define HAVE_SETITIMER 1
Wenn Sie PHP auf OS/400 V5R1 ausführen:
Löschen Sie die Zeile #define HAVE_STATFS 1
Löschen Sie die Zeile #define HAVE_PREAD 1
Löschen Sie die Zeile #define HAVE_PWRITE 1

Abb. 2: Test: WRKACTJOB in PASE
Makefile und Zeilenlänge
Achtung: Das Makefile wird generiert mit Zeilen mit mehr als 2048 Zeichen. Einige Editoren wie vi können mit dieser Zeilenlänge nicht umgehen, deshalb müssen Sie einen anderen Editor benutzen. Senden Sie das Makefile mit FTP auf eine andere Maschine und zurück, falls notwendig. Wenn Sie Text-Dateien auf einer Windows-Maschine editieren, entfernen Sie bitte mittels folgendem Befehl das LineFeed-Zeichen am Ende jeder Zeile:
tr -d \r < Makefile > Makefile.new
Danach noch ein
mv Makefile.new-Makefile, und der Compiler beschwert sich nicht mehr mit unerklärlichen Fehlermeldungen.
Übersetzen (make)
Sie haben zwei Möglichkeiten, die davon abhängen, ob Sie auf einer AIX-Maschine oder einer iSeries kompilieren. Wenn Sie in PASE auf einer iSeries übersetzen, führen Sie folgende Schritte durch:
- make
- make install
- mkdir /QOpenSys/php/etc
- cp php.ini-dist /QOpenSys/php/etc/php.ini
Dies übersetzt und sichert alle Dateien in das richtige Verzeichnis. Sie müssen Schreibberechtigung auf das
/QopenSys-Verzeichnis haben.
An diesem Punkt können Sie weitergehen zum Abschnitt PHP testen.
Wenn Sie in AIX auf einer pSeries übersetzen, führen Sie folgende Schritte durch:
- Editieren Sie das Makefile (beachten Sie bitte die Warnung bezüglich der langen Zeilen des Makefiles). In der Zeile install-targets entfernen Sie bitte install-pear.
- Führen Sie folgenden Befehl aus:
mkdir /tmp/QOpenSys 34 Führen Sie folgende Befehle aus:
make
make install INSTALL_ROOT=/tmp
Dies installiert PHP in das Verzeichnis /tmp/QOpenSys/php.
- Führen Sie folgende Befehle aus:
mkdir /tmp/QOpenSys/php/etc
cp php.ini-dist /tmp/QOpenSys/php/etc/php.ini
- Editieren Sie das Makefile (beachten Sie wieder die Warnung bezüglich der langen Zeilen des Makefiles)
In der Zeile install-targets fügen Sie bitte install-pear hinzu.
Wenn der Ort Ihres Benutzer-Verzeichnisses auf AIX unterschiedlich zum Ort Ihres
Benutzer-Verzeichnisses auf der iSeries ist (z.B. auf AIX ist es /usr/home/usr4/jdoe
und auf der iSeries ist es /home/meinname), dann ersetzen Sie alle Vorkommnisse
von /usr/home/usr4/jdoe/ durch /home/meinname/. Stellen Sie sicher,
dass Sie den ersten und den letzten Slash mit ersetzen, sodass Sie den Verzeichnis-Trenner
nicht verlieren.
- Führen Sie folgende Befehle aus:
cd /tmp
tar -cvf /home/meinname/php430pasebin.tar QOpenSys
cd ~
tar -cvf php430pasesrc.tar php-4.3.0
- Kopieren Sie beide Dateien, php430pasebin.tar
und php430pasesrc.tar, mittels FTP in Ihr Benutzer-Verzeichnis auf der
iSeries.
- Führen Sie folgende Befehle aus. (Anmerkung: Die folgenden Schritte
werden in PASE auf der iSeries ausgeführt, nicht auf AIX.)
cd /
tar -xvf ~/php430pasebin.tar
cd ~
tar -xvf php430pasesrc.tar
cd php-4.3.0
make install-pear
PHP testen
In der PASE-Shell in OS/400 führen Sie den Befehl
/QOpenSys/php/bin/php -v aus. Als Ausgabe sollte die Version von PHP, die Sie benutzen, erscheinen. Überprüfen Sie bitte die Berechtigungen für die Verzeichnisse
/,
/QOpenSys,
/QOpenSys/php,
QOpenSys/php/bin und das Programm selbst auf Ausführbarkeit.
Joblog
Wenn Sie versuchen, das PHP-Programm in PASE laufen zu lassen und es mit einer ungültigen Anweisung abbricht, schauen Sie nach dem Joblog. Einige Dinge können eine illegale Anweisungs-Ausnahme auslösen und die PASE-Anwendung beenden. Wenn die ungültige Anweisung von einem nicht unterstützten Systemaufruf herrührt, wird der Name des Systemaufrufs im Joblog aufgeführt. Das Joblog sollte Ihnen den Namen des Systemaufrufs nennen. Als nächsten Schritt finden Sie bitte die korrespondierende
HAVE_xxx-Zeile in der Datei
php_config.h und kommentieren Sie sie aus. Danach übersetzen Sie neu. Dies sollte nur passieren, wenn Sie auf einer AIX-Version übersetzen, die gewisse Systemaufrufe unterstützt, die Ihre Version von PASE nicht unterstützt (zusätzlich zu den fünf oben genannten).
Konfiguration des HTTP Servers
Der HTTP Server (powered by Apache) für PHP wird folgendermaßen konfiguriert: Editieren Sie die Datei
httpd.conf mit Hilfe der Apache GUI-Oberfläche. Die Schlüssel-Anweisungen, die gebraucht werden, sind
ScriptAlias /php-bin/ /QOpenSys/php/bin<br></br>AddType application/x-httpd-php .php<br></br>Action application/x-httpd-php /php-bin/php
ServerUserID einProfil<br></br><Directory /QOpenSys/php/bin><br></br> Options +ExecCGI<br></br> order allow, deny<br></br> allow from all<br></br></Directory>
Beenden und starten Sie die HTTP-Server-Instanz (powered by Apache).
Erzeugen einer Beispiel-Datenbank
Hier können wir die Erzeugung einer Beispiel-Datenbank, wie mit dem System geliefert, durchführen. Ab V5R1 wird eine Beispiel-Datenbank mit dem System ausgeliefert. Dies wird unter der URL www.ibm.com/servers/eserver/iseries/db2/sqldata.htm erklärt. Zum Auspacken und Erzeugen der Beispiel-Datenbank rufen Sie folgende Prozedur in irgend einem SQL-Interface auf:
CALL QSYS.CREATE_SQL_SAMPLE('SAMPLE'). Hier ist
SAMPLE der Name des Schemas, das Sie erstellen möchten.
Jedoch benötigen die PHP-Beispiele einige Korrekturen: Beispielsweise läuft PASE PHP als CGI-BIN und kann die Werte
$_SERVER['PHP_AUTH_USER'] und
$_SERVER[`PHP_AUTH_PW'] nicht benutzen.
Auch wenn Sie eine Verbindung zu einer Datenbank aufbauen wollen, benutzen Sie normalerweise etwa dieses:
$dsn = DRIVER=iSeries Access ODBC Driver;SYSTEM=$isdb_system;DBQ=$isdb_database;
$db = odbc_connect($dsn, $user, $password);
Aber in PASE benutzen Sie etwas wie dieses Beispiel:
$db = odbc_connect($isdb_system, , );
odbc_setoption($db, 1, SQL_ATTR_DBC_DEFAULT_LIB, $isdb_database);
Sicherheitskontext
Es macht keinen Unterschied, welche Benutzer-ID und welches Password verwendet wird, wenn die Verbindung zur ODBC-Datenbank aufgebaut wird. Es wird der Sicherheitskontext des Benutzer-Profils benutzt, unter dem der HTTP-Server-Prozess läuft. Benutzen Sie die Direktive
ServerUserID in der Apache-Konfigurationsdatei, um diesen Sicherheitskontext zu ändern. Eigentlich ist es eine Sicherheitslücke, wenn Sie einem Benutzer erlauben, Web-Seiten zu erstellen und nicht dafür sorgen, dass der Apache HTTP-Server unter dem Sicherheitskontext eines anderen Benutzer-Profils ausgeführt wird.

Abb. 3 : PHP DB Query Tester
Einschränkungen
Da PHP als CGI-Applikation läuft und nicht als Apache-Modul, werden einige Dinge in der jetzigen Implementation auf der iSeries nicht wie gewohnt funktionieren:
- HTTP-Authentifizierung wird nicht funktionieren. Jedes Skript, das versucht, die Variablen $_SERVER[`PHP_AUTH_USER`] und $_SERVER[`PHP_AUTH_PWD`] zu benutzen, wird nicht laufen. Sie müssen stattdessen Benutzer-Konten anlegen und eine Seite benutzen, die den Benutzernamen und das Passwort als Eingabe verlangt und dementsprechend ein Cookie setzt.
- PHP_SELF wird nicht funktionieren, außer Sie installieren einen Patch von folgender URL: bugs.php.net/bug.php?id=21261
PHP 4.2.2 errata
Die größte Änderung von Version 4.2.2. zu Version 4.3.0 war der Konfigurationsprozess. Um diesen Artikel zum Übersetzen für PHP Version 4.2.2 zu benutzen, müssen sie folgende Änderungen berücksichtigen:
- Beim Schritt Finden Sie iSeries-spezifische Dateien: Ignorieren Sie die Warnung über die langen Zeilen im Makefile, da dies nicht zutrifft.
Editieren Sie die Datei config_vars.mk. (Anmerkung: PHP Version 4.3.0
hat diese Datei nicht. Dieser Schritt ist nur für PHP Version 4.2.2.)
Entfernen Sie -ldb2 aus ODBC_LIBS
Entfernen Sie -ldb2 aus EXTRA_LIBS
- Beim Schritt Wenn Sie in AIX auf einer pSeries übersetzen... folgen Sie stattdessen diesen Schritten:
cd php-4.2.2
make
cd ..
tar -cvf php422pasesrc.tar php-4.2.2
- FTP der TAR-Datei nach PASE: Die folgenden Schritte werden in PASE auf der iSeries ausgeführt, nicht auf AIX.
cd ~
tar -xvf php422pasesrc.tar
cd php-4.2.2
make install
PHP 4.3.1 errata
Die einzige Änderung bei der oben beschriebenen Vorgangsweise ist die, dass Sie beim Schritt Patchen Sie die Quell-Dateien die letzte Anweisung mit der
php430pase.patch-Datei folgendermaßen ausführen:
cd php4.3.1
patch -p1 < ../php430pase.patch
Links