0% fanden dieses Dokument nützlich (0 Abstimmungen)
321 Ansichten98 Seiten

Learn PHP3

Das Dokument ist eine Sonderausgabe über PHP, die die Bedeutung und Anwendung der serverseitigen Open-Source-Skriptsprache im eBusiness hervorhebt. Es bietet Einblicke in Tools, Produkte und Techniken zur Optimierung von Webanwendungen sowie Interviews mit Entwicklern und Anbietern. Zudem wird die PHP-Community und deren Bestrebungen zur Unterstützung von Nutzern vorgestellt.

Hochgeladen von

Zain Abid
Copyright
© © All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen
0% fanden dieses Dokument nützlich (0 Abstimmungen)
321 Ansichten98 Seiten

Learn PHP3

Das Dokument ist eine Sonderausgabe über PHP, die die Bedeutung und Anwendung der serverseitigen Open-Source-Skriptsprache im eBusiness hervorhebt. Es bietet Einblicke in Tools, Produkte und Techniken zur Optimierung von Webanwendungen sowie Interviews mit Entwicklern und Anbietern. Zudem wird die PHP-Community und deren Bestrebungen zur Unterstützung von Nutzern vorgestellt.

Hochgeladen von

Zain Abid
Copyright
© © All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen

LE_PHP (1-2) 23.08.

2001 10:10 Uhr Seite 1

präsentiert: DM 19,80 SFr 19,80 Ös 153,-


PHP Special

PHP Special Herbst 2001 [Link] /phpspecial

19,80 DM

PHP-Power
mit CD

fürs Web
Tools for Business
19,80 DM

Enterprise Produkte von Zend


Technologies
Applikationen beschleunigen
Der PEAR Daten-/Content Cache
Sessions in PHP4
Daten benutzerorientiert
speichern
Ein Bild sagt mehr...
Dynamische Grafiken mit GD
Auf Datenbanken zugreifen
Oracle, PostgreSQL, MS SQL
Aufbau einer Community
Mit PHP und MySQL
Buchanzeige f PHP Sonder 23.08.2001 14:50 Uhr Seite 1

Anzeige
LE_PHP (3-14) 23.08.2001 10:11 Uhr Seite 3

PHP-Power auf CD!!!


Tools für CD-Inhalt:
PHP-Releases:
• hochperformante Webites PHP 4.0.6, PHP 4.0.7 RC1 und
ältere Versionen
• dynamische Datenbankanbindungen PHP-Tools:
abCache 0.10
• Content Management APC 1.0.10 pl4
DBG 2.04 pl1
• Web Communities Glimmer 1.0.8
MyPHPCalendar 10192000 b1
Nexidion Designer und Debugger 0.9
Pepe 0.5.1 pre
Außerdem eine Auswahl an Datenbanken, Phorecast 0.3.0a
Phorum 3.2.11
Editoren, Web und Application Servern sowie PHP Coder R2 FPR3
PHPEd 1.75a
nützliche Utilities. phpEdit 0.3
phpGroupWare 0.9.12
PHPLib 7.2d
Unter Linux und Windows! PHProjekt 2.4
WebCalendar 0.9.33
CMS-Systeme:
Back-end 0.3.3
Contenido 0.901
eZ Publish 2.1
phpCMS 1.1.5
PHP-Nuke 5.1
phpWebSite 0.7.10
PostNuke 0.62
Datenbanken:
ADODB 1.20
dbXML 1.0 b1
FreeTDS 0.52
InterBase 6.01
MySQL 3.23.40
NuSphere MySQL 1.13.10
phpMyAdmin 2.2.0 rc4
phpOracleAdmin 0.1.3
phpPgAdmin 2.3
PostgreSQL 7.1.2
Application- und Webserver:
Apache Tomcat 4.0 b7
Apache Webserver 1.3.20
Enhydra 3.1
JBoss 2.2.2
JOnAS 2.3
Orion 1.5.2
Xitami 2.4 d9
Zope 2.4.0
Browser:
Mozilla 0.9
Opera 5

Linux Enterprise Special PHP 3


LE_PHP (3-14) 23.08.2001 13:53 Uhr Seite 4

Linux Enterprise Special PHP


Enterprise
7 Higher & High End
7 Higher & High End
PHP, die serverseitige Open Source Skript-
Open Source etabliert sich im eBusiness
sprache, gewinnt in den letzten Monaten im-
mer mehr an Bedeutung. Warum das so ist
und warum PHP auch im eBusiness eine 9 Interview mit Zeev Suraski

große Rolle spielt, will dieser Artikel zeigen. Mitbegründer von Zend Technologies

Community
14 PHP-Community bündelt ihre Kräfte
Der neugegründete PHP Verein stellt sich
vor
15 „Wir wollen ein Bindeglied sein“
15 Interview mit Ulf Wendel, Georg Richter,
Mit der rasanten Verbreitung von PHP suchen immer mehr Nut- Jörg Behrens und Thomas Fromm
zer nach Hilfestellung. Der neu gegründete PHP e.V. möchte Mitglieder des neu gegründeten
professionelle und private Anwender vernetzen, um Hilfestel- PHP-Vereins
lung zu leisten, Erfahrungen auszutauschen und die Akzeptanz
von PHP zu stärken. Am Rande des LinuxTags 2001, auf dem Start up
der Verein gegründet wurde, sprachen wir mit dem frisch ge-
wählten Vorstand. 18 PHP in fünf Minuten
Eine kleine Einführung

20 Erst die Arbeit...


Installation und Konfiguration von PHP

20 Erst die Arbeit… Tools & Tipps


Die Installation von PHP im Apache WWW-Server ist
25 PHP goes Enterprise
auf verschiedene Arten möglich. Dieser Beitrag zeigt, Die PHP Enterprise Tools von Zend Techno-
welche Konfigurationseinstellungen notwendig sind, da- logies
mit Sie mit PHP arbeiten können.
28 Websites, Tools und Editoren
Die wichtigsten Quellen rund um PHP

Lesestoff für PHP-Lover


31 PHP 4 – Die Referenz, PHP 4 – Grundlagen
und Profiwissen
32 PHP – kurz & gut, PHP 4 – Tutorial und
Referenz
33 PHP Developer’s Cookbook
34 MySQL in 21 Tagen
25 PHP goes Enterprise
Die israelische Firma Zend Technologies hat An- Development
fang 2001 eine Reihe von kommerziellen
Produkten rund um die serverseitig aus- 35 Zeit gewinnen mit Templates
geführte Skriptsprache PHP auf den Trennung von Layout und Code
Markt gebracht. In diesem Artikel wer-
den die einzelnen Produkte vorgestellt 47 Klassengesellschaft
und – sofern vorhanden – mit Open PHPLIB und PEAR im Überblick
Source Konkurrenzprodukten verglichen.
50 Schnelligkeit durch Faulheit
Applikationen beschleunigen mit dem PEAR
Daten/Content Cache

4 Linux Enterprise Special PHP


LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 5

53 Benutzerorientiert Daten speichern


Sessionmanagement mit PHP4
35 Zeit gewinnen mit Templates
58 Absolut clever Es ist paradox: Templates und Template-Klassen
Formularhandling mit JavaScript
widersprechen einem der größten Vorteile von
61 Geladen! PHP, der direkten Einbindung in HTML-Doku-
Datei-Uploads leicht gemacht mente, und dennoch sind sie beliebt.
66 PHP-Shellskripts mit Usereingaben
Lesen aus der Standardeingabe mit PHP

68 Ein Bild sagt mehr als 1.000 Worte 50 Schnelligkeit durch Faulheit
Dynamische Grafiken mit GD
Mit dem PEAR Cache Modul steht für
PHP-Skripte ein universeller Datencache
Datenbanken zur Verfügung, der zum Caching von
Daten beliebigen Typs verwendet wer-
73 Open Source Alternative den kann.
PostgreSQL als Alternative zu kommerziel-
len Datenbanken und MySQL

78 PHP und MSSQL – unter Linux


Wie man den Microsoft SQL-Server in die
Linux-Welt einführen kann 78 PHP und MSSQL – unter Linux
81 Mit PHP gelingt der Umstieg Der wohl häufigste PHP-Installationstyp ist LAMP –
Oracle Datenbankzugriffe mit PHP Linux, Apache, MySQL und PHP, analog
auch noch WAMP – Windows,
Solutions Apache, MySQL und PHP, der
Apache Web Server dringt
85 Aufbau einer Community also in die Windows-Welt ein.
Dynamische Websites mit PHP und MySQL
Wir wollen den umgekehrten
91 Teamarbeit im Netz Weg gehen und den Microsoft
Groupware-Tools mit PHP SQL Server (MSSQL) in die Linux-Welt
einführen.
95 Gut Wetter machen
Voice Portal im Südtiroler Bürgernetz

97 Zahlungsmodul in PHP 85 Aufbau einer Community


Benutzerdaten aus Formularen validieren
und speichern Dynamische Seiten kann man leichter pflegen und
konsistent halten, als statische Seiten. Der Beitrag
Rubriken beschreibt am Beispiel eines Gästebuchs, wie man
mit PHP und der Datenbank MySQL dynamisch
6 Editorial
72 Impressum Web-Seiten erzeugen kann.

CD Quellcodes zu den Artikeln im Heft


PHP-Releases: PHP Coder R2 FPR3 phpWebSite 0.7.10 Application- und Webserver:
PHP 4.0.6, PHP 4.0.7 RC1 und PHPEd 1.75a PostNuke 0.62 Apache Tomcat 4.0 b7
ältere Versionen phpEdit 0.3 Apache Webserver 1.3.20
phpGroupWare 0.9.12 Datenbanken: Enhydra 3.1
PHP-Tools: PHPLib 7.2d ADODB 1.20 JBoss 2.2.2
abCache 0.10 PHProjekt 2.4 dbXML 1.0 b1 JOnAS 2.3
APC 1.0.10 pl4 WebCalendar 0.9.33 FreeTDS 0.52 Orion 1.5.2
DBG 2.04 pl1 InterBase 6.01 Xitami 2.4 d9
Glimmer 1.0.8 CMS-Systeme: MySQL 3.23.40 Zope 2.4.0
MyPHPCalendar 10192000 b1 Back-end 0.3.3 NuSphere MySQL 1.13.10
Nexidion Designer und Debugger Contenido 0.901 phpMyAdmin 2.2.0 rc4 Browser:
0.9 eZ Publish 2.1 phpOracleAdmin 0.1.3 Mozilla 0.9
Pepe 0.5.1 pre phpCMS 1.1.5 phpPgAdmin 2.3 Opera 5
Phorecast 0.3.0a PHP-Nuke 5.1 PostgreSQL 7.1.2
Phorum 3.2.11

Linux Enterprise Special PHP 5


LE_PHP (3-14) 23.08.2001 14:00 Uhr Seite 6

Editorial
End Produkte umsteigen. Wir geben Ihnen beispiels-
Higher & High End weise eine Einführung in den Zugriff auf Oracle Daten-
banken via PHP.
Es ist kein Geheimnis, dass das Internet im Prinzip ein In unserer Rubrik Solutions stellen wir Ihnen Anwen-
einziges großes Open Source Projekt ist. Standards dungen vor, die auf der Basis von PHP realisiert wurden.
und Protokolle sind offen beziehungsweise die für die Wer mit seiner Website ein ausgeklügeltes Customer
Realisierung von Websites erforderlichen Technologien Relationship Management betreiben möchte, findet
stehen als Open Source Software oder als kommerziel- Anregungen, wie sich mit PHP und MySQL Web Com-
le Produkte, die auf im freien Prozess entwickelten munities umsetzen lassen. Auch wenn es um Team-
Sprachen basieren, zur Verfügung. work via Internet geht, hat PHP einiges zu bieten. Wir
Was der Apache Webserver mit seinem Marktanteil von stellen Ihnen eine Groupware-Lösung vor, die in PHP
mehr als 60 Prozent im Hinblick auf die leistungsfähige programmiert ist.
Infrastruktur im Hintergrund ist, ist die Skriptsprache eBusiness sowie Kommunikation und PHP katapultiert sich
PHP, wenn es darum geht, aus statischen Dokumenten Interaktion via Internet sind auf Techno- nach vorn
dynamische Seiten und Applikationen zu generieren. logien angewiesen, die stetig mit den
Dabei besticht PHP sowohl durch geringe Einstiegs- Anforderungen wachsen. PHP hat sich bei der Erstel-
hürden als auch durch Skalierbarkeit bis hin zum High lung von dynamischen Webapplikationen bereits be-
End Einsatz. währt – und entwickelt sich mit den neuen Herausfor-
derungen der eEconomy weiter.
Leistungsfähigkeit im eBusiness
Wir wollen Ihnen in unserem PHP-Sonderheft die Leis- Viel Erfolg!
tungsbreite der Skriptsprache darstellen, indem wir Ih-
nen zeigen, welche Möglichkeiten sich durch den Ein-
satz von PHP im eBusiness ergeben. Wir stellen Ihnen
leistungsfähige Profi-Tools und Informationsquellen
vor und geben Ihnen Einblicke in die aktuellen Trends
innerhalb der PHP Community. In Interviews kommen
Entwickler aus der Community sowie Anbieter profes-
sioneller Software zu Wort, sodass Sie sich ein Bild da-
von machen können, was PHP zu bieten hat und wo die
Entwicklung hinführen wird.

Tipps, Tricks & Technologien


In unserem umfassenden Development-Teil finden
Programmierer nützliche Tipps und Tricks zur Optimie-
rung ihrer Webapplikationen. Wir stellen grundlegende
Konzepte wie die Trennung von Layout und Code durch
Templates vor, geben Hinweise, wie sich Anwendungen
beschleunigen lassen und erklären Ihnen, wie sich dy-
namische Grafiken einbinden lassen.
Dynamische Websites sind auf leistungsfähige Daten-
banken angewiesen. Wir zeigen Ihnen, dass die Open
Source Datenbank PostgreSQL sich bereits als Alterna-
tive zu kommerziellen Produkten etabliert hat. Sollte
das Wachstum Ihrer Website die Kapazitäten der Open
Source Lösungen PostgreSQL und MySQL überstei- Dr. Nadja Rosmann
gen, können Sie problemlos auf kommerzielle High Chefredakteurin

6 Linux Enterprise Special PHP


LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 7

PHP im Unternehmen Enterprise


[Link]/ wurde unter Einsatz
von PHP entwickelt.
Wieso sollte PHP eine Rolle in Ihrem
Unternehmen spielen? Nun, PHP ist ein
Open Source Produkt, es bietet dem Ein-
steiger eine deutlich flache Lernkurve, es
besitzt einen extrem großen Funktionsum-
fang, lässt sich leicht in bestehende Systeme
integrieren und erzeugt eine geringe TCO.
Doch alles der Reihe nach.

Fünf gute Gründe, PHP einzusetzen


PHP ist Open Source: Open Source Pro-
dukte haben Vorteile. Im Falle von PHP ar-
beiten weltweit knapp 300 Entwickler an
diesem Produkt, die die Sprache ständig
weiter entwickeln und so für Fortschritt
und Innovation sorgen. Damit trotz dieser
großen Menge an Entwicklern kein Chaos
ausbricht, gibt es eine kleine Kerngruppe
von acht bis zehn Personen, die dafür sor-

Higher & High End von Björn Schotte


gen, dass die Entwicklung von PHP in ge-
ordneten Bahnen voranschreitet. Die Ab-
hängigkeit von einer einzigen Firma, wie im
Falle Microsoft bei ASP, ist hierbei nicht ge-
geben. Durch die Distribution von PHP im
Quellcode ist gewährleistet, dass Fehler ge-
Open Source etabliert sich im eBusiness funden und bereinigt werden können und
dass jeder, der möchte, Änderungen oder
Erweiterungen an PHP selbst machen
PHP, die serverseitige Open-Source Skriptsprache, gewinnt in den letzten Monaten immer mehr an
kann.
[Link] das so ist, und warum PHP auch im eBusiness eine große Rolle spielt, will die- Einfacher Einstieg: Neulingen in PHP
ser Artikel zeigen. wird der Anfang sehr leicht gemacht: da
PHP von der Syntax her eine Mischung aus
PHP als serverseitige Skriptsprache hat sich ten Finanzsites im deutschsprachigen Web. bekannten Sprachen wie Perl, JavaScript
seit Erscheinen von Version 4.0 einer im- Getrieben wird diese Website von X Web- und C darstellt, haben Einsteiger gute Kar-
mer größeren Beliebtheit erfreut. Bis zur servern, die mit komplexen PHP-Applika- ten, wenn sie mit PHP beginnen. Ein Anfän-
Version 4 war PHP vor allem in non-kom- tionen und dem ZendCache laufen. Lycos ger kann in sehr kurzer Zeit passable Er-
merziellen Projekten beliebt (Gästebücher, Europe, Europas größtes Internet-Portal gebnisse mit PHP hervorbringen.
Foren, aber auch größere Applikationen). mit über einer Milliarde PageImpressions Großer Funktionsumfang: Der große
Seit Einführung der Version 4.0 und der da- pro Monat, setzt in vielen Applikationen Funktionsumfang spielt natürlich auch ei-
mit verbundenen Neuimplementierung auf PHP. Der Shopping-Bereich von Lycos ne Rolle beim Siegeszug von PHP: mit weit
fast aller Teile von PHP hat es seinen Sieges- ([Link] zum Beispiel mehr als 2.000 Funktionen, aufgeteilt in
zug im eBusiness fortgesetzt. PHP gilt heute verwendet konsequent auf seinen Servern knapp 90 Module, gehört PHP mit zu den
als eine der schnellsten Skriptsprachen mit PHP, da hierdurch eine große Flexibilität umfangreichsten Skriptsprachen, die es
Hang zur Integration in bestehende Syste- und Zukunftssicherung erreicht werden zurzeit auf dem Markt gibt. Ganz gleich,
me und einem schier unglaublichen Funk- kann. Dies bewog die Entwickler vor einem ob Sie ein dynamisches Pie-Chart in Flash
tionsumfang. Jahr, von Perl auf PHP umzusteigen. Ein an- erstellen, eine SAP- Datenbank ansprechen
deres Beispiel ist das Portal [Link]: oder eine PDF-Datei on-the-fly generieren
Große Websites mit PHP diese in PHP entwickelte Website verzeich- wollen, all das und viel mehr ist mit PHP
Die folgenden Beispiele großer Websites, net mehr als 10,7 Millionen Mitglieder und möglich.
die auf PHP setzen, zeigen, dass PHP in vie- über 140.000 (!) concurrent User, verteilt Integration in bestehende Systeme: Na-
len Unternehmen eine wichtige Rolle spielt. auf 220 Apache Webserver und unter Ein- türlich haben die Entwickler dabei auch an
Wallstreet-Online ist mit über 55 Millionen satz des ZendCache der Firma Zend Ltd. die Integration in bestehende Systeme ge-
PageImpressions pro Monat eine der größ- Die große B2B-Auktionssoftware auf dacht. Mit der PHP-Java Extension ist es

Linux Enterprise Special PHP 7


LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 8

Enterprise PHP im Unternehmen


möglich, dass Sie Ihre in Java geschriebene Dies ist auch bei PHP der Fall: hinter der International PHP Conference. Gerade
Business Logik durch PHP ansprechen ZendEngine (ein Teil von PHP, der den Deutschland ist ein sehr stark Community-
können. Der umgekehrte Weg, d.h. PHP- Sprachkern darstellt) steckt die Firma Zend orientiertes Land. Unternehmen finden al-
Code aus Java heraus schreiben, ist eben- Technologies Ltd. aus Israel, die von den so ihre Mitarbeiter bevorzugt im Job-Fo-
falls beschreitbar. Wenn Sie diesen Artikel beiden Machern von PHP4 und der Zen- rum der Community-Site PHP-Center
in den Händen halten, sollte es auch ein dEngine gegründet wurde: Zeev Suraski [Link]/ oder bei den PHP User-
PHP- Modul geben, mit dem Sie Perl-Code und Andi Gutmans (Zend setzt sich hierbei gruppen, die sich deutschlandweit auf
ansteuern können – die Welt von CPAN aus dem Ze von Zeev und dem nd von Andi [Link]/ organisieren und zu per-
liegt Ihnen damit zu Füßen. Diese drei Bei- zusammen). Diese Firma sorgt zum einen sönlichen Treffen einladen. In persönlichen
spiele zeigen eindeutig, dass PHP sich einen dafür, dass der Sprachkern selbst weiterent- Gesprächen auf zahlreichen Treffen lässt
Platz in der integrierten Welt sucht und sich wickelt wird, und bietet außerdem kom- sich sehr schnell feststellen, ob unter den
beinahe nahtlos in bestehende Systeme ein- merzielle und frei verfügbare AddOns um Teilnehmern potenzielle Mitarbeiter sind
fügen kann. PHP an. Mit dem ZendCache können zum oder nicht.
Geringe Kosten: Als wichtiges Argu- Beispiel Websites zwischen 200 und 500 Wer die Sprache PHP fördern möchte,
ment wird immer die Kostenfrage genannt: Prozent beschleunigt werden, bei gleich- findet im PHP Förderverein [Link]-
dadurch dass PHP Open Source und damit zeitiger Senkung der Last des Servers und [Link]/ eine gute Anlaufstelle. Dieser zum Li-
kostenlos verfügbar ist, benötigen Sie keine des Speicherverbrauchs, je mehr gleichzei- nuxTag 2001 gegründete Verein hat es sich
Ausgaben für Programmlizenzen, wie dies tige Zugriffe auf diesen Server erfolgen. zum Ziel gemacht, PHP in Deutschland zu
zum Beispiel bei ColdFusion nötig ist. Schulungsanbieter wie ThinkPHP (www. fördern und sich für Events wie z.B. einen
Weiterhin ist PHP bestens ausgerüstet für [Link]/), die aus der PHP Communi- Hacker Contest, zu etablieren.
die bekannte und schlanke LAMP-Archi- ty entstanden und professionelle Schulun-
tektur (LAMP bezeichnet hierbei Linux, gen und Consulting-Dienstleistungen an- Ausblick in die Zukunft von PHP
Apache, MySQL, PHP), die aus kostenlo- bieten, haben sich ebenso im Markt Was bringt die Zukunft von PHP? PHP
sen und leistungsstarken Komponenten be- etabliert wie Firmen, die Ihnen komplette wird seinen Siegeszug weiterhin fortsetzen
steht (Linux als stabiles Betriebssystem, Community-Software produzieren. und auf der Mehrheit aller Apache-Web-
Apache als meist eingesetzter Webserver server installiert sein. Gemeinsam mit sei-
der Welt, MySQL als beliebte frei verfügba- Wichtige Business-Events nen Perl- und Java-Extensions wird es sich
re Datenbank und PHP als treibende Kraft Damit PHP im Business auch ein Zeichen leicht in bestehende Umgebungen inte-
für eBusiness Anwendungen). Dadurch, nach Außen hin setzt, gibt es einige nen- grieren lassen. In den High-End Bereich
dass der Entwickler einen leichten Einstieg nenswerte Business-Events. Zum einen ist wird es durch die Produkte von Zend
in PHP findet, verdienen Sie durch „earning hier die International PHP Conference Technologies und eventuell anderen Fir-
while learning“ direkt an Ihrem Mitarbei- ([Link]/) zu erwähnen, men aufsteigen. Es ist zu erwarten, dass
ter mit: während er sich in die Sprache ein- die im Jahr 2000 (dort als deutschsprachi- Modelle wie ein Application Server (allge-
arbeitet, ist er bereits in der Lage, passable ger Kongress ausgerichtet) die erste ihrer meines Buzzword für Features wie Con-
und funktionsfähige Ergebnisse zu produ- Art weltweit war. Hier treffen sich die Er- nection Polling oder das Teilen von
zieren. Während sich in anderen Sprachen finder von PHP ebenso wie bekannte Ent- Ressourcen und Daten) von Drittentwick-
eine hohe Einstiegshürde vorfinden lässt wickler aus der weltweiten PHP-Gemein- lern (z.B. [Link]/) oder -firmen
und der Entwickler dadurch weniger pro- de, die über ihre (Open Source-)Projekte bereitgestellt werden. Mit den GTK-,
duktiv arbeiten kann, hilft PHP Ihnen da- ebenso referieren wie über den prakti- readline- und ncurses-Extensions wird
bei, die TCO zu senken und somit Kosten schen kommerziellen Einsatz von PHP. PHP den Weg zur allgemeinen Skriptspra-
zu sparen – bei gleicher oder noch mehr PHP-orientierte Firmen haben hierbei die che beschreiten und einen festen Platz im
Leistung. Möglichkeit, sich auf einer Ausstellung eBusiness einnehmen.
zu präsentieren; ebenfalls ist mit dieser Björn Schotte ist Web Application De-
Kommerzieller Support Con- ference ein Rahmen geschaffen, in veloper, Consultant und Trainer. Als Mit-
In den vorherigen Absätzen wurde Open dem sich nach neuen Mitarbeitern Aus- begründer des PHP-Centers ist er in der
Source als schlagkräftiges Argument für schau halten lässt. Eine andere wichtige Community verankert und als Gründer
den Einsatz von PHP genannt. Doch vielen Konferenz ist die O’Reilly Open Source von [Link] bringt er durch Schulun-
Firmen ist der Hype um Open Source zu- Convention, die in den USA stattfindet. gen und Consulting PHP in Firmen zum
viel: trotz „kostenlos“ und „frei verfüg- Hier hat nicht nur PHP das Wort, sondern Einsatz. Mehr über ihn ist auf [Link]
bar“ möchten Sie die Gewissheit haben, auch andere Skriptsprachen wie Perl und [Link]/ und [Link]/
dass hinter dem Open Source Produkt eine Python. zu erfahren. Gleichzeitig publiziert er einen
oder mehrere Firmen als Antriebsmotor monatlich erscheinenden Newsletter, der
stehen und dass von weiteren Firmen kom- Wo finde ich Mitarbeiter? sich mit PHP im eBusiness beschäftigt. Sie
merzieller Support, Tools und kommerziel- Die Möglichkeit, Mitarbeiter zu finden, be- können ihn auf seiner Website http://
le Dienstleistungen angeboten werden. schränkt sich nicht nur auf die erwähnte [Link] beziehen.

8 Linux Enterprise Special PHP


LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 9

Anzeige
LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 10

Enterprise Interview Zend Technologies


Zeev Suraski von Zend Technologies 4.0, die neue Architektur und die neuen Fea-
tures, die wir implementiert haben, ent-
scheidende Faktoren dafür, PHP als einen
führenden Kandidaten unter den Internet-

„Unser Ziel ist


Plattformen zu etablieren. Zum anderen ist
die Fähigkeit von Zend zu nennen, PHP
auch den Weg in solche Märkte zu erschlie-
ßen, die bis heute entweder völlig geschlos-
sen oder nur sehr schwer erreichbar sind.

es, PHP weiter Wir hoffen, dass bereits erhältliche und zu-
künftige Zend-Produkte, sowie unsere
Unterstützung von PHP dabei hilfreich
sind, PHP den kommerziellen und Unter-
nehmensmarkt besser zu erschließen. Die

zu verbessern“ Erfahrung hat gezeigt, dass es für Server-


Software ein notwendiger Schritt ist, im En-
terprise-Markt Fuß zu fassen, wenn sie sich
allgemein durchsetzen soll.
von Nadja Rosmann
LE: Wie kam es dazu, dass Sie PHP-Entwickler
wurden?
Das Unternehmen Zend Technologies [Link] sich als wichtigen Bestandteil einer PHP-Re- Zeev Suraski: Ich habe Anfang 1997 damit
begonnen, mich mit PHP zu beschäftigen.
[Link] besteht aus der Sicht von Zend vor allem darin, dass PHP zunehmend Eingang in
Zu diesem Zeitpunkt hatte ein Kollege
den Enterprise-Markt fi[Link] sprachen mit dem Mitbegründer Zeev Suraski über die Entwick- von mir, der Web-Entwickler war, PHP/FI
lungen auf dem PHP-Markt, über die Zukunftspläne des Unternehmens Zend und über die Haltung 1.99 als Beta-Version auf einem der Web-
zu proprietärer und offener Software. Server meiner alten Firma installiert. Ich
war eigentlich eher ein System-Program-
mierer als ein Web-Entwickler, habe aber
Linux Enterprise: Herr Suraski, auf Ihrer Inter- auch schon viel mit C++ CGI-Binaries
net-Seite promoten Sie Zend als führenden Be- herumgespielt. Einige Monate später be-
standteil der PHP-Revolution. Worin bestehen, gann meine Zusammenarbeit mit Andi an
Ihrer Meinung nach, die Gründe für einem Universitätsprojekt – ein Internet-
diese Führungsposition? basiertes Online-Geschäft (als man noch
Zeev Suraski: Die Antwort um- der festen Überzeugung war, hierbei hande-
fasst zwei Aspekte. Zum einen le es sich um eine Cutting-Edge-Technolo-
sind Andi und ich seit 1997 in gie). Nachdem wir die vielen verschiedenen
der PHP-Entwicklung invol- Optionen von Perl über C++ und PHP/FI
viert. Unsere Arbeit bereitete evaluiert hatten, haben wir uns für PHP/FI
den Weg dafür, was PHP heute als den leichtesten Weg für dieses Projekt
ist – eine kraftvolle Multi-Platt- entschieden. Aber schon bald erschien uns
form und eine erweiterbare PHP/FI als unzureichend und instabil, was
Web-Plattform. Wir hatten da- es weitaus schwieriger machte, unser Pro-
mit begonnen, die Foundations jekt zu implementieren, als wir gedacht hat-
und die Infrastruktur für PHP ten. Weil wir aber die generelle Idee immer
3.0 zu schreiben. Wir haben noch gut fanden, entschieden wir uns dazu,
außerdem neue Foundation- PHP noch einmal ganz von vorne zu imple-
Module gestaltet, die den Weg mentieren. Nach einigen Monaten intensi-
dafür bereitet haben, wie PHP ver Entwicklung hatten Andi und ich es fer-
heute aussieht – beispielsweise tiggebracht, die ganze Sprache von Grund
das MySQL-Modul. Im PHP 4.0 Projekt auf neu zu implementieren – allerdings ro-
haben wir unsere Bemühungen fortgesetzt buster und außerdem besser erweiterbar.
und uns sehr hohe Ziele für diesen bedeu- Unser Compiler-Technik-Professor Dr. Mi-
tenden Upgrade gesteckt. Unserer Meinung chael Rodeh ermutigte uns dazu, Kontakt
nach bilden das modulare Design von PHP zum Autor von PHP/FI 2.0 aufzunehmen

10 Linux Enterprise Special PHP


LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 11

Interview Zend Technologies Enterprise


und ihn von unserer neuen Code-Basis zu LE: Worin bestehen die wichtigsten Verbesse- LE: PHP ist eine der am schnellsten wachsen-
überzeugen. Wir haben das tatsächlich ge- rungen von PHP 4? den Web-Applikationen. Laut einer Netcraft-
schafft und sind seitdem Core-Entwickler Suraski: Es gibt natürlich einige, die revo- Untersuchung benutzen bereits fünf Millionen
von PHP. lutionärste Veränderung besteht aber in Websites PHP, es besteht eine monatliche
der Scripting-Engine. Die Scripting-Engi- Wachstumsrate von 15 Prozent. Worin liegt der
LE: Wie lange existiert Zend schon, und mit wel- ne von PHP 4.0 (Zend Engine) ist ihrem Grund für PHPs Stärke?
chen Produkten wollen Sie die Firma auf dem Vorgänger, der PHP 3.0 Engine, sehr über- Suraski: Wir glauben, dass der Grund für
Markt positionieren? legen, und zwar in jedem Aspekt. Sie ist PHPs Erfolg vor allem in den folgenden
Suraski: Die Zeit, seit der Zend besteht, ist schneller (in vielen Fällen Dutzende von Gründen zu suchen ist: Erstens ist es eine
in verschiedene Phasen unterteilt. Andi Malen schneller), sie weist eine modulare Tatsache, dass PHP eine einfach zu benut-
Gutmans und ich waren schon früh im Jah- Bauweise auf (anders als die in PHP 3.0, die zende Plattform ist. Zweitens ist es von
re 1997 mit dem Thema PHP Grund auf weborientiert designt
beschäftigt, als wir den Parser und sehr mächtig. Betrachtet man
designt und implementiert ha-
ben, sowie den Großteil der In-
„Die revolutionärste diese beiden Gründe zusammen,
wird klar, dass PHP die Arbeit
frastruktur für PHP 3.0. Der Veränderung besteht in der schnell und einfach erledigt – und
Name „Zend“ ist dann am En- dies ist der allerwichtigste Faktor in
de des Jahres 1998 entstanden, Scripting-Energie.“ der Webentwicklung. Als dritter
als Code-Name für unsere neue Grund ist natürlich zu nennen, dass
Scripting-Engine-Initiative für PHP frei erhältlich ist. Dies ermög-
PHP 4.0. Im November 1999 wurde die sehr monolithisch aufgebaut war), und sie licht eine breite und weltweite Distribution
Firma Zend Technologies dann offiziell als ist außerdem erweiterbar. Vor allem ist sie von PHP. In Zusammenhang mit der Tatsa-
kommerzielles Unternehmen gegründet, auch wesentlich zuverlässiger. Das zweite che, dass es einfach auch ein gutes Produkt
und in dieser Weise besteht nun die Firma ausschlaggebende Feature von PHP 4.0 ist ist, konnte PHP eine der führenden Spra-
seit eineinhalb Jahren. Zend Technologies meiner Meinung nach das neue SAPI- chen auf dem Markt der Web-Plattformen
ist eine Software-Firma, die ihre Ziele vor Interface. Dieses Interface ermöglicht es, werden.
allem darin sieht, PHP weiter zu verbes- dass PHP als natives Modul unter vielen
sern, besonders im Unternehmensmarkt. verschiedenen Web-Servern laufen kann LE: Welche Bedeutung haben der Apache Web-
Hierfür gibt es verschiedene Wege: Mit En- (PHP 3.0 bot lediglich nativen Support für Server und Linux als Betriebssystem in Verbin-
terprise-Produkten wie dem Zend Cache, Apache). Hiermit wird es Entwicklern er- dung mit PHP?
dem Zend-Encoder oder mit High-Level- möglicht, PHP auf neue Web-Server zu Suraski: Historisch betrachtet, war immer
Services, die die Bedürfnisse kommerzieller portieren, indem man nur ein sehr kleines Apache die native Plattform von PHP.
Unternehmen abdecken können. Mit der Interface-Modul schreiben muss. Das SA- Auch heute noch ist der populärste Web-
Internet-Seite, auf der technischer Inhalt PI-Interface wiederum wurde ermöglicht server, der in Zusammenhang mit PHP be-
zur Verfügung gestellt wird, ebenso wie mit durch ein anderes wichtiges Feature der nutzt wird, der Apache-Server, obwohl
Fallstudien, die dabei hilfreich sind, PHP Zend Engine und PHP 4: Der Thread-Si- PHP noch viele andere Webserver unter-
als eine lebensfähige Lösung in komplexe cherheit. Andere Entwickler arbeiteten zu- stützt. Die Mitglieder der PHP-Gruppe
Webseiten zu implementieren. Und mit ent- sätzlich zu diesen Infrastruktur-Features sind zudem ebenfalls Apache-Software-
wicklerorientierten Produkten wie der an verschiedenen neuen Features mit Foundation-Mitglieder. Jim Jagielski, der
Zend IDE und begleitendem Support. Schlüsselfunktion. Sascha Schumann hat Executive VP der ASF, ist außerdem der
ein neues HTTP-Sessions-Modul entwi- CTO von Zend Technologies in den USA:
LE: Warum basiert Ihr Produkt-Portfolio auf ckelt. Hierbei hat er mit Stig Bakken zu- Auch wenn keine direkte Verbindung zwi-
PHP und nicht auf einer anderen Scriptspra- sammengearbeitet, um neue Building-Me- schen PHP und Linux besteht (dieses läuft
che? Wo sehen Sie die technischen Vorteile von chanismen zu erstellen, mit deren Hilfe genauso gut unter den meisten Unix-Deri-
PHP im Vergleich zu anderen Scriptsprachen Shared Modules auf sehr viel einfacherer vaten), besteht kein Zweifel daran, dass Li-
wie Perl oder Python? Weise erstellt werden können. Die Shared nux zusammen mit Apache und PHP eine
Suraski: Als zwei der wichtigsten Desi- Modules können außerdem unabhängig sehr gute Kombination bildet. Meistens
gner von PHP ist es natürlich unser Ziel, von PHP erstellt werden. Ein anderes kommt dann auch noch MySQL hinzu.
PHP weiter zu verbessern, wie auch seine wichtiges Feature, das ich PHP 4.0 hinzu-
Akzeptanz auf der ganzen Welt. Dies war gefügt habe, ist das Output-Buffering. Es LE: Sind es hauptsächlich Open-Source-Ent-
ein wichtiges Vorhaben, unter dem Zend kann dafür verwendet werden, die HTTP- wickler, die PHP benutzen, oder wird es auch
Technologies aufgebaut wurde. Hinzu Kompression und XML/XSLT-Rendering von Windows-Entwicklern benutzt?
kommt, dass unser Wissen und unsere Er- on-the-fly zu implementieren. Außerdem Suraski: Zunächst einmal denke ich nicht,
fahrungen uns einen großen Konkurrenz- gibt es viele weitere Anwendungsmöglich- dass das Gegenteil eines Windows-Ent-
vorteil auf dem PHP-Markt ermöglichen. keiten. wicklers der Open-Source-Entwickler ist.

Linux Enterprise Special PHP 11


LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 12

Enterprise Interview Zend Technologies


Es gibt bereits eine sehr große Anzahl kom- stellen. Verwendet man die Zend IDE, wir also für einen Teil unserer Software
merzieller Entwickler, die unter Linux ent- kann man eine PHP-orientierte Entwick- Geld nehmen.
wickeln, ebenso wie unter FreeBSD und lungsumgebung nutzen, die auch ein ver- Wir haben unser Bestes gegeben, um ein
anderen Open-Source-Plattformen. Unse- bessertes Debugging enthält – auf diese verständliches Preis-Schema für unsere po-
rer Erfahrung nach ist PHP im kommer- Weise kann man die Entwicklungszeit ver- tenziellen Kunden zu entwickeln. Wir ha-
ziellen Markt extrem populär. Der Groß- kürzen und die Produktivität verbessern. ben außerdem aufmerksam die Resonanz
teil des kommerziellen Marktes, der es Der Zend Encoder Unlimited ermöglicht des Marktes betrachtet, und als wir heraus-
verwendet, benutzt es unter Linux oder So- es Software-Entwicklern, eigene Applika- fanden, dass potenzielle Anwender sich
laris. PHP unter Windows ist immer noch tionen im Binär-Format bereitzustellen, über den Preis beschwerten, haben wir das
kein Mainstream und wird hauptsächlich ohne ihren Source Code zu veröffent- Preis-Schema schnell angepasst, um den
in der Entwicklung verwendet, wobei lichen. Der Zend Cache ermöglicht es kritischen Stimmen besser Rechnung zu
dann die letztendliche Applikation auf ei- Unternehmen außerdem, hoch-perfor- tragen. Die Entwickler-Tools sind jetzt für
nem Unix-Server läuft. mante Lösungen mit einer Effizienz zu er- relativ günstige Preise zu haben, besonders
stellen, die in anderen Web-Umgebungen die Developer Server Suite, die für 50 US-
LE: Die Zend Produkte wollen ein Marktsegment noch nicht erreichbar ist. Dollar monatlich ein echtes Schnäppchen
erreichen, das bereits durch Technologien wie ist.
Microsofts Active Server Pages und Suns Java LE: Die Open-Source-Community betrachtet Der Zend Cache, der auf hochperfor-
Server Pages dominiert ist. Auf welche Weise die kommerziellen Aktivitäten von Zend mit mante Websites in den Unternehmen ab-
wollen Sie Ihren Marktanteil aufrechterhalten? Argwohn. Auf dem PHP-Kongress in Köln letz- zielt, kostet ab 1.500 US-Dollar. Wenn sich
Suraski: Zend Technologies konzentriert tes Jahr beispielsweise wurde Kritik an den das auch zunächst teuer anhört, dann ist es
sich ausschließlich auf den PHP-Markt. Preisen der Zend-Produkte geäußert, und aus das doch in Wirklichkeit nicht. Der Preis
Dieser sehr dynamische Markt scheint der Sicht eines Entwicklers ist Ihr Produkt- von 1.500 US-Dollar macht ca. die Hälfte
sich für alternative Technologien, die Portfolio nicht gerade günstig. Bis zu welchem davon aus, was es kosten würde, einen neu-
ebenfalls gerade erhältlich sind, nicht auf Punkt gehen Sie auf die Bedürfnisse der Ent- en Server zu kaufen, Kosten für Wartung,
diese Weise zu interessieren. PHP ist wickler ein? Support und Installation mit eingeschlos-
schneller, als es Java-basierte Plattformen Suraski: Viele Leute waren sicherlich zu- sen. Darüber hinaus bietet der Zend Cache
sind, außerdem ist es an keine spezielle nächst erstaunt darüber, dass Zend für sei- eine drei Mal besserer Performance – und
Plattform gebunden, wie zum Beispiel ne Produkte Geld will. Die Leute hatten deshalb ist er eine drei Mal bessere Lösung
ASP. Hinzu kommt, dass PHP es ermög- sich an den alten Typus von „Open-Sour- als die Anschaffung neuer Hardware. Und
licht, auch andere Lösungen zu benutzen – ce-Company“ gewöhnt. Unglücklicher- – was möglicherweise noch wichtiger ist:
es ermöglicht es, sich je nach eigener Vor- weise waren diese „Open-Source-Compa- Der Zend Cache ist für hochperfor-
stellung die Rosinen aus dem Kuchen zu nies“ aber vor allem ein Phänomen der mante Websites konzipiert worden, die
picken. Java-Objekte wie auch COM oder Dot-Com-Ära – es stand kein lebensfähi- auch noch das kleinste Restchen verfügba-
.NET-Komponenten können nahtlos in ges Geschäftsmodell dahinter. Support- rer Performance benötigen, um zu funktio-
die PHP-Scripts eingefügt werden. basierte Firmen gingen für gewöhnlich nieren. Für viele Sites, besonders für die
wieder ein, vielleicht auch deswegen, weil nicht-kommerziellen, ist PHP 4.0 so wie es
LE: Welche Art von Web-Applikationen wird Open-Source-Software ohne viel Support ist, schon ausreichend und extrem schnell.
durch PHP am besten unterstützt? Welche Fea- auskommt. Wir hatten den Dot-Com- Die Leute vergessen außerdem oft,
tures sind wichtig in Hinsicht auf das Crash bereits erwartet, bevor er eintrat – dass Zend Technologies bereits einiges an
Enterprise-Computing, beispielsweise um wie viele andere auch. Deshalb beschlos- Ressourcen in die Zend Engine und PHP
eCommerce-Lösungen hoher Komplexität zu sen wir, unser Geschäftsmodell besser auf 4.0 gesteckt hat – PHP 4.0 ermöglicht
kreieren? ein ehrliches und verlässliches Software- immerhin eine um den Faktor 200 größere
Suraski: Diese Frage ist schwierig zu beant- basiertes Modell zu stützen, als auf Performance als PHP 3.0. Außerdem soll-
worten, weil PHP bereits in fast jeder Web- irgendein Dot-Com-Geschäftsmodell. Im te nicht vergessen werden, dass die PHP
Umgebung benutzt wird. Es wurde in kom- allgemeinen hat es sich Zend Technologies 3.0-Engine ebenfalls durch die Zend-
plexen eCommerce-Applikationen ver- zum Ziel gesetzt, PHP zu verbessern, im Gründer implementiert wurde und damit
wendet, ebenso auf Community-Sites und speziellen soll das Ziel erreicht werden, Zend entscheidend daran beteiligt war,
allen möglichen webfähigen Benutzer- den Unternehmens-Markt von PHP zu PHPs großen Erfolg zu ermöglichen.
schnittstellen für Legacy-Applikationen. vergrößern. Bezugnehmend auf die Erfah- Zusammenfassend kann man noch
rungen der Vergangenheit, wäre es fatal einmal sagen, dass wir denken, dass die
LE: Wie sieht ein typisches Web-Projekt aus, für PHP, wenn es sich im Unternehmens- Preise für die Zend-Produkte angemessen
das mit Zend-Tools erstellt worden ist? bereich nicht behaupten könnte, denn sind, die Marktresonanz scheint das auch
Suraski: Die Zend-Produkte unterstütz- dann würde es früher oder später sterben. zu bestätigen. Natürlich würden es Einige
ten die Entwickler dabei, PHP-basierte Um seine große Entwicklerbasis aufrecht vorziehen, wenn unsere Produkte gratis
Lösungen schneller und effizienter zu er- zu erhalten und zu vergrößern, müssen erhältlich wären, aber die Tage der Dot-

12 Linux Enterprise Special PHP


LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 13

Interview Zend Technologies Enterprise


Com-Ära haben mehr als deutlich bewie- überhaupt nicht ausprobiert. Hierin be- mutigt, ihren Code zu verschlüsseln. Auf
sen, dass es unmöglich ist, Geld zu verlie- steht denn auch der Hauptgrund dafür, der anderen Seite sichern die Gebühren für
ren und trotzdem zu überleben. Für Zend weshalb wir einen professionellen Support den Zend Encoder Unlimited aber auch,
Technologies ist es notwendig, Software für PHP anbieten. Wie auch immer, das dass ausschließlich kommerzielle Einrich-
zu verkaufen – und dies, damit wir unser Kernstück unseres Geschäftsmodells be- tungen Zugang zu ihm haben und dass die
Ziel der Verbesserung von PHP bestmög- steht schließlich darin, proprietäre Soft- alten Open-Source-Communities rund um
lich verfolgen können. ware zu verkaufen, die sich an die Vorga- PHP weiter florieren können.

LE: Können Sie uns erklären, wie der LE: Welche Verbesserungen erwar-
Zend Subscription-Plan funktio-
niert?
„Viele Leute waren sicherlich ten Sie in der nahen Zukunft von PHP?
Und wie wird Zend diese Entwicklung
Suraski: Wie bereits erwähnt, erstaunt darüber, dass Zend unterstützen?
wurde die Zend Developer Server Suraski: Im User-Layer sind die
Suite für die Belange der Entwick- für seine Produkte Geld will.“ hauptsächlichen Verbesserun-
ler gestaltet. Sie sollen gen durch PEAR bereits erreicht
hierdurch Zend-Produkte und worden. PEAR hat ambitionierte
Services erhalten, damit sie PHP-Applika- ben kommerzieller Unternehmen richtet. und weitreichende Ziele, und ich bin ge-
tionen entwickeln und einsetzen können. LE: Die Verschlüsselungs-Engine, die dazu ge- spannt darauf, inwieweit diese erreicht
Die Suite enthält sowohl kleine als auch nutzt wird, PHP-Programme zu verschlüsseln, werden. Auf dem Sprachlevel sind wir da-
umfangreiche Versionen und außerdem ist aus der Sicht der Open-Source-Gemeinde bei, Exception Handling zu integrieren,
Updates über das ganze Jahr weg. Gerade kontraproduktiv. Warum bieten Sie eine solche und – auf längere Sicht – wollen wir die
für Produkte wie das Zend LaunchPad und Applikation an, und für welche Art von User ist Objektorientierung sowie die Java/.NET-
die Zend IDE, die sehr häufig verbessert diese gedacht? Integration verbessern.
und als Update veröffentlicht werden, Suraski: Auf den ersten Blick mag es tat-
schien uns dies der effektivste Weg zu sein, sächlich so erscheinen, aber das ist nicht
um diese Software anzubieten. ganz zutreffend. Wir haben bereits seit ein
paar Jahren wiederholt Rückfragen eini- Unser Gesprächspartner
Zeev Suraski hat bereits während seiner Tätigkeit
LE: Ist die Kombination mit proprietären Add- ger Unternehmen erhalten, die darum ba-
für das Web Development bei Netvision, Israels
Ons und Support Ihrer Meinung nach die einzige ten, dass wir einen Mechanismus zur Dis- größtem Internet Service Provider, einige Erfahrun-
Möglichkeit, um im Feld der Open-Source- tribution von proprietärem PHP-Code gen mit PHP/FI gesammelt. Zusammen mit Andi
Software Geld zu verdienen? zur Verfügung stellen. Tatsache ist, dass Gutmans wählte er es für ein Universitäts-Internet-
Suraski: Sie haben Recht, davon sind wir viele Firmen sich deswegen von PHP dis- Projekt aus. Später entwickelten Suraski und Gut-
überzeugt. Im allgemeinen sind Support- tanziert haben, weil es nicht möglich war, mans u.a. die Zend Engine, die PHP 4.0 unterstützt.
basierte Geschäftsmodelle sehr schwierig proprietären Code auszuliefern. Auf die- Suraski designte auch andere PHP 4.0-Komponen-
zu implementieren – gerade in einem Um- ses Anliegen sollte man aber nicht damit ten. Im Jahr 1999 gründete er zusammen mit ande-
feld, das zuverlässige Software produziert, reagieren, die Firmen zu drängen, ihren ren Entwicklern Zend Technologies. Suraski war im

wie das Open-Source-Umfeld. Der Sup- Code offenzulegen. Wir glauben an das Jahr 1999 für den GNU 1999 Free Software Award
nominiert. Er erhielt außerdem weitere Auszeich-
port ist in vielen Fällen gar nicht unbedingt BSD-Modell – ich meine damit: Jeder
nungen für seine Arbeit.
notwendig, und die meisten werden wahr- kann mit dem Code machen, was er will,
scheinlich ohne ihn weiterarbeiten. Den- ob nun als Open Source oder proprietär. Das Unternehmen
noch ist es nach wie vor wichtig, Support Wir mögen den Open-Source-Gedanken, Zend Technologies Ltd. wurde im Oktober 1999 ge-
anzubieten, auch wenn er nicht immer pro- aber wir wollen niemanden dazu zwingen, gründet – die Anfänge des Unternehmens liegen je-
fitabel ist: Er ermöglicht es dem Produkt, in seinen Code offenzulegen, der das gar doch bereits im Jahr 1997. Hier engagierten sich
Gebiete zu gelangen, die ihm ansonsten nicht will. Denn es hat nichts mit Freiheit die Gründer Zeev Suraski und Andi Gutmans im PHP-
verschlossen wären – die Unternehmens- zu tun, wenn man jemanden dazu zwingt, Core-Development-Team und wurden zu dessen
Märkte. Viele Unternehmen hätten nicht seinen Code offenzulegen. wichtigsten Mitgliedern.

einmal darüber nachgedacht, PHP zu be- Den Zend Encoder Unlimited haben Zend Technologies Ltd. ist ein Software-Unterneh-
nutzen, wenn die Option auf einen kom- wir entwickelt, um diesem kommerziellen men, das seinen Schwerpunkt im Bereich der Inter-
merziellen Support nicht existieren würde. Interesse zu begegnen, und nicht, um be- net-Infrastruktur sieht. Es stellt Produkte für Unter-
nehmen sowie Services für PHP zur Verfügung.
Es ist sehr wahrscheinlich, dass die Unter- reits offenen Code wieder zu verschlüsseln.
Zend bietet Lösungen für Unternehmens- und kom-
nehmen, wenn sie damit beginnen PHP Hier liegt auch einer der Gründe dafür,
merzielle Applikationen an, wo Kriterien wie die Ti-
einzusetzen, bemerken, dass sie keinen zu- weshalb wir Gebühren für das Produkt
me-to-market, eine hohe Website-Performance so-
sätzlichen Support brauchen. Hätte es je- entrichten. Ein freies Verschlüsselungstool wie der Schutz von Intellectual Property eine große
doch keine Option auf einen Support gege- widerspricht tatsächlich den Zielen von Rolle spielen.
ben, dann hätten sie PHP wahrscheinlich Open Source, weil es die Leute geradezu er-

Linux Enterprise Special PHP 13


LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 14

Community PHP-Verein

PHP-Community
kumentieren. Die Planungen für das PHP-
Zertifikat werden Anfang nächsten Jahres
beginnen und Vereinsmitglieder sowie
Nichtmitglieder aus allen Bereichen ein-
binden.

bündelt Kräfte
Wer Beratungstätigkeit benötigt, die
über das hinaus geht, was die PHP Com-
munity leisten kann, der kann sich an den
PHP Verein wenden. Beispielsweise kann
der PHP Verein Beratungen zu den vielfäl-
tigen, kaum überschaubaren Lizenzen der
von Ulf Wendel Open-Source-Welt geben, aber auch bei
fachlichen Fragen weiterhelfen. Fachwis-
sen aus der Community kann durch die
Der neugegründete PHP Verein stellt sich vor Vernetzung der einzelnen Kräfte allen
Mitgliedern zur Verfügung gestellt wer-
den.
Mitglieder der PHP-Gemeinschaft
Am Rande des LinuxTag 2001 wurde ein PHP Verein gegrü[Link] Verein, welcher die Gemein- dürfen sich auf die Organisation von
nützigkeit anstrebt, dient zur Förderung und Verbreitung der Webskriptingsprache [Link] soll mehrtägigen Treffen freuen, von denen ein
erreicht werden durch die Förderung von Aus- und Weiterbildung, Koordination von Aktivitäten, erstes für den Sommer 2002 geplant ist. In
diesen Tagen beginnt die Suche nach ge-
Öffentlichkeitsarbeit sowie die Veranstaltung und Förderung von Tagungen und [Link]
eigneten Veranstaltungsorten. Jungauto-
Angebotspalette soll eine sehr breite Zielgruppe ansprechen, die von PHP begeisterten Laien und ren können sich an den Verein wenden,
Schülern bis hin zu Firmen und Trägern öffentlicher Bildungseinrichtungen reicht. falls sie mithelfen möchten, PHP verstärkt
in der Presse zu präsentieren. Der Verein
wird seine Pressekontakte gerne zur Ver-
fügung stellen und sich auch selbst bemü-
hen, PHP einer breiteren Basis bekannt zu
machen.
Eine eigene Publikation, der PHP-Al-
Der Verein besteht aus einem fünfköpfi- wuchsförderung zu betreiben. Im Falle ei- manach, soll PHP-Begeisterte mit Infor-
gen Vorstand (siehe auch Interview), dem ner Fachhochschule ist eine kostenneutra- mationen versorgen. Ausführliche Fach-
ein sieben Personen starkes Beratergre- le, offene Vortragsreihe angedacht, die bei artikel, die in einem Magazin nicht
mium zur Seite steht. Aufgabe des vom hinreichender Resonanz in einem Informa- möglich sind, Erfahrungsberichte, Nach-
Vorstand bestimmten „Advisory Boards“ tionstag endet, an dem sich auch die regio- richtenübersichten, Termine und Vereins-
ist die Beratung und in einem gewissen nale Wirtschaft beteiligen kann, um sich notizen sollen in der Periodika erscheinen.
Maße auch die Kontrolle des Vorstands. vorzustellen und Arbeitskräfte zu werben. So werden beispielsweise die Ergebnisse
Zu den Angeboten des Vereins zählen Die Zusammenarbeit mit anderen Interes- der Wahl zum PHP-Projekt des Jahres prä-
PHP-Schulungen und Workshops, Bera- senvertretungen, beispielsweise PingOS sentiert und die Bestplatzierten erhalten
tungstätigkeiten und die Vermittlung von und Schulen ans Netz, wird angestrebt, um die Möglichkeit, sich vorzustellen. Die Su-
Ansprechpartnern. Weiterhin ist langfris- die Angebote attraktiver gestalten zu kön- che nach einem Partner aus der Fachpresse
tig geplant, ein PHP-Zertifikat, ähnlich nen. für den Wettbewerb beginnt in diesen Ta-
dem GNU Linux-Zertifikat, zu erarbei- Langfristig sollen die Fortbildungsan- gen.
ten, einen PHP-Almanach herauszugeben gebote von einem industriell anerkanntem Wer mehr über den PHP-Verein erfah-
und noch dieses Jahr das PHP Projekt des PHP-Zertifikat begleitet werden. Das Zer- ren möchte, findet auf der im Aufbau be-
Jahres zu küren. fitikat könnte dreistufig aufgebaut sein findlichen Homepage [Link] wei-
Die Schulungsangebote wenden sich und von der Abfrage von allgemeinem tere Informationen. Während Mitglieder
nicht nur an Firmen, die von den Kontakten Grundwissen bis hin zur Abfrage des not- auf einer eigenen Mailingliste diskutieren
des Vereins zu Spezialisten profitieren kön- wendigen Wissens zur Erweiterung der können, müssen sich Interessenten noch
nen, sondern auch an öffentliche Bildungs- Skriptsprache selbst reichen. Ziel ist es, etwas gedulden, bis sie die Informationen
einrichtungen. So wurden bereits drei Wo- Entscheidungsträgern in der Wirtschaft per Mail erhalten. Wer mag, kann auch
chen nach Gründung des Vereins eine Orientierungshilfe bei der Auswahl dem IRC Channel #[Link] einen Be-
Gespräche mit zwei Fachhochschulen und von Arbeitskräften zu geben und Selbst- such abstatten, in dem meist mehrere Vor-
einer Schule aufgenommen, um Nach- ständigen zu helfen, ihr Fachwissen zu do- standsmitglieder vertreten sind.

14 Linux Enterprise Special PHP


LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 15

Interview PHP-Verein Community


Ulf Wendel, Georg Richter, Jörg Behrens und mal wieder festzustellen, dass er die meis-
ten Fragen in der deutschsprachigen PHP-
Thomas Fromm, Mitglieder des neu Mailingliste und im IRC-Channel
#[Link] beantwortet hat und so viele Pla-
gegründeten PHP-Vereins ketten von Usergroup Meetings wie mög-
lich zu sammeln.
Georg Richter: Der Kassenwart heißt
Oliver Gehb und hat als Anlageberater

„Wir wollen ein sowie im Geld- und Devisenhandel bei ei-


ner angesehenen Stuttgarter Privatbank
Erfahrungen gesammelt, wie verantwor-
tungsbewusst mit fremden Geldern um-
zugehen ist. Zurzeit arbeitet er als Assis-

Bindeglied sein“
tent des Vorstands in den Bereichen
Controlling, Finanzen, Investor Relation
bei der KnowOne AG.
Ulf Wendel: Der Posten des Schriftfüh-
rers wird von Thomas Fromm bekleidet.
Thomas dürfte vielen Lesern als Oracle-
von Sebastian Bergmann Spezialist bekannt sein.
Thomas Fromm: Spezialist? Lieber be-
geisterter Oracle User. Dass ich kein Spe-
zialist bin, hat mir Thies Arntzen gerade
Mit der rasanten Verbreitung von PHP suchen immer mehr Nutzer nach [Link] neu ge-
wiedermal gezeigt. (lacht)
gründete PHP e.V.möchte professionelle und private Anwender vernetzen, um Hilfestellung zu Ulf Wendel: Ich schätze Thomas, weil er
leisten, Erfahrungen auszutauschen und die Akzeptanz von PHP zu stä[Link] Rande des Linux- in hektischen Momenten einen ruhigen
Tags 2001, auf dem der Verein gegründet wurde, sprachen wir mit dem frisch gewählten Vorstand. Kopf bewahren kann. Die Presse und Öf-
fentlichkeitsarbeit wird von Georg Rich-
ter geleitet. Georg war einige Jahre als
Pressereferent im Sportbereich für ver-
schiedene Vereine und Verbände tätig, so
zum Beispiel als Pressereferent für den
Billard-Landesverband-Südwest, oder
als Organisator und Pressesprecher von
über 30 internationalen Billard- und
Linux Enterprise: Herr Wendel, Sie wurden auf Schachturnieren, vom Grand-Prix bis
der Gründungsversammlung des PHP e.V. als hin zum Weltcup.
erster Vorsitzender in den Georg Richter: Bei seiner Arbeit kann der
Vorstand gewählt. Bitte Vorstand auf die Unterstützung des Ad-
stellen Sie sich und die an- visory Boards bauen. Dieses setzt sich zu-
deren Vorstandsmitglieder sammen aus Thies C. Arntzen, Hartmut
kurz vor. Holzgraefe, Kristian Köhntopp, Sascha
Ulf Wendel: Der Vor- Schumann für technische Fragen, Adrian
stand besteht auf fünf Hardt für rechtliche Aspekte, Thomas
Personen: dem ersten Weinert als Ansprechpartner für die
und zweiten Vorsitzen- PHP-Usergroups und zu guter Letzt Du,
den, dem Kassenwart, Sebastian, um mich bei der Pressearbeit
einem Schriftführer und zu entlasten.
einem Pressereferenten. Ulf Wendel: Über mich gibt es nicht viel
Der Posten des zweiten zu sagen. Die meisten werden mich ken-
Vorsitzenden wird von nen durch meine Arbeit an der PHPLIB,
Jörg Behrens bekleidet. am PEAR-Projekt oder das – leider noch
Die Leidenschaft von unvollendete – Tool PHPDoc. All diese
Jörg ist es, am Ende eines Tages seine Personen sind wohl bekannt in der deut-
IRIX-Maschinen staunend anzuschauen, schen PHP Community.

Linux Enterprise Special PHP 15


LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 16

Community Interview PHP-Verein


LE: An wen richtet sich der Verein? Wer sollte mit langen Fachartikeln und Berichten al- nur unterstützen. Eine lenkende Rolle
Mitglied werden, und wie können sich Unter- ler Art aus der PHP-Community, was so- werden wir dabei nicht einnehmen.
nehmen einbringen? wohl Mitglieder als auch PHP-Begeisterte Jörg Behrens: Fakt ist aber, dass die Idee
Jörg Behrens: Der Verein richtet sich an je- zugleich anspricht. In einer sehr fernen der Vereinsgründung aus den PHP User-
den, der in seinem Umfeld mit PHP in Be- Zukunft angesiedelt ist die Erarbeitung ei- groups heraus entstanden ist.
rührung kommt und mehr darüber erfah- nes PHP-Zertifikats, welches unter ande- Thomas Fromm: Einige haben kritisiert,
ren will. Einer der Hauptgründe für die rem Firmen als Entscheidungshilfe bei der dass durch Sponsoren etc. unsere Mei-
Überlegung der Vereinsgründung war es Mitarbeitersuche dienen soll. Doch das ist nung beeinflusst werden könnte. Dazu
wohl, einen Ansprechpartner für die In- Zukunftsmusik; ich gehe davon aus, dass kann ich nur sagen, der Verein spiegelt
dustrie zu bieten. Gerade Georg wies aus es binnen der nächsten drei Jahre nicht ge- nicht die Meinung der PHP-Gemein-
seinem Stuttgarter Umfeld darauf hin, lingen wird, ein Zertifikat zu erarbeiten. schaft wider.
dass hier Bedarf besteht. Als ich zum Bei- Dennoch: die Vorstellung hat selbst einen
spiel am Flughafen auf Rasmus Lerdorf Rasmus Lerdorf gereizt. LE: Die Idee zur Gründung eines Fördervereins
wartete, wurde ich angesprochen und ge- für PHP stammt aus der PHP-Usergroup Stutt-
fragt, was PHP denn für eine Firma sei – LE: Wie hoch sind die Mitgliedsbeiträge? Was gart. Bitte fassen Sie für unsere Leser die Ent-
ich hatte ein PHP T-Shirt an. Dem Fragen- kann ein Mitglied für seinen Beitrag erwarten? stehungsgeschichte des PHP e.V. zusammen.
den war schwer klar zu machen, Georg Richter: Die Idee, einen
dass es sich dabei um ein Soft- Verein zu gründen, entstand aus
wareprojekt handelt, das von „Wir planen verschiedene dem Problem, dass Firmen im-
der Community und freiwilligen mer wieder Schwierigkeiten hat-
Entwicklern aus der ganzen Welt Events wie Hacking Sessions, ten, mit der Community oder
getragen wird. den Usergroups zu kommunizie-
Ulf Wendel: Firmen können dem Conventions und kleinere ren. Es fehlte ein fester An-
Verein als Mitglieder beitreten. sprechpartner. Gleiches erfuh-
Natürlich freuen wir uns über je- Wettbewerbe.“ ren wir bei Anfragen von
de Art von Sponsoring seitens ei- Universitäten, die dringend eine
ner Firma. Wir werden in den nächsten Ta- Anlaufstelle in der Community suchten,
gen erste Angebote für alle Mitglieder Ulf Wendel: Der Mitgliedsbeitrag ist in um Schulungen durchzuführen. So kam
formulieren, unter denen auch für Firmen drei Stufen gestaffelt. Der ermäßigte Satz mir auf dem Usergroup-Treffen im Janu-
interessante Angebote sein werden. Hier- beträgt 60 Euro im Jahr, er gilt für Schü- ar in Stuttgart die Idee, einen Verein zu
zu zählen neben der Vermittlung von An- ler, Studenten und Erwerbslose. Im Ein- gründen. Dieser Verein sollte nicht eine
sprechpartnern auch Angebote im Aus- zelfall können auch andere Personen zum Organisationsform der Community und
und Fortbildungsbereich. vergünstigten Satz beitreten. Von Er- der Usergroups darstellen, sondern als
werbstätigen wird ein Beitrag von 120 Bindeglied zwischen Business und Com-
LE: Was sind die kurzfristigen, was die mittel- Euro pro Jahr erhoben. Der gleiche Satz munity/Usergroups fungieren. In Tho-
und langfristigen Ziele des Vereins? gilt für eine Fördermitgliedschaft. Fir- mas Fromm aus Berlin fand ich einen
Ulf Wendel: Nachdem der Verein gegrün- men werden gebeten, mindestens 260 Weggefährten, der diese Idee unterstütz-
det wurde, muss nun zunächst Infrastruk- Euro zu zahlen. Je nach Größe der Firma te. In kurzer Zeit wurde dieser Gedanke
tur aufgebaut werden. Man wird von uns freuen wir uns über einen höheren Be- von vielen Leuten diskutiert und weiter-
in den ersten vier Wochen leider kaum Ak- trag. Einzelpersonen helfen mit ihrem entwickelt. Maßgeblichen Anteil hatte
tivität erkennen können. Der Vorstand Beitrag, viele Events zu finanzieren und hier vor allem die Stuttgarter Usergroup,
muss sich kennen lernen und Kommuni- dürfen sich auf eine Mitgliederzeitung die das Thema „Verein“ zum festen Dis-
kationswege untereinander sowie gegenü- der besonderen Form freuen. Zu den ge- kussionsthema ihrer monatlichen Tref-
ber Interessenten finden. Im nächsten planten Events zählen Hacking-Sessions, fen machte. Die dabei entstandenen
Schritt sind alle Interessenten nochmals zu ja gar Conventions und kleinere Wettbe- Ideen und Konzepte finden sich in den
befragen, was die Ziele sind. Parallel wird werbe. heutigen Zielen des Vereins wieder.
der Vorstand erste Ziele definieren. Mir
persönlich liegen ein Hacking-Event und LE: Wo sehen Sie die Position des PHP e.V. in der LE: Unter anderem wird in der Vereinssatzung
der geplante PHP-Almanach am Herzen. deutschen PHP Community? Wie ist das Ver- die „Veranstaltung und Förderung von Kon-
Wir hoffen, durch die Veranstaltung einer hältnis von Verein und Usergroups? gressen und Tagungen“ rund um PHP genannt.
zunächst kleinen und kurzen PHP-Con- Jörg Behrens: Nach so kurzer Zeit ist es Welche Zielgruppe wollen Sie mit diesen Ver-
vention PHP-Begeisterten ein Forum des schwer für alle/viele zu sprechen. anstaltungen ansprechen?
Austauschs bieten zu können. Mit dem Thomas Fromm: Wir können die Akti- Thomas Fromm: Wir wollen damit jeden
Begriff PHP-Almanach meinen wir ein vitäten der PHP-Usergroups, aus denen erreichen, der mit PHP zu tun haben
kleines Büchlein, welches durchsetzt ist auch die Idee des Vereins entstanden ist, könnte. Das geht vom IT-Entscheider,

16 Linux Enterprise Special PHP


LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 17

Interview PHP-Verein Community


welcher weniger an technischen Details Interesse an der Sprache PHP besteht, nologies war Zeev Suraski anwesend.
interessiert ist, bis zum ambitionierten und dies nicht nur von erfahrenen PHP Ferner waren Hartmut Holzgraefe, De-
Programmierer. Dazu wollen wir eine Programmieren, die sich über Neuigkei- rick Rethans und auch Du, Sebastian, zu
Reihe von Veranstaltungen fördern. Da- ten informieren wollten, sondern vor al- dem Gespräch hinzugebeten worden.
zu gehört beispielsweise die PHP Interna- lem von Ein- und Umsteigern. Georg Richter und ich selbst waren vom
tional Conference, die im November in Verein zugegen, hielten uns aber in der
Frankfurt stattfinden wird. LE: Wie wurde die Idee des Vereins von Rasmus Diskussion eher im Hintergrund. Wir
Ulf Wendel: Der Software & Support Lerdorf beziehungsweise von Zend aufgenom- sprachen unter anderem über Erweite-
Verlag als Veranstalter der PHP-Con- men? rungen am Sprachkern von PHP, der
ference wurde durch den PHP-Verein un- Ulf Wendel: Die Gründung des PHP-Ver- Zend Engine. Derick Rethans stellte sei-
mittelbar nach der Gründung angespro- eins ist auf ein breit gestreutes, positives ne Ansätze zur Erstellung einer Art Ap-
chen. Man wünscht sich eine breite Echo gestoßen. Rasmus hat mit Freuden plication Server vor. Das Treffen fand auf
Beteiligung der PHP-Community an der die Stärke und die Größe der deutschen „neutralem Boden“ in den Räumen der
PHP-Conference. Zur PHP Community PHP-Community zur Kenntnis genom- AGI statt – ein gutes Beispiel wie Firmen
zählt man auch den PHP-Verein. den Verein unterstützen kön-
Ohne weiteren Gesprächen vor- nen – und wurde von allen Be-
greifen zu wollen, bin ich sehr „Wir streben eine Verbreitung teiligten als fruchtbar empfun-
zuversichtlich, dass an dieser den. Rasmus Lerdorf war
Stelle ein Miteinander gefunden und Stärkung von PHP im erfreut, dass Zeev Suraski sich
wird. Natürlich hat Thomas einer offenen Diskussion zum
Recht, wenn er sagt, dass wir privaten und kommerziellen großen Streitpunkt dieser Tage
uns an eine breite Zielgruppe
wenden. Es kann durchaus sein,
Umfeld an und wollen direkte – der Lizenzfrage des Sprach-
kerns – stellte und Lösungswe-
dass der PHP-Verein dabei hilft, Kontakte vermitteln.“ ge andeutete.
Veranstaltungen zu organisie-
ren, die beispielsweise über Li- LE: Vielen Dank für dieses Gespräch
zenzfragen informieren und sich damit men und freut sich über hochgesteckte und viel Erfolg für den Verein!
auch stark an Business-Vertreter wen- Ziele wie das PHP-Zertifikat. Zend Ulf Wendel:Wir möchten uns beim Ver-
den. Die bislang stattgefundene Diskus- Technologies unterstützt den PHP-Ver- lag noch für dieses kurzfristige Interview
sion deutet jedoch eher darauf hin, dass ein auf vielen Ebenen. Dies reicht von bedanken und hoffen, Interessenten da-
das einzige mehrtägige Event – eine Ha- Spenden bei Weitervermittlung von mit erste Einblicke auf die kommenden
cking Convention – sich auch aus prakti- Zend-Produkten bis hin zur Vermittlung Aktivitäten gegeben zu haben.
schen und organisatorischen Gründen des direkten Kontakts mit Core Devel-
primär an Schüler und Studenten wenden opern, wie Zeev Suraski. Wir hoffen, im
wird. Gegenzug durch den Kontakt Firmen
und Einzelpersonen einen direkten, un-
LE: Auf dem LinuxTag 2001 wurde der Verein bürokratischen Kontakt zu vermitteln.
nicht nur gegründet, er wurde dort auch schon Zend strebt wie wir eine Verbreitung und
aktiv und half unter anderem bei der Finanzie- Stärkung von PHP im privaten und kom- Der PHP e.V. im Überblick
rung des PHP Standes. Fassen Sie doch bitte merziellen Umfeld an. Nicht immer sind
einmal kurz zusammen, wie sowohl PHP an wir im Detail einer Meinung, aber das Ein breites Spektrum von Vereinsangeboten bietet
sich als auch der Verein auf der Messe ange- Fernziel ist das gleiche. für jedes Mitglied maßgeschneiderte Angebote.
kommen sind. Schulungen sind für öffentliche Bildungseinrichtun-
gen und Privatpersonen ebenso geplant wie für En-
Jörg Behrens: Die Gründungsversamm- LE: Am Rande des LinuxTags in Stuttgart hat der
terprise Nutzer. Ein PHP Zertifikat, vergleichbar mit
lung auf den LinuxTag zu legen, erwies Verein diverse Core Developer zu einem Ge-
einer GNU-Unix Zertifizierung, könnte einen qualita-
sich als nahe liegend, da davon auszuge- spräch über die Zukunft von PHP eingeladen. tiv hochwertigen und allgemein anerkannten Fähig-
hen war, dass viele Mitglieder und Inter- Was ist das Ergebnis des Treffens? keitsnachweis bilden, welcher der gewachsenen
essenten aus der so genannten PHP- Ulf Wendel: Das größte europäische Rolle von PHP Ausdruck verleiht.
Community anwesend sein würden. Open-Source-Ereignis bot uns einen gu-
Im Rahmen einer breit angelegten Öffentlichkeitsar-
Somit diente der Stand nicht nur als In- ten Rahmen, um PHP-Entwickler auf beit soll PHP auf Messen und Kongressen präsen-
formationsplattform um die Vielzahl von neutralem Boden an einen Tisch zu bit- tiert werden, um neue Märkte zu erschließen und
PHP-Projekten, sondern konnte auch ge- ten, um über die Zukunft von PHP zu noch mehr Menschen vom Open-Source Projekt PHP
nutzt werden, um über den PHP e.V. zu sprechen. Die PHP-Group war vertreten zu überzeugen. Weitere Informationen sind unter
informieren. Die Anzahl an geführten durch Rasmus Lerdorf, Thies C. Arntzen [Link]/ und [Link]/ verfügbar.
Gesprächen zeigt deutlich, dass großes und Sascha Schumann, von Zend Tech-

Linux Enterprise Special PHP 17


LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 18

Startup PHP in fünf Minuten

PHP in fünf
nem Windows-Editor arbeiten, achten Sie
darauf, die Seite im Text-Format zu spei-
chern und an die Extension .php nicht
noch die von Windows-Editoren so ge-
liebte Endung .txt zu hängen.

Minuten Rufen Sie dann die Seite über Ihren


Browser auf, z.B. über [Link]
[Link], wobei [Link] hier für
den Namen oder die IP-Adresse Ihres Ser-
vers steht.
von Uwe Debacher und Bernd Kretschmer Sie sollten eine Seite sehen, die nur aus
dem Text „Hallo Welt“ besteht. Falls Sie
den Quelltext der Seite im Browser se-
hen, dann kann das folgende Ursachen
Eine kleine Einführung haben:

• PHP ist nicht installiert oder die einge-


stellte Extension für PHP-Seiten ist nicht
Für den ersten Einstieg in PHP brauchen Sie wirklich nicht mehr als fünf Minuten, wenn PHP be- php. Halten Sie sich in diesem Fall zur
reits auf Ihrem Rechner installiert [Link]-Programme bestehen aus reinem Text, daher bezeich- Problemlösung an den Artikel über die
net man PHP auch als Scriptsprache und PHP-Programme als [Link] können diese Sprache als Installation und Konfiguration von PHP
auf Seite XX.
Erweiterung von HTML betrachten und Programme meist auch mit den gleichen Editoren erstel- •Sie haben die Seite nicht über http://
len und bearbeiten.Für die Beispiele benutzen Sie einfach einen Texteditor Ihres Betriebssystems, [Link]/[Link] aufgeru-
[Link] oder vi bei Linux oder Editor bei [Link] Sie unbedingt darauf, dass der Editor Ihr fen, sondern z.B. im Browser über DA-
Programm als Text speichert und nicht als [Link]-Dokument. TEI|SEITE ÖFFNEN|DATEI WÄH-
LEN die Seite direkt von der Festplatte
geladen. Nur wenn Sie die Seite über
http:// aufrufen, geht sie durch den
Webserver, der dann die Befehle aus-
wertet.

Hallo Welt mit PHP <? $a=“Hallo Welt“; Wenn Sie die Seite erfolgreich geladen
Der Apache-Webserver durchsucht PHP- echo $a; ?> haben, sollten Sie sich den Quelltext im
Dokumente nach ausführbaren Program- Browser ansehen, hier steht jetzt reiner
mier-Befehlen. Findet er derartige Befeh- Der Echo-Befehl bewirkt eine Ausgabe HTML-Text:
le, so führt er sie aus und fügt die an den Browser.
Ausgaben in die vom Benutzer angefor- Um wie in diesem kurzen Beispiel den <HTML><HEAD><TITLE>Testprogramm</TITLE></HEAD><BODY>
derte HTML-Seite ein. Alle PHP-Pro- Text „Hallo Welt“ per PHP-Befehl auszu- <CENTER><H1>Testprogramm</H1></CENTER>
gramme erzeugen immer Seiten in korrek- geben, müssen Sie aber die beiden Zeilen Hallo Welt
</BODY></HTML>
ter HTML-Syntax. in eine komplette HTML-Seite einbin-
Je nach Konfiguration erkennt Apache den:
PHP-Seiten an den speziellen Endungen Variablen in PHP
.php, phtml, php3 oder php4 oder durch- <HTML><HEAD><TITLE>Testprogramm</TITLE></HEAD><BODY> In dem Beispiel taucht eine Variable a$
sucht jede .html-Seite nach für ihn ausführ- <CENTER><H1>Testprogramm</H1></CENTER> auf. Variablen kennzeichnet man durch
baren PHP-Befehlen. PHP-Befehle grenzt <? ein vorangestelltes $-Zeichen. PHP kennt
$a=“Hallo Welt“;
man durch einen speziellen Tag vom reinen drei Variablentypen:
echo $a;
HTML-Code ab, dieser spezielle Tag be-
?>
ginnt und endet mit einem Fragezeichen: •String $a=“5“
</BODY></HTML>
•Real $a=5.0
<? $a=5; ?> •Integer $a=5
Speichern Sie diese Seite unter dem
Innerhalb der spitzen Klammern kön- Namen [Link] im Wurzelverzeich- PHP ordnet Variablen automatisch ei-
nen beliebig viele PHP-Befehle stehen, die nis Ihres Apache-Webservers, meist nen Datentyp zu. Verwenden Sie stets die
man jeweils mit einem Semikolon beendet: /usr/local/httpd/htdocs. Falls Sie mit ei- richtige Verknüpfung.

18 Linux Enterprise Special PHP


LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 19

PHP in fünf Minuten Startup


Die wichtigste Verknüpfung für Zei- ergibt Hallo5, da PHP die Zahl in einen
chenketten ist die Vereinigung mit dem String umwandelt.
Operator „.“: Viele Besonderheiten bei Variablen
werden besonders denjenigen ungewöhn-
$a . $b lich vorkommen, die es gewohnt sind, mit
strengen Sprachen wie Pascal zu arbeiten.
Zahlenvariablen bzw. numerische Nutzen Sie die Chancen, abstraktere
Ausdrücke können Sie sehr vielfältig mit- Metaprogramme zu verfassen, die das fol-
einander verknüpfen: gende Konstrukt erlaubt:

• + – Addition $a=“Hallo“;
• - – Subtraktion $$a=“Welt“;
• * – Multiplikation
• / – Division Das doppelte $ macht den Wert von $a
• % – Modulo zum Variablenbezeichner. Die zweite Zei-
le hat also den gleichen Effekt wie:
Sie selber müssen darauf achten, dass
Sie die richtige Verknüpfung wählen. Defi- $Hallo=“Welt“;
nieren Sie für das folgende Beispiel bitte
die Variablen: Noch ungewöhnlicher ist der Umgang mit
Arrays. Diese werden dynamisch und sehr
$a =“Hallo „; flexibel angelegt:
$b=“Welt“;
$a[0]=“Hallo“;
$a[1]=“Welt“;
Anzeige
Wenn Sie diese Variablen mit „+“ ver-
knüpfen, würde Apache „0“ ausgeben,
da PHP die Inhalte als Zahlen interpre- legt ein Feld mit zwei Komponenten an,
tiert: das aber jederzeit erweitert werden kann.
Die Definition hätte man auch abkürzen
echo $a+$b können mittels:

Zeichenketten verknüpft man richtig $a[]=“Hallo“;


mit dem Zeichen „.“: $a[]=“Welt“;

echo $a . $b Den Rest ergänzt das System und zählt


den Index jeweils hoch. Das ist sehr prak-
ergibt also die gewünschte Ausgabe tisch, wenn man ein Programm häufiger
„Hallo Welt“. ändert. Die Elemente bleiben immer fort-
Interessant wird es immer dann, wenn laufend nummeriert.
die Variablentypen nicht zur Art der Ver- Interessant ist auch die Möglichkeit,
knüpfung passen, Sie also z.B. einen String Strings als Index zu nutzen:
zu einer Zahl addieren. Definieren Sie die
folgenden Variablen: $a[„Hallo“]=“Welt;

$a=“Hallo“; Dies ist z.B. dann hilfreich, wenn Sie


$b=5; Formulare auswerten wollen. Als Index
benutzt man den Namen des Feldes und
Dann ergibt als Wert die Benutzereingabe. So sind Pro-
gramme möglich, die mit beliebigen For-
$a + $b mularen zusammenarbeiten, ohne etwas
über deren Aufbau zu wissen.
die Ausgabe 5, da PHP dem Text Hallo Für die ersten fünf Minuten sollte dies
den Zahlenwert 0 zuordnet. ausreichen. Faszinierende Möglichkeiten
von PHP können Sie in den weiteren Arti-
$a . $b keln dieses Hefts kennen lernen.
LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 20

Startup Installation und Konfiguration von PHP


Im Vergleich zu PERL, das klassischer-
weise eher zur Programmierung von CGI-
Programmen verwendet wird, zeichnet
sich PHP durch die einfache Installation
und übersichtliche Konfiguration aus. Zu-
dem ist durch den Bytecompiler die Ge-
schwindigkeit von PHP mit der von PERL
ebenbürtig, dabei verbraucht PHP jedoch
meist deutlich weniger Hauptspeicher als
PERL und ist meist einfacher zu lernen, als
die vielen verschiedenen Sprach- und Aus-
drucksmöglichkeiten von PERL.
PHP ist hierbei nicht nur eine Program-
miersprache unter vielen, sondern bildet
mit Hilfe von Schnittstellen zu anderen Pro-
grammen ein Art Bindeglied zwischen
HTML und den verschiedenen Program-
men. Neben anderen Schnittstellen stellt
PHP folgende zur Verfügung:

•Datenbanken wie Adabas, DBase, IBM


DB2, Informix, mSQL, MySQL, Oracle,
PostgresSQL, ODBC
•Grafik mit GD, Beschriftungen mittels
True Type Fonts

Erst die Arbeit... •TCP/IP Protokolle wie ICAP, IMAP,


POP, Kerberos, OpenSSL oder auch
YP/NIS.

Diese Liste ist nicht erschöpfend, zeigt


von Andreas Stübinger
aber die Möglichkeiten von PHP.

Installation und Konfiguration von PHP Installation


Die Installation von PHP im Apache
WWW-Server ist auf verschiedene Arten
möglich. Der wohl einfachste Weg ist dabei
die Installation eines bei der jeweiligen Dis-
PHP (eigentlich PHP:Hypertext Preprocessor) Interessant ist PHP vor allem deswegen, tribution schon mitgelieferten vorübersetz-
ist eine leistungsfähige blockorientierte Hoch- weil es nicht nur vom WWW-Server als ex- ten Moduls. Dabei ist man jedoch auf die
terner Prozess aufgerufen werden muss, Einstellungen, die der Distributor getroffen
sprache mit objektorientierten Anleihen, die in sondern auch direkt im WWW Server Pro- hat, festgelegt. Den eigenen Bedürfnissen
der aktuellen Version 4 auch mit einem Byte- zess selbst ablaufen kann. Somit muss für genauer anpassbar ist dagegen ein Selbst-
compiler aufwarten [Link] kann zur Pro- das PHP-Skript kein eigener Prozess er- übersetzen der Sourcen. Die erste Anlauf-
grammierung von CGI-Skripten eingesetzt zeugt werden, weshalb dieser Einsatz deut- stelle hierfür ist die Homepage zu PHP
lich ressourcenschonender und auch lauf- [Link] und die Liste der zugehöri-
werden, aber auch vollständig unabhängig von zeiteffizienter ist. gen Mirrorserver. Dort ist neben den ak-
jeglichem WWW-Server als Skriptsprache wie Der Einsatz von PHP ist durch die Ein- tuellen Sourcen zu PHP auch eine Doku-
[Link], perl oder python bettung in HTML selbst sehr einfach. Es mentation zu finden. Außerdem können
wird nicht jeweils eine externe Datei benö- Referenzen auf den Einsatz von PHP und
tigt, sondern der Code steht direkt im Projekte, die PHP verwenden, eingesehen
HTML-Text. Er ist mit entsprechenden werden.
Tags markiert, sodass der WWW-Server Um PHP an den WWW-Server Apache
bei Auslieferung der Seite erkennen kann, anzubinden, kann eine der folgende Mög-
ob dies nun ein PHP-Skript oder normaler lichkeiten verwendet werden, jedoch nicht
HTML-Text ist. beide gleichzeitig:

20 Linux Enterprise Special PHP


LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 21

Startup
•Festes Einlinken von PHP in den WWW-Server
Dadurch wird PHP ein fester Bestandteil des Servers. Diese
Vorgehensweise ist einfach und auch in allen Schritten ausführ-
lich in der Dokumentation zu PHP beschrieben. Sie hat den
Nachteil, dass für jede neue Version von PHP auch der Server
neu zu übersetzen ist.
•Einbinden als DSO (dynamic shared object)
Hier wird PHP zu einem dynamisch ladbaren Modul des WWW-
Servers. Diese Art ist nicht aufwändiger, hat jedoch den großen
Vorteil, dass eine neue PHP-Version sehr viel einfacher zu instal-
lieren ist, weil nicht der gesamte WWW-Server neu übersetzt
werden muss. Ein Übersetzen der neuen PHP-Version mit an-
schließendem Kopieren des dynamisch ladbaren Moduls genügt,
um in den Genuss der neuen PHP-Version zu kommen.

Da das Einlinken von PHP in den WWW-Server sehr detailliert


schon in der Dokumentation von PHP beschrieben ist, wird im fol-
genden die Konfiguration und Installation der DSO-Version be-
schrieben.
Als erstes ist hierzu sicherzustellen, dass der vorhandene Apa-
che WWW-Server die entsprechenden Voraussetzungen zum Ein-
satz von DSO Modulen besitzt: es müssen die Module http_core.c
und mod_so.c bekannt sein. Ein httpd -l liefert die entsprechenden
Informationen. Erst mit diesen beiden Modulen bietet Apache die
nötige Umgebung, um Module auch verwalten und benutzen zu
Anzeige
können.
Nach dem Kopieren der Sourcen von einem naheliegenden
Mirror ist PHP zu entpacken und mittels ./configure auf die Über-
setzung vorzubereiten. Im Wesentlichen sind folgende Schritte an-
zuwenden:

gunzip -c [Link] | tar xf -


cd php-4.0.x
./configure --with-apxs ....
make
make install

Wichtig für die Konfiguration von PHP als DSO Modul ist
hierbei --with-apxs. Damit wird die Übersetzung von PHP als
DSO-Modul vorbereitet und die Makefile’s entsprechend erzeugt.
Dabei müssen keinerlei Sourcen von Apache selbst mehr vorhan-
den sein, es genügt die installierte Binärversion. Man beachte auch
die Verwendung von ./configure (mit Pfadangabe), statt des kürze-
ren configure v.a. aus Sicherheitsgründen: Zum einen ist sicherge-
stellt, dass wirklich das gewünschte configure Skript verwendet
wird, zum anderen sollte sich „.“, also das aktuelle Verzeichnis,
nicht im Pfad befinden.

Optionen, Optionen,...
Das ./configure-Skript versteht eine Menge von Optionen, vor al-
lem um die diversen Schnittstellen von PHP einzustellen. Einen
Überblick über alle möglichen Optionen liefert ein ./configure --
help. Das Skript versucht zwar herauszubekommen, welche Pro-
gramme auf dem lokalen Rechner installiert sind und zu welchen
entsprechende Schnittstellen sie in PHP eingebunden werden kön-
LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 22

Startup Installation und Konfiguration von PHP


nen. Zu Dokumentationszwecken einer In- rameter nicht angegeben wird, so wird eine MySQL als dynamisch ladbare Bibliothek
stallation jedoch ist es dringend anzuraten, solche Schnittstelle stillschweigend gar einzubinden. Damit müssen beim Start von
alle Argumente beim Aufruf von ./confi- nicht erst eingebunden. Vor allem bei auf PHP nicht alle Schnittstellen sofort einge-
gure auch entsprechend anzugeben. Damit RedHat basierenden Linux-Installationen bunden werden, sondern können erst spä-
ist die Installation genau festgelegt und ist für die Übersetzung von PHP meist das ter bei Bedarf mittels der Funktion dl hinzu-
./configure meldet, wenn bestimmte Vor- Entwicklerpaket notwendig (z.B. zusätz- geladen werden.
aussetzungen, die zur Installation von z.B. lich zum Paket [Link] ist das Paket Daneben gibt es eine Fülle von Optio-
der Schnittstelle zu MySQL benötigt wer- [Link] notwendig). nen, die die Arbeit von PHP zur Laufzeit be-
den, nicht erfüllt sind. Falls jedoch der Pa- Ein configure-Befehl könnte also wie einflussen. Um PHP in ein bestimmtes Ver-
folgt aussehen: zeichnis zu installieren, ist die Option
--prefix=pfad zu verwenden. Hierbei ist je-
PHP als standalone binary ./configure --with-apxs --with-gd=shared--with-ttf -- doch zu beachten, dass die Konfigurations-
Insbesondere zum Testen von PHP-Skripten kann es
without-t1lib \ datei [Link] nicht auch automatisch in
recht sinnvoll sein, PHP von der Kommandozeile aus
--with-mysql=shared,/usr --without-curl --without- pfad/etc zu liegen kommt, sondern erst
aufrufen zu können. Dies wird zwar in der Dokumenta-
db --without-db2 \
tion erwähnt, jedoch nicht näher beschrieben. Dabei nach einem --with-config-file-path=pfad im
--disable-ftp --without-cdb
ist der entsprechende Parameter für den ./configure gewünschten Verzeichnis erwartet wird.
Lauf praktisch selbsterklärend: Mittels --enable-force-cgi-redirect, der bei
./configure --without-apache --with-other-options Mittels with- wird ./configure mitge- der Verwendung für CGI-Skripten mög-
teilt, zu welchem externen Programm eine lichst zu verwenden ist, werden zusätzliche
Es genügt auch, die Option --with-apsx nicht anzuge-
Schnittstelle mit zu übersetzen ist, also z.B. Sicherheitsüberprüfungen eingebaut, um
ben. Damit ist ein Testen von PHP-Skripten auch ohne
--with-gd oder--with-mysql. Falls die zum sogenannten Pfad-Redirects vorzubeugen.
WWW-Server möglich. Ein Aufruf von php -q myphps-
[Link] führt das PHP-Skript ohne jeglichen WWW- Übersetzen von PHP benötigten Informa- Am Ende von ./configure werden u.U.
Server aus, der Parameter -q unterdrückt die Start- tionen dabei nicht in den Standardpfaden noch Informationen über nicht gefundene
meldung von PHP, der Parameter -s erzeugt ein wie /usr/include oder /usr/lib zu finden sind, oder dem Skript seltsam anmutende Konfi-
farblich gesetztes Listing des Skripts. Auch kann das so gibt es nun zwei Möglichkeiten: Entwe- gurationswünsche ausgegeben. Eine Mel-
Skript, wie unter Unix üblich, mit der Zeile der verwendet PHP dann automatisch eine dung ist z.B. dass die von PHP implemen-
#!/path/to/php -q beginnen, so dass der Aufruf nur eigens implementierte Schnittstelle, wie tierte Schnittstelle zu MySQL verwendet
noch aus dem Skriptnamen bestehen kann. Damit ist z.B. bei MySQL, oder aber meldet einen wird oder, bei Übersetzung als standalone
der Zugriff auf die Datenbank auch von der Komman-
Fehler über nicht gefundene Dateien, was Version der Parameter --enable-force-cgi-
dozeile aus in der gewohnten Umgebung möglich.
bei der Schnittstelle zu GD der Fall ist. Um redirect, nicht angegeben wurde. Diese
Und wenn Netscape’s Navigator mal wieder eine lee-
PHP den Pfad zu einer installierten exter- Meldungen sind jedoch so ausführlich
re Seite ohne jeglichen Text anzeigt, so findet sich
hiermit vielleicht sehr viel einfacher die „\0“ im er-
nen Bibliothek anzugeben, wird der Pfad kommentiert, dass sie leicht verständlich
zeugten Code der Ausgabe. an den entsprechenden Parameter ange- sind. Eine Kopie der bei ./configure angege-
hängt, also z.B. --with-gd=/opt/gd-1.8.3, benen Parameter findet sich am Anfang der
Passworte in PHP Skripten falls GD nach /opt/gd-1.8.3 installiert wur- Datei confi[Link] und kann als Doku-
Wohin mit dem Passwort, das zur Anmeldung an der de. Um bei Vorhandensein einer von PHP mentation einer Installation herangezogen
Datenbank benötigt wird? Es gibt hier mehrere Wege: selbst implementierten Schnittstelle den- werden.
• Der einfachste und dabei schlechteste Weg ist noch eine schon vorhandene zu verwen- Das Übersetzen und Installieren von
es, die Zugangsdaten direkt im PHP-Skript den, wie es z.B. bei MySQL der Fall ist, PHP geht nun mit den oben schon gezeigten
anzugeben. Sollte der WWW-Server mal ohne muss der entsprechende Pfad angehängt make und make install.
PHP arbeiten, so werden diese Seiten ohne Bear werden, selbst wenn die externe Bibliothek Am Ende von make ist eine Datei
beitung ausgeliefert, d.h. die Passworte werden
in einem der Standardpfade zu finden ist. [Link] erzeugt worden, die von make
im Client sichtbar.
Im Beispiel MySQL ist also --with-mysql= install, neben anderen Dateien, in das Ver-
• Schon etwas besser ist es, die Zugangsdaten in /usr als Parameter anzugeben. Zu beachten zeichnis [Link]/libexec kopiert
einer eigenen Datei abzulegen, die vom eigent-
ist, dass die dynamischen Bibliotheken wird. Falls es beim Übersetzen von PHP zu
lichen Skript mittels require eingebunden wird.
auch zur Laufzeit von PHP gefunden wer- zunächst nicht recht verständlichen Fehler-
Diese Datei muss mittels z.B. .htaccess gegen
den müssen, d.h. die entsprechenden Pfade meldungen kommt, nachdem mehrmals
Zugriff geschützt werden.
müssen in der /etc/[Link] eingetragen die Konfiguration geändert wurde, emp-
• Dieser Schutz mittels .htaccess kann einge-
sein. fiehlt es sich meist, die Datei confi[Link] zu
spart werden, wenn die Dateien mit den
Es ist des weiteren möglich, einige der löschen, die configure angelegt hat.
Zugangsdaten auf einem gar nicht offen zugäng-
lichen WWW-Baum liegen, d.h. außerhalb der
Schnittstellen von PHP selbst wiederum in
WWW-Server DocumentRoot liegen. Auch hier- dynamisch nachladbare Bibliotheken zu Konfiguration des WWW Servers
bei werden die entsprechenden Daten mittels verlagern. Hierbei ist ein shared nach dem Neben dem Kopieren der [Link] ver-
require eingebunden. Parameter anzugeben, also z.B. --with- sucht der make install, die für PHP not-
mysql=shared,/usr, um die Schnittstelle zu wendigen Einträge in der [Link] zu

22 Linux Enterprise Special PHP


LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 23

Installation und Konfiguration von PHP Startup


machen. Es handelt sich um die folgenden wird, so wird auch PHP eingebunden. Falls nen von PHP-Tags diese auch abzuarbei-
Einstellungen: der Parameter nicht angegeben wird, so ten. Standardmäßig ist dieser Wert auf on
werden Anfragen an PHP-Skripte über die gestellt, bei off erfolgt keine Bearbeitung
•LoadModule php4_module libexec/ Direktive RedirectMatch mit einem Ver- durch PHP. Der Parameter short_open_tag
[Link] – Hiermit wird dem WWW- weis auf eine Seite beantwortet, die dann ei- steuert, ob sich PHP dem XML-Standard
Server mitgeteilt, dass die dynamische Bi- ne entsprechende Fehlermeldung ausgibt. anlehnt (off) und alle Skripte mit <?php
bliothek [Link] zu laden ist. Die Mo- Ein ähnlicher Mechanismus, um über If- oder <script language=“php“> beginnen
dulinformation, d.h. was dieses Modul Module zu entscheiden, ob das Modul PHP müssen oder ob auch die kurze Einleitung
eigentlich darstellt, befindet sich in der auch wirklich geladen werden konnte, lässt (on) mittels einfachem „<?“ die Verarbei-
Struktur php4_module. Im Quellcode sich leider nicht verwenden, da IfModule tung von PHP startet. Des weiteren können
von PHP befindet sich die entsprechende nur für in den WWW-Server fest eingelink- mittels asp_tags auch ASP-ähnliche Tags
Definition in der Datei sapi/apache/mod_ te Module den Wert true zurückliefert. als Markierungen für PHP-Code dienen.
php4.c. Nach einem Neustart des WWW-Ser- Dies hat den Vorteil, dass diverse unter
•AddType application/x-httpd-php .php – vers ist PHP bereit für die tägliche Arbeit. Windows lauffähige HTML-Editoren auf
Dem WWW-Server kann mitgeteilt wer- PHP arbeitet hierbei mit den fest eingebun- diese Weise nicht versuchen, markierten
den, bei welchen Dateiendungen PHP denen Einstellungen. Um PHP nun den ei- Code umzuformatieren. Ein PHP-Skript
mitarbeiten soll. Neben der hier angege- genen Vorstellungen entsprechend einzu- wird dann nicht mehr mittels <?php einge-
benen Standardeinstellung können auch stellen, muss die Datei [Link] angepasst leitet, sondern mittels der ASP-Syntax <%
andere getroffen werden. Bei einem Add werden. und %> umschlossen.
Type application/x-httpd-php .html wird Für die Laufzeit von PHP-Skripten
PHP auch Dateien mit der Endung .html Konfiguration von PHP: Die Datei [Link] interessant ist der Eintrag implicit_flush.
bearbeiten, also ganz normale WWW- Standardmäßig verwendet PHP fest einge- Im Produktionseinsatz sollte der Wert von
Seiten. Es können mehrere Dateiendun- bundene Einstellungen, die sich aus dem implicit_flush auf off gesetzt sein, da sonst
gen durch Leerzeichen getrennt angege- ./configure ergeben. Deshalb wird von ma- nach jeder Ausgabeoperation der Ausgabe-
ben werden. Für noch vorhandenen ke install auch keine Datei [Link] instal- puffer geleert wird, was zwar sicherstellt,
PHP3-Code hilft ein AddType applica- liert. Die den Sourcen beiliegenden Dateien dass die Ausgabe auch wirklich beim Client
tion/x-httpd-php .php3. [Link]-dist und [Link]-optimized können ankommt, jedoch zusätzliche Rechenzeit
•AddType application/x-httpd-php- source. als Muster für eine eigene [Link] Datei ver- kostet. Für Debugging wird es sehr nützlich
phps – Mit dieser besonderen Einstellung wendet werden. Sie sind sehr gut kommen- sein, diese Option auf den Wert on zu stel-
erzeugt PHP selbst aus Dateien der En- tiert, verwenden jedoch standardmäßig ei- len. Ebenso interessant ist die Möglichkeit,
dung .phps eine farblich markierte Dar- ne Tabulatorbreite von vier Leerzeichen, jede Ausgabe über eine eigene Ausgaberou-
stellung des PHP-Quellcodes. was meist zu sehr verzogener Darstellung tine laufen zu lassen. Die entsprechende
•AddModule mod_php4.c – Diese Einstel- führt. Damit PHP eine eigene [Link] auch Routine wird mittels output_handler ein-
lung ist nur nötig, falls sich ein ClearMo- wirklich verwendet, muss sie in das Ver- gestellt und kann z.B. die Datenübertra-
duleList in der [Link] befindet. Damit zeichnis kopiert werden, das als Parameter gung komprimieren für Clients, die diese
wird vereinbart, dass es ein Modul php4 zu --with-config-file-path angegeben wur- Art der Kommunikation unterstützen.
im Server gibt. de (standardmäßig /usr/local/lib). Ände- Eine Art Kompatibilitätsoption stellt
rungen der Konfiguration in der Datei allow_call_time_pass_reference dar. Ak-
Falls für z.B. einen Testserver PHP nicht [Link] wirken sich erst nach einem Neu- tuell ist sie normalerweise auf on gestellt
immer im WWW-Server mitlaufen soll, so start des WWW-Servers aus. Falls PHP und erlaubt damit Parameter, die im Skript
kann dies über die Kommandozeile und auch nach dem Neustart des WWW-Ser- als call by value übergeben werden, den-
folgende Einstellungen in der [Link] vers keinerlei Reaktionen auf geänderte noch als call by reference zu übergeben. In
geregelt werden: Einstellungen in der [Link] zeigt, so gehen Zukunft jedoch wird diese Option auf off
meist die Meinungen zur Lage der Datei gestellt sein, d.h. der Skriptprogrammierer
<IfDefine with_php> [Link] zwischen Benutzer und PHP aus- muss selbst entscheiden, welche der über-
LoadModule php4_module libexec/[Link] einander. Dann bietet sich ein Blick auf die gebenen Variablen per value und welche
AddType application/x-httpd-php .php
Ausgabe des Skriptes <?php phpinfo(); ?> per reference zu übergeben sind.
AddType application/x-httpd-php .php3
an, da hier in der Zeile Configuration File
AddType application/x-httpd-php-source .phps
</IfDefine>
([Link]) path der in PHP eingestellte Pfad Etwas Sicherheit gefällig?
<IfDefine !with_php>
zur Konfigurationsdatei ausgegeben wird. Der Sicherheit von Skripten sind die Optio-
RedirectMatch ^.*\.php.?$ [Link] nen mit Präfix safe_ zugeordnet. Unter an-
</IfDefine> Wann soll PHP mitarbeiten? derem ist es hierbei möglich, Funktionsauf-
Mit engine on wird PHP angewiesen, über- rufe von PHP zu sperren (disable_
Falls nun beim Start von Apache mittels haupt bei der Verarbeitung von HTML- functions) oder aber zu verbieten, dass Um-
des Parameters -Dwith_php angegeben Seiten diese abzuarbeiten und beim Erken- gebungsvariablen von PHP aus vor exter-

Linux Enterprise Special PHP 23


LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 24

Start up Installation und Konfiguration von PHP


nen Programmen geändert werden können heitsprobleme lassen sich seit PHP 4 mittels teien bei jedem Zugriff vom WWW-Server
(safe_mode_protected_env_vars). Stan- variables_order und register_globals sowie ausgewertet werden:
dardmäßig ist hier die Variable LD_LI- einer entsprechenden Skriptprogrammie-
BRARY_PATH eingestellt, sodass damit rung in den Griff kriegen. Jedoch werden php_flag asp_tags On
kein Schindluder getrieben werden kann. die meisten Skripte wohl noch nicht mit den
Daneben gibt es noch weitere Optio- sicheren Einstellungen zusammenarbeiten, In einem Verzeichnis, das eine Datei
nen, um die Farben für das Syntaxhighligh- da dann z.B. auf Umgebungsvariablen kon- .htaccess des obigen Inhalts enthält, wer-
ting von PHP einzustellen (highlight.) oder sequent mittels getenv() zugegriffen wer- den ASP-artige Einführungszeichen erwar-
aber um einzustellen, ob der WWW-Server den müsste. tet, d.h. <% und %> umschließen den PHP-
bekannt gibt, dass PHP mitläuft Unter Unix ebenso wie unter Windows Code. Die Syntax hierbei ist php_name
(expose_php). ist es möglich, zur Laufzeit weitere dynami- value zum Setzen der Variablen name auf
Wiederum eher der Fehlersuche sind sche Bibliotheken zu laden, die bei der Kon- den Wert value. Man beachte, dass hierbei
die Einstellungen error_reporting und die figuration von PHP mittels shared angege- keine „=“-Zeichen zu setzen sind, wie in
der näheren Umgebung zuzuordnen. Zu ben werden. Zum einen können diese der Datei [Link]. Weiterhin zu beachten
Debuggingzwecken ist es sinnvoll, alle Feh- Module mittels z.B. extension=php_gd.so ist, dass der WWW-Server das Verändern
ler und Warnungen melden zu lassen (er- direkt beim Start von PHP geladen werden, von Einstellungen in der .htaccess zulassen
ror_reporting = E_ALL) und diese Mel- zum anderen dynamisch zur Laufzeit muss, d.h. AllowOverride darf für dieses
dungen auch an den Client schicken zu mittels der Funktion dl. Allerdings muss ei- Verzeichnis nicht auf none gesetzt sein.
lassen (display_errors=on). Im Produk- ne solche dynamische Bibliothek auch vor
tionseinsatz jedoch wird man display_er- der ersten verwendeten Funktion geladen Fazit
rors=off setzen und Fehlermeldungen statt werden, weil anderweitig PHP einen Fehler Damit ist die harte Arbeit geschafft. PHP ist
dessen an einen anderen Ort loggen lassen über die nicht gefundene Funktion melden installiert und konfiguriert, alle Optionen
(log_errors=on). Hierbei kann über würde. Das Skript <?php phpinfo(); sind betrachtet und entsprechend einge-
error_log= eingestellt werden, ob in eine dl(„[Link]“); phpinfo();?> zeigt diesen Ef- stellt worden. Nun kann mit der Skript-
Datei oder zum syslog-Dämon zu loggen fekt recht schön, falls —with-gd=shared erstellung in PHP begonnen werden, wobei
ist. bei configure angegeben wurde. sicherlich ab und zu ein Blick in die diversen
PHP registriert in der Standardeinstel- Nach Vereinbarung aller Module ist es Hilfsdokumente, das Handbuch oder das
lung automatisch alle Variablen aus GET, des weiteren möglich, bestimmte Einstel- FAQ die Arbeit erleichtern werden. Falls
POST und Umgebung als globale Varia- lungen der dynamisch geladenen Bibliothe- selbst die Dokumentation nicht weiterhilft,
blen. Dies ist für den Programmierer zu- ken wie z.B. MySQL oder Ingres zu beein- hilft meist ein Blick auf das von PHP-Benut-
nächst sehr einfach, da diese Variablen oh- flussen, auf die hier jedoch nicht mehr zern selbst kommentierte Handbuch auf
ne besondere Erklärungen wie global oder eingegangen wird. Hierbei wird eine Win- den offiziellen PHP-WWW-Seiten.
den Zugriff über das Array $GLOBALS dows-INI-File ähnliche Beschreibung ver- Dr. Andreas Stübinger ist Senior Engi-
direkt zugreifbar sind. Jedoch hat diese Me- wendet, d.h. innerhalb einer Sektion, die neer bei der Corporate Technology der Sie-
daille eine zweite, nicht so schöne Seite: Der mittels eckigen Klammern [] eingeführt mens AG in München und beschäftigt sich
Mechanismus kann missbraucht werden. wird, können die verschiedenen Optionen mit Graph Drawing und diskreter Opti-
Folgender kleiner Aufruf zeigt ein Problem gesetzt werden. mierung. Er kann per eMail über
bei älteren Versionen von PHP, die davon [Link]@[Link] er-
ausgingen, dass die Variable HTTP_ Konfiguration ohne [Link] reicht werden.
GET_VARS ein Array ist: PHP-betreffende Einstellungen können
nicht nur über die Datei [Link] getroffen
<a href=“call_phpinfo.php?HTTP_GET_VARS=1“> werden, sondern auch über die Konfigura-
tionsdateien des WWW-Servers selbst, also Links
Die erste Anlaufstelle sollte immer [Link]
Damit ist die Variable $HTTP_ GET_ in der [Link]- und den .htaccess-Da-
sein. Neben den aktuellsten Sourcen – eine voll-
VARS kein Array mehr, sondern eine einfa- teien in den einzelnen Verzeichnissen mit ständige Benutzerdokumentation in Form von
che Variable und die Funktion phpinfo hat- HTML-Seiten. In letzterem Fall können Handbuch und FAQ – findet sich hier auch das
te ein Problem. Ein anderes Problem stellen damit für unterschiedliche Verzeichnisse schon erwähnte von PHP-Benutzern kommentier-
nicht initialisierte Variablen dar, die von auch unterschiedliche PHP-Einstellungen te Handbuch. Hier findet sich immer wieder der ein
PHP normalerweise mit 0 initialisiert wer- getroffen werden. Man wird z.B. für Pro- oder andere Tipp, der aus der Dokumentation
den. Falls nun eine solche Variable beim duktionsverzeichnisse andere Einstellun- selbst nicht hervorgeht. Ebenfalls gute Hilfe liefert
Aufruf des Skripts als GET-Parameter mit gen treffen als für Verzeichnisse, in denen die Newsgroup [Link], das deutsche
einem anderen Wert durch direkte Überga- noch getestet wird. Zudem muss bei Ände- FAQ ist unter [Link]/php/ zu finden.
Auch die im Text angesprochene modularisierte
be gesetzt wird, so sind die Probleme meist rungen in der .htaccess der WWW-Server
Version von PHP gibt es schon vorübersetzt unter
nicht sofort sichtbar, jedoch schnell erklär- nicht neu gestartet werden, damit die Ände-
[Link]
bar, so man sie gefunden hat. Diese Sicher- rungen wirksam werden, weil diese Da-

24 Linux Enterprise Special PHP


LE_PHP (25-34) 23.08.2001 10:20 Uhr Seite 25

Enterprise Tools Tools & Tipps


Zur ZendEngine gesellt sich nun ein
weiteres kostenloses Produkt aus dem
Hause Zend: Der ZendOptimizer
([Link]/store/products/zend-
[Link]). Dieser ergänzt den für die
Kompilierung zuständigen Teil der Zend-
Engine um Schritte zur Optimierung des
Bytecodes. So optimiert der ZendOptimi-
zer nicht nur Funktionsaufrufe und einige
PHP-Sprachelemente, sondern ersetzt
zum Beispiel Operationen durch schnelle-
re Alternativen ($i++ durch ++$i) oder re-
duziert $i=1; $i=2; zu $i=2.
Zu beachten ist, dass unter Verwen-
dung des ZendOptimizers die Perfor-
mance bei PHP-Skripten mit kurzen
Laufzeiten durch die nötige Mehrarbeit
im Kompilierungsschritt eher vermin-
dert als gesteigert wird. Den meisten
Nutzen bringt der ZendOptimizer daher
bei lang laufenden Applikationen oder in

PHP goes
Verbindung mit dem ZendCache, da hier
der Kompilierungsschritt nur einmalig
ausgeführt wird. Im Gegensatz zur Zend
Engine ist der ZendOptimizer, ebenso
wie die nachfolgenden kommerziellen

Enterprise Produkte, nicht im Sourcecode verfüg-


bar.
Der ZendCache ([Link]/
store/products/[Link]) behebt
ein grundlegendes Problem der ZendEn-
von Sebastian Bergmann gine: Nach der Ausführung des Skriptes
wird der erstellte Bytecode „weggewor-
Die PHP Tools von Zend Technologies fen“. Hier setzt der ZendCache an: Er
hält für jedes angeforderte Skript eine
Kopie des Bytecodes im Speicher und er-
spart der ZendEngine so das zeitkritische
Übersetzen der Quelltexte. Dieses Ca-
chen des Bytecodes hat eine Reduzierung
der CPU Belastung des Servers zur Folge,
ferner wird die Anzahl der Festplattenzu-
griffe vermindert. Für den Betreiber des
Web-Servers bedeutet dies, dass er auf
Die israelische Firma Zend Technologies hat An- Seit der Veröffentlichung von PHP 4.0.0 der gleichen Hardware bis zu zehn Mal
fang 2001 eine Reihe von kommerziellen Pro- im Mai 2000 bildet die von den Zend mehr Anfragen gleichzeitig bearbeiten
Gründern Andi Gutmans und Zeev Suras- kann, als ohne den ZendCache. Eine Li-
dukten rund um die server-seitig ausgeführte ki entwickelte ZendEngine den Kern von zenz für den ZendCache kostet zwischen
Skriptsprache PHP auf den Markt [Link] PHP, der die Quelltexte zunächst kompi- 1.500 US-Dollar (1 Intel CPU) und 7.000
diesem Artikel werden die einzelnen Produkte liert und den aus diesem Schritt resultie- US-Dollar (4 Sparc CPUs). Seit dem Li-
vorgestellt und – sofern vorhanden – mit Open renden Bytecode anschließend ausführt. nuxTag 2001 gibt es eine spezielle Ver-
(Siehe hierzu den Artikel „Hallo PHP!“; sion des ZendCache für Massenhoster:
Source Konkurrenzprodukten verglichen. Linux Enterprise vom November 2000) den Zend Cache Shared Server. Dieser
Die ZendEngine ist unter der Q Public Li- kann für jeden Virtual Host individuell
cense (QPL) der PHP-Gemeinde als Open konfiguriert – natürlich auch ein- bzw.
Source zur Verfügung gestellt worden. ausgeschaltet – werden.

Linux Enterprise Special PHP 25


LE_PHP (25-34) 23.08.2001 10:20 Uhr Seite 26

Tools & Tipps Enterprise Tools


Abb. 1: Benchmark der ver-
schiedenen Caches

Zum ZendCache existieren zwei Open darunter auch eine Klasse zur Daten- dass der Server mit ZendCache eine Load
Source Software Alternativen: Der Alter- bankabstraktion sowie eine Template von ungefähr drei erreicht, was dem
native PHP-Cache (APC, [Link] Engine. durchschnittlichen Wert von Produk-
[Link]/) und der afterBUR- Während des Benchmarks wurde der tionsservern entspricht. Getestet wurden
NER Cache ([Link] it/). Server (Intel Pentium III 500 MHz, 256 die Versionen bware afterBURNER Ca-
Die nachstehende Grafik zeigt das Ergeb- MB Ram, SuSE 7.1, Linux Kernel 2.4.2, che 0.7, APC 1.0.8, sowohl in der mmap-
nis eines Benchmarks, in dem die drei ge- Apache 1.3.17, PHP 4.0.4pl1 und dem je- als auch in der Shared Memory-Variante
nannten PHP Caching-Systeme miteinan- weils getesteten Caching System) in 100 und der ZendCache 1.0.0.
der verglichen worden sind. Für diesen Durchläufen mit insgesamt 10.000 Anfra- PHP-Entwickler, die ihren Kunden ei-
Benchmark kam zum einen die Web- gen beschickt, von denen jeweils zehn nen Blick auf den Quelltext ihrer Produkte
server-Benchmark Software httperf (www. gleichzeitig abgesetzt wurden. Zur Wahl nicht erlauben möchten, bekommen mit
[Link]/personal/David_Mos-berger/ der Testbedingungen: Bereits nach den dem ZendEncoder ([Link]/
[Link]) zum Einsatz, zum anderen ersten Tests zeichnete sich die klare Über- store/products/[Link]) nun ein
eine repräsentative PHP-Anwendung, legenheit des ZendCache ab. Daher wur- eigens für diese Aufgabe entwickeltes Hilfs-
die mehrere Bibliotheken inkludiert, den die httperf-Parameter so gewählt, mittel an die Hand. Mit Hilfe des ZendEn-
coders erzeugt man aus seinen PHP-Quell-
texten verschlüsselten Bytecode, den man
an seine Kunden ausliefern kann. Auf dem
Webserver des Kunden sorgt der ZendOp-
timizer (siehe oben) dafür, dass der ver-
schlüsselte Bytecode ausgeführt wird.
Eine Lizenz für den ZendEncoder Un-
limited kostet 2.400 US-Dollar.
Mit der ZendIDE ([Link]/
store/products/[Link]) stellt Zend
die erste kommerzielle, auf PHP zuge-
schnittene integrierte Entwicklungsum-
gebung (IDE) vor. Diese besteht aus zwei
Programmteilen: Zend DebugServer und
dem ZendIDE Client. Während sich der
DebugServer für den Entwickler „un-
sichtbar“ auf dem Server in die ZendEn-
gine integriert, arbeitet man mit dem in
Java geschriebenen ZendIDE Client
Abb. 2: PHP-
Debugging mit plattformunabhängig an seinen PHP
ZendIDE Projekten.

26 Linux Enterprise Special PHP


LE_PHP (25-34) 23.08.2001 10:20 Uhr Seite 27

Enterprise Tools Tools & Tipps


Das einzige richtige Highlight der rende PHP Distribution an. Den Preis, Dollar pro Jahr oder 50 US-Dollar pro
Zend IDE ist die Möglichkeit, seine PHP- den man für das „Zend-Gütesiegel“ be- Monat die nötigen Lizenzen für den Zend
Anwendungen debuggen zu können, was zahlt, sollte man allerdings nicht unter- Encoder Unlimited, die Zend IDE (1 Zend
vorher in dieser Art nicht möglich war. schätzen: Die Distribution enthält nur DebugServer, 2 ZendIDE Clients) und die
Auch was das Debugging betrifft, steht die PHP-Erweiterungen PCRE, MySQL, Services ZendLaunchpad und ZendSOS
das kommerzielle Zend Produkt mittler- PostgreSQL, Oracle 8, XML, WDDX, bekommt. Für die nicht-gewerbliche Nut-
weile in Konkurrenz zu anderen Lösun- LDAP, IMAP, GD und DB2. Entwickler, zung gibt es als Alternative dazu die Zend
gen: Der freie Debugger dbg (http:// die zum Beispiel mit einem Interbase- Non-Commercial Developer-Suite, bei
[Link]/dbg/) verrichtet seine Dienste oder MS SQL-Datenbankserver arbeiten der es für 50 US-Dollar im Jahr eine Zend
bereits unter Linux und Windows und oder XSL-Transformationen mit Sablo- IDE (1 Zend DebugServer, 1 ZendIDE
wurde bereits in zwei IDEs inte- tron durchführen möchten, können mit Client) und einmal das ZendLaunchpad
griert: PHPCoder ([Link]) und der PHP-Distribution des ZendLaunch- gibt.
PHPEd, der nun von NuSphere in pad nicht direkt etwas anfangen, sondern
einer kommerziellen Weiterentwicklung müssen sich die fehlenden Erweiterungen Fazit
([Link]/products/phpadv. selbst kompilieren. Und genau dieses Mit der Markteinführung der beschrie-
htm) zusammen mit dem Debugger ver- Selbstkompilieren von PHP und seinen benen kommerziellen Produkte und
trieben wird. Shane Caraveo, einer der Erweiterungen ist es, was Zend seinen Dienstleistungen rund um PHP wird die
PHP Core Developer, hat den PHP Debug- Kunden mit der Binärdistribution erspa- Position der Open Source Skriptsprache
ger für die Komodo IDE von ActiveState ren will. Neben der Binärdistribution im Markt gestärkt. Bei der in weiten Tei-
([Link]) entwickelt, die von PHP erhält man mit dem Launchpad len der IT-Wirtschaft noch vorhandenen
seit kurzem eben auch Unterstützung für Skepsis gegenüber OpenSource Software
PHP bietet. ist der Support durch eine Firma wie
In der Grafik sieht man, wie der Gestaffelte Zend nicht zu unterschätzen, wenn es da-
ZendIDE Client mit dem sich in die Zend- rum geht, ein Produkt wie PHP dauerhaft
Engine integrierendenZend DebugSer- Supportangebote im Markt zu etablieren.
ver kommuniziert. Ferner wird der Ab- Allerdings schien es im Frühjahr 2001
lauf einer Debugging Session dargestellt: so, als hätten sich PHP Community und
Über den Browser oder den ZendIDE noch einen Editor für die PHP-Konfigu- Zend entfremdet. Heftige Kritik an der
Client wird das zu debuggende PHP ration ([Link]) und ein Tool, um Bug Re- Produktpolitik von Zend wurde laut, als
Skript gestartet. Während die Ausgabe ports zu verfassen. zum Beispiel bekannt wurde, dass es den
des Skriptes wie gewohnt an den Browser Die Zend Support Online Services ZendDebugger zunächst nicht separat
gesendet wird, sendet der Zend Debug- (ZendSOS,[Link]/store/products/ von der – in den Augen Vieler unbrauch-
Server die benötigten Debugging Infor- [Link]) bieten technischen Sup- baren – ZendIDE geben sollte. Trotz der
mationen an den ZendIDE Client. port rund um PHP und die Zend-Produk- wiederholten Forderung nach einem se-
Das ZendIDE-Paket liegt derzeit in te. Der Kunde kauft hierzu eine bestimmte paraten Debugger zur Integration in an-
der Version 2.0 vor, gegenüber den ersten Anzahl an Tickets, wobei mit jedem Ticket dere Umgebungen als die der ZendIDE
Versionen wurde der dringend nötige später eine Supportanfrage bezahlt wer- wurde ein solches Produkt lange Zeit ab-
Feinschliff vorgenommen. Jedoch ist den kann. Ein einzelnes Ticket kostet 180 gelehnt, und erst auf dem LinuxTag in
auch die aktuelle Version noch nicht als US-Dollar, 13 Tickets zum Beispiel 1.800 Stuttgart angekündigt. Vor allem aber
vollwertiges Werkzeug zu bezeichnen, da US-Dollar. wurde die Kommunikation zwischen
wichtige Features wie ein Klassen- und Die Zend Consulting-Services gehen Zend als kommerziellem Arm der PHP-
Funktions-Browser, sowie die Integra- noch einen Schritt weiter. Bei diesem Servi- Bewegung und den anderen PHP-Ent-
tion von CVS fehlen. Das hierfür nötige ceangebot von Zend erlangt man – gegen wicklern sowie der Basis von PHP-Nut-
Fundament ist aber gelegt und die Chan- eine entsprechende Gebühr, über deren zern bemängelt. Diese Kommunikation
cen stehen gut, dass die ZendIDE im Lau- Höhe sich die Website aber ausschweigt – hat sich aber im Gegensatz zu früher deut-
fe der Zeit zu einem mächtigen Werkzeug Zugriff auf eine Palette von Dienstleistun- lich gebessert, was vor allem der Arbeit
heranreift. Eine Lizenz für einen Zend- gen, die von Schulungsangeboten über die von Daniel Grossmann zu verdanken ist.
Debug-Server und einen ZendIDE-Client Hilfe bei der Projektplanung bis hin zur Herr Grossmann ist bei Zend als Business
kostet 250 US-Dollar, jede weitere Zend- Optimierung von PHP-Applikationen Development Manager für den deutschen
IDE Client-Lizenz schlägt mit weiteren reicht. Markt verantwortlich und hat sich wäh-
120 US-Dollar zu Buche. Bei der ZendSuite handelt es sich um rend der letzten Monate auf mehreren
Mit dem ZendLaunchpad (www. ein gestaffeltes Softwareabonnement. Für PHP-Usergroup-Treffen sowie in Gesprä-
[Link]/store/products/zend-launchpad. den kommerziellen Bereich bietet Zend chen mit Firmen ein Bild vom deutschen
php) bietet Zend eine qualitätsgeprüfte, hierbei die Zend Developer Server-Suite Markt und den Produktwünschen hierzu-
vorkompilierte und einfach zu installie- an, bei der man für wahlweise 600 US- lande machen können.

Linux Enterprise Special PHP 27


LE_PHP (25-34) 23.08.2001 10:20 Uhr Seite 28

Tools & Tipps Websites, Tools, Editoren


Profis nicht merken können, weil es ver-
einzelte Brüche in der API von PHP-Ex-
tensions gibt. Ist eine Funktion so neu,
dass noch keine Dokumentation vorhan-
den ist oder selbige vergessen wurde, dann
hilft [Link]/
php weiter, dessen Übersichten durch
Skripte erzeugt werden, die den PHP-
Sourcecode durchsuchen.
Diejenigen, die auch ohne Mailinglis-
ten das Mailaufkommen kaum bewälti-
gen können, werden sich sehr über den
Newsserver [Link] freuen,
der alle Mailinglisten führt. Leider ist es je-
doch nicht möglich, auf diesem Wege an
den Diskussionen aktiv teilzunehmen: Es
können keine Nachrichten zum Server ge-
sandt werden.
Im englischen Sprachraum geht es wei-
ter zu [Link], der Firma, die mit
der „Zend Engine“ den Sprachkern von
PHP 4 stellt. „Zend“ ist ein Kunstwort,
das aus den Anfangsbuchstaben der Na-
men von „Zeev Suraski“ und „Andi Gut-

Websites, Tools mans“ gebildet wurde. Beide gehören zu


den Core Developern der Sprache. Ihre
Firma bildet einen für die strategische Ent-
wicklung von PHP wichtigen Angelpunkt,

und Editoren
der die PHP-Community stützen möchte
und professionellen Anwendern ebensol-
chen Support zukommen lassen will. Auf
der Website finden sich neben guten Tuto-
rials, Foren und News auch die Produkte
von Ulf Wendel Zend Cache und Zend IDE. Wie bereits in
einer früheren Ausgabe diskutiert, kann
der Einsatz des kommerziellen Zend Ca-
Die besten Quellen rund um PHP che dramatische Geschwindigkeitssteige-
rungen bewirken.
Wer Tutorials sucht, ist mit
[Link] gut bedient. Regel-
mäßig tauschen Entwickler ihre Gedanken
und Erfahrungen aus und präsentieren ne-
ben hilfreichen Tipps auch mal Irrwege,
Vor vier Jahren bestand noch keine Gefahr, Die Reise durch den Hyperspace startet aber der Lerneffekt ist garantiert.
stets auf der Homepage von PHP, In Deutschland bilden [Link]-
dass beim Ausdruck des PHP-Manuals die Tin-
[Link]. Quelltexte, Downloads, [Link] und [Link] die
tenpatrone ersetzt werden [Link] weni- Manual, Mailinglisten, Bücherliste und interessantesten Portale. Beide sind voll-
gen Zentimetern Papier stoppte der Drucker, alles was das Herz begehrt, befindet sich wertige Portale mit allerlei Informationen
und ein Abend reichte aus, um sich einen auf diesem Eintrittspunkt in die PHP- von News über Installationstutorials bis
Welt. Einsteiger wie Profis freuen sich hin zu Skriptsammlungen. Das PHP-Cen-
Überblick über das Material zu verschaffen.
gleichermaßen über die Möglichkeit, ter bietet zusätzlich noch Links zur größ-
Wer heute [Link] nach „PHP“ be- durch Anwahl der URL [Link]/ ten deutschsprachigen Mailingliste und
fragt, braucht viele Tintenpatronen:„Resultate strstr automatisch zur Manualseite der zum PHP-Kongress [Link] [Link].
1 - 10 von ungefähr 18,000,000“. Funktion strstr() geleitet zu werden, des- Über eine besonders aktive und hilfs-
sen Parameter-Reihenfolge sich selbst bereite Nutzergemeinde verfügt die

28 Linux Enterprise Special PHP


Anzeige
LE_PHP (25-34) 23.08.2001 10:20 Uhr Seite 30

Tools & Tipps Websites, Tools, Editoren


einzubinden. Dies hat den Vorteil, dass bei Editoren Bücher setzen grundlegende Program-
einer Anfrage an den Webserver nicht erst Auf ebensolchen wackeligen Füßen steht mierkenntnisse voraus. Klassiker für Ein-
ein externes Programm gestartet werden auch die Integration des Debuggers in den steiger kommen von Markt&Technik – so
muss, sondern der in den Webserver einge- PHP-Coder (Win32), der unter [Link]- „Mit „PHP 4 Dynamische Webauftritte
bundene PHP-Interpreter die Anfrage be- [Link] zum kostenlosen Download bereit- professionell realisieren“, geschrieben
arbeiten kann. Ein Modul ist zwar schnel- liegt. Das Programm hat seit seiner ersten von Egon Schmid et. Al., der die offizielle
ler als ein CGI-Aufruf, aber bei einem Version rapide Fortschritte gemacht und PHP Dokumentation betreut. Das Werk
Modul werden die PHP-Skripte mit den ist zu einer Bereicherung geworden. Den deckt von der Sprachreferenz über einfüh-
Benutzerrechten des Webservers ausge- Autoren gelingt es immer besser, eine voll- rende Kapitel zu einzelnen Features bis hin
führt. Dies ist bei Mehrbenutzerumge- wertige Integrierte Entwicklungsumge- zur Diskussion des internen Aufbaus von
bungen, wie beim Hosting üblich, nicht bung (IDE) aufzubauen. Beispielsweise er- PHP ein weites Themenfeld ab. Jörg Krau-
wünschenswert. leichtert ein Klassenbrowser den se schrieb ebenfalls sehr früh einen Best-
Klassisch ist eine LAMP-Umgebung Überblick über unbekannte Sourcen, in- seller, dessen aktuelle Auflage den Titel
für PHP (Linux, Apache – [Link]. dem alle eingebundenen Files, Variablen „PHP 4. Grundlagen und Profiwissen“
org, MySQL – [Link], PHP), und Funktionen in einer Baumstruktur trägt. Auf 1168 Seiten beleuchtet das
die etwa unter [Link]/lamp-tuto- dargestellt werden. Der Editorteil lässt je- Werk nicht nur PHP Grundlagen, son-
[Link] beschrieben ist. Wer unter Win- doch noch kleine Wünsche offen, die den dern vermittelt Einsteigern auch elemen-
dows arbeitet und den Personal Webser- Einsatz im Tagesbetrieb erschweren, so tares Grundlagenwissen über MySQL,
ver von Microsoft bevorzugt, der wird fehlt eine Option zur Speicherung im Unix HTTP, SMTP und verwandte Technolo-
auf der Seite [Link]/php/ gien, ohne deren Kenntnis ein tiefes Ver-
[Link] durch die notwendigen Schrit- ständnis der Anwendungsentwicklung
te geleitet. Die Installation für den Micro- mit PHP nicht möglich ist. Abgeschlossen
soft Internet Information Server sowie
Unix-Anwender wird das Buch mit einer Referenz, die es –
den schlanken Omni HTTPd ist unter wie bei so vielen Büchern – unter
[Link]/php/install-
bleiben beim Emacs [Link] stets etwas aktueller und
[Link] dargestellt. vor allem mit hilfreichen Nutzerkom-
mentaren versehen gibt.
Debugger Dateiformat. Vielleicht gewinnt auch der Fortgeschrittene greifen beim ersten
Zum kommerziellen Debugger von Zend, ähnlich mächtige PHPEd [Link]. Kontakt gerne zur PHP-Pocket Referenz
der nicht als Kommandozeilentool ver- com/PHPEd/ das Rennen um die beste „PHP kurz & gut“ aus dem Hause O’R-
fügbar ist, sondern nur in Verbindung mit freie IDE. eilly. Die kleine, praxisgerechte Referenz
der in Java geschriebenen Zend IDE, gibt Beliebt unter Windows ist außerdem wurde von Rasmus Lerdorf, dem Erfin-
es Open Source-Alternativen. Nexidion die Homesite von Allaire ([Link]. den von PHP verfasst, ist jedoch leider
([Link]/, inklusive Profiler) com), die mit Highlighting und Online- veraltet (PHP 3). Bereits herausgestellt
zählte zu den ersten, viele Anwender Hilfe aufwartet. Ebenfalls beliebt sind wurde das Buch „Webanwendungen mit
scheiterten jedoch schon beim Installa- Weaverslave ([Link]), für PHP 4.0 entwickeln“, erschienen im Ad-
tionsversuch. Offensichtlich eine Anre- den eine Debugger-Integration in Aussicht dison-Wesley Verlag. Mit diesem Werk ist
gung für Downunder, einen Gegenpunkt gestellt wurde, und Klassiker wie Ultra- es Tobias Ratschiller und Till Gerken ge-
zu setzen mit [Link] edit ([Link]). Für die unver- lungen, in die Besonderheiten von We-
[Link]/~djf01/[Link], aber der russi- besserlichen Mäuseschupser gibt es bapplikationen einzuführen und Soft-
sche Bär konterte gewaltig mit http:// Dreamweaver ab der Version 3 auf waretechniken vorzustellen, die so
[Link]/dbg/. Zunächst nur in Verbin- [Link]. manchem langjährigem Entwickler unbe-
dung mit dem Microsoft Visual Studio Unix-Anhänger bleiben bei den kannt sind.
lauffähig, fanden sich schnell Editoren, die alten Bekannten und vertrauen auf Emacs Tiefergehendes Wissen zur MySQL
das Produkt über die COM Schnittstelle ([Link]) oder Xemacs (www. Datenbank vermittelt Paul DuBois, einer
integrierten. Mit der kommenden Version [Link]) mit PHP-Modus (http:// der Väter des Datenbanksystems, im Buch
2 wird es endlich auch Kdevelop berei- [Link]/turadg/software/[Link]) „MySQL – new technology“, das bei
chern. Der Vorgeschmack, den Windows- und Vim ([Link]). Markt&Technik erschienen ist. Das Buch
nutzer gewinnen konnten, ist exzellent. Es vermag zwar kein Grundlagenwerk über
sind alle klassischen Features wie Breakpo- PHP lernen Relationale Datenbanken zu ersetzen,
ints und die Möglichkeit, Variableninhalte Wer alle bisher genannten URLs besucht deckt jedoch alles vom einfachen SQL Sta-
einzusehen, enthalten. Einzig die Stabilität hat, hat einen reichhaltigen Fundus ange- tement bis hin zum Verfassen von eigenen
der Integration in manch einen Editor lässt sammelt, verfügt jedoch noch über keiner- Prozeduren für MySQL ab. Wer es etwas
noch zu wünschen übrig, was jedoch nicht lei Kenntnisse der Sprache selbst. Prak- ruhiger angehen lassen möchte, der liest
am Debugger selbst liegen soll. tisch alle auf dem Markt befindlichen die Tutorials von [Link].

30 Linux Enterprise Special PHP


LE_PHP (25-34) 23.08.2001 10:20 Uhr Seite 31

Bücher Tools & Tipps


zepte für die Entwicklung von Web An- grammiersprachen bereits vertraut sind,
PHP 4, Grundlagen wendungen, Datenbankdesign und SQL der Einstieg in die Programmierung mit
Grundlagen und die Verwendung von re- PHP erleichtert wird. Die dem Buch bei-
und Lösungen gulären Ausdrücken zur Analyse und gelegte CD enthält recht aktuelle Versio-
Jörg Krause Verarbeitung von Texten. Nach einer all- nen der besprochenen Software (unter
gemeinen Einführung in PHP, in welcher anderem Apache, PHP und MySQL), alle
„PHP 4, Grundlagen und Lösungen“ von der Leser lernt, PHP zu installieren und Beispiele des Buches in übersichtlicher
Jörg Krause ist der Nachfolger zu einem zu konfigurieren sowie einfache, erste Form sowie das Buch selbst und die Refe-
der ersten deutschsprachigen Skripts zu schreiben, werden renz als durchsuchbare PDF Dateien.
Bücher zum Thema PHP. Lan- mit zahlreichen kleineren Bei- Bei einem Buch mit fast 1.200 Seiten
ge erwartet, erschien die neue spielen und größeren Projekten bleiben leider auch Fehler nicht aus. Die-
Fassung des Krause-Buches die unterschiedlichsten Aspekte se beschränken sich jedoch meist auf
im November 2000. der Entwicklung mit PHP be- Rechtschreib- bzw. Tippfehler. Kleinere
Das vorliegende Buch rich- leuchtet. Hierzu gehören unter inhaltliche Fehler, wie zum Beispiel $this-
tet sich ausdrücklich nicht an anderem Beispiele zum Zugriff >$class_name anstelle von $this->class_
„Hardcore Programmierer“, auf LDAP-, Mail- und News- name werden auch einem PHP Einsteiger
die sich schon gut bis sehr gut Server und die Entwicklung ei- ziemlich schnell auffallen und dadurch
mit PHP als Programmier- nes universellen Shopsystems. ungefährlich werden. Diese kleinen
sprache oder der Entwicklung Darüber hinaus werden einige Mängel können den aber sonst positiven
von Web Applikationen im Allgemeinen Softwarepakete, wie phpMyAdmin oder Eindruck des Buches nicht trüben. Wer
auskennen. Der Autor setzt für die Lektü- die PHPLIB, mit denen sich jeder PHP Ent- ein umfassendes Werk zur Einführung in
re seines Buches lediglich grundlegende wickler früher oder später auseinander die Programmierung mit PHP sucht, soll-
Kenntnisse wie HTML sowie Wissen setzen sollte, besprochen. Ferner be- te sich dieses Buch zulegen.
über das verwendete Betriebssystem vor- spricht der Autor Strategien und Lösun- Sebastian Bergmann
aus. Die Zielgruppe bilden also vornehm- gen, um die Entwicklung von mittleren bis
lich HTML Designer, die sich Kenntnisse großen Projekten in Teams zu organisie-
der Programmierung von dynamischen, ren, unter anderem wird die Einrichtung
datenbankgestützten Websites aneignen und Benutzung einer CVS (Concurrent Jörg Krause
möchten. Versions System) Umgebung ausführlich
PHP 4 – Grundlagen und Lösungen
Inhalt und Aufbau des Buches werden besprochen.
Carl Hanser Verlag, 2000
der Zielgruppe gerecht. Dem Leser werden Für Umsteiger von VBScript oder Perl
nicht nur Kenntnisse in Bezug auf PHP ver- dürfte die Cross-Referenz von Interesse 1.168 Seiten; DM 98,-

mittelt, sondern unter anderem auch Kon- sein, da Entwicklern, die mit diesen Pro- ISBN: 3-4462-1546-8

Beispiel „PHP 4 – Grundlagen und Profi-


PHP 4 – Die Referenz wissen“ desselben Autors, besser beraten.
Ebenso sollten sich Besitzer des anderen
Jörg Krause
Krause-Buches gut überlegen, ob sie wegen
Rechtzeitig zum Release von PHP 4.0.5 nis ein. In diesem lässt sich eine gesuchte der relativ wenigen Änderungen den Refe-
steht ein neues Buch von Jörg Krause in Funktion schnell finden. Im Hauptteil renzteil als gesondertes Buch kaufen wol-
den Regalen, das als Referenz- geht der Autor auf alle in der len. Interessant ist dieses Buch meiner Mei-
werk für diese neue Version der Version 4.0.5 vorhandenen nung nach für die Entwickler, die ihren
beliebten Programmiersprache Funktionen von PHP ein. Die Einstieg in die Materie von PHP schon ge-
dienen soll. Art der Vorstellung der einzel- schafft haben und, anstelle des hervorra-
Für sein neuestes Werk hat nen Funktionen ist hierbei ähn- genden offiziellen Manuals von PHP, lie-
der Autor den Referenzteil aus lich der Herangehensweise im ber eine Funktionsreferenz in Händen
seinem Buch „PHP 4 – Grund- PHP Manual: Prototyp, Kurz- halten wollen.
lagen und Profiwissen“ in ein beschreibung und Beispiel. Die Sebastian Bergmann
eigenes Buch ausgelagert und Beispiele führen hierbei kurz
die Funktionsbeschreibungen und bündig in die Thematik der
Jörg Krause
auf den Stand von PHP 4.0.5 jeweils besprochenen Funk-
PHP 4 – Die Referenz
gebracht. tion oder Familie von Funktionen ein.
Hanser Verlag, 2001
Die ersten 80 Seiten des insgesamt et- Für wen lohnt sich der Kauf dieses Bu-
was über 600 Seiten starken Buches ches? Nun, Einsteiger sind mit einem 624 Seiten, DM 69,-
nimmt das ausführliche Inhaltsverzeich- „richtigen“ einführenden Werk, wie zum ISBN 3-446-21687-1

Linux Enterprise Special PHP 31


LE_PHP (25-34) 23.08.2001 10:21 Uhr Seite 32

Tools & Tipps Bücher


PHP – kurz & gut
Rasmus Lerdorf, Übersetzung von Ingo Marks

Dieses Buch widmet sich der derzeit sehr die kurz und knapp die jeweiligen Funk- tionen kurz und gut dargestellt werden.
beliebten Open Source Skriptsprache tionen der einzelnen Sparten, wie bei- Das Buch richtet sich nicht an Anfänger
namens PHP. Die Sprache PHP, die Ab- spielsweise HTTP, Stringoperationen oder Neueinsteiger, da es nicht das Ziel
kürzung steht für Hypertext oder Grafik beschreibt. ist, dem Lesenden die Programmierung
Preprocessor, wird in erster Zu jeder Sparte gibt es mit PHP zu vermitteln. Das Buch sollte
Linie zur Erstellung dynami- außerdem noch eine kom- trotz dessen auf keinem PHP-Program-
scher Webseiten verwendet. pakte Beschreibung, die mierer-Schreibtisch fehlen, da es zu ei-
Das Buch geht im ersten Ka- das entsprechende An- nem günstigen Preis eine nützliche Hil-
pitel auf die Installation und wendungsgebiet kurz zu- festellung zur täglichen Arbeit mit PHP
Konfiguration von PHP ein, sammenfasst. Die Funk- leisten kann.
wobei die verschiedenen tionsreferenz ist nicht Jens Gräfe
Möglichkeiten der Platt- alphabetisch geordnet,
formintegration kurz ge- sondern baut sich nach
nannt werden. Weiterhin den bestehenden Funk-
werden grundsätzliche Infor- tionsklassen auf. Diese
Rasmus Lerdorf,
mationen über Variablen, Datentypen Tatsache ist zu bemängeln, da das Auffin- deutsche Übersetzung von Ingo Marks
und Ausdrücke sowie Kontrollstruktu- den der gewünschten Funktion unter Um-
PHP – kurz & gut
ren und Funktionen übersichtlich erläu- ständen erheblich erschwert wird.
O’Reilly Verlag, 2000
tert. Prinzipiell ist das Buch als Funk-
Die weiteren Kapitel bestehen aus- tionsreferenz und Nachschlagewerk 112 Seiten, DM 14,80

schließlich aus einer Funktionsreferenz, sehr interessant, da die gesuchten Funk- ISBN 3-89721-225-0

Office und Shop, bei denen dem Leser ches Diagramm auf, bei dem von der
PHP 4, Tutorial und weitreichende Kenntnisse der fortge- Rechtschreibprüfung des verwendeten

Referenz schrittenen Programmierung mit PHP


vermittelt werden. Das zuvor vermittelte
Programms ihr unbekannte Wörter als
fehlerhaft markiert und unterschlängelt
Klaus Schmidt Wissen über den Zugriff auf Datenban- sind. So manchen Leser werden auch die
ken und Mail-Server sowie die Verwen- Browser Screenshots verwirren, in denen
Das über 800 Seiten starke Buch von dung von Sessions werden hier in prakti- beispielsweise Framesets dargestellt wer-
Klaus Schmidt richtet sich an HTML De- schen Beispielen vertieft, wobei die den, in denen nur in einem Frame die
signer, die über keine oder nur sehr wenige unterschiedlichen Aspekte der Web Pro- Ausgabe des besprochenen Beispiels zu
Kenntnisse in einer Program- grammierung in ihrem Zu- sehen ist, in den anderen Frames aller-
miersprache verfügen und nun sammenspiel gezeigt werden. dings HTTP 404 (Dokument nicht ge-
über PHP den Einstieg in die Leider ist die Anzahl der funden) Fehlermeldungen zu sehen sind.
Programmierung von dynami- vorhandenen Fehler groß ge- Einen Kauf der hier beschriebenen er-
schen Internetseiten finden nug, um den ansonsten positi- sten Auflage des Buches sollte man sich
möchten. ven Eindruck, für den vor allem gut überlegen. Die aufgeführten Mängel
Wie man bereits dem Titel die Wahl der interessanten Bei- lassen sich alle in einer zweiten Auflage
entnehmen kann, lässt sich der spiele sorgt, zu trüben. Da wird beheben.
Inhalt des Buches in die Berei- zum Beispiel im Abschnit über Sebastian Bergmann
che Tutorial und Referenz JavaScript und PHP ständig Ja- Klaus Schmidt
unterteilen. Hierbei macht die va mit JavaScript verwechselt,
PHP 4. Tutorial und Referenz
Referenz mit fast 500 Seiten den größten da wird behauptet, mit der Einführung
C & L Verlag, 2000
Teil des Buches aus. Zu den Highlights des von PHP 4 könne man in Java geschriebe-
Buches gehören die Vorstellung und Dis- ne Quelltexte in PHP Anwendungen in- 832 Seiten, DM 98,-

kussion der beiden großen Projekte My- kludieren. Ebenfalls negativ fällt so man- ISBN 3932311795

32 Linux Enterprise Special PHP


LE_PHP (25-34) 23.08.2001 10:21 Uhr Seite 33

Bücher Tools & Tipps


PHP Developer’s Cookbook
Sterling Hughes

Inhaltsverzeichnis kann der Entwickler


nun nach seinem Problem suchen und fin-
det ein Rezept. Die Rezepte an sich sind in
drei Bereiche gegliedert: Problem, Lösung
und Diskussion. Im ersten Teil wird das
Problem betrachtet, danach wird eine Lö-
sung vorgestellt. Sucht der Leser wirklich
nur die Lösung für sein Problem, so kann er
an dieser Stelle bereits mit dem Lesen des
Rezeptes aufhören. Will er hingegen wis-
sen, wieso die Lösung so aussieht, wie sie
dargestellt wurde, so sollte er noch den
dritten Abschnitt des Rezepts lesen: die Di-
skussion. Gerade bei der Dis- kussion der
in den Rezepten vorgestellten Lösungen
werden dem Leser interessante Einblicke in
die Interna von PHP gewährt. Hier zeigt
sich auch die Kompetenz der beiden Auto- Anzeige
ren: Sie wissen nicht nur, wie etwas zu be-
Das „PHP Developer’s Cookbook“ von nutzen ist, sondern eben auch, wie es funk-
Sterling Hughes ist genau das, was der Titel tioniert – schließlich haben sie es entwickelt
verspricht: ein Kochbuch. Es richtet sich an oder zumindest mitentwickelt.
Entwickler, die bereits mit den Grundlagen Zu den Themenbereichen, in denen die
der PHP Programmierung vertraut sind. Rezepte kategorisiert sind, gehören unter
Sterling Hughes und sein Co-Autor anderem die Arbeit mit Arrays, Dateien
Andrei Zmievski sind in der PHP Gemein- und Strings, die Erzeugung und Verarbei-
de keine Unbekannten. So stammen die tung von anderen Formaten wie Bildern
bz2, cURL, Sablotron/XSLT, Sockets und und XML Dokumenten, der Zugriff auf
Shockwave Erweiterungen für PHP von Datenbanken, Mail-, LDAP- und SNMP-
Sterling Hughes, während Andrei Zmievs- Server sowie die Entwicklung von eigenen
ki Mitglied der PHP Group ist und unter Erweiterungen für PHP in C. Letztere wird
anderem die PHP 4 Interfaces für PCRE detailliert am Beispiel der von Sterling
(Perl Compatible Regular Expressions) Hughes geschriebenen cURL Erweiterung
und WDDX geschrieben und zusammen demonstriert.
mit Sascha Schumann das in PHP 4 inte- Erwähnenswert ist ferner, dass das
grierte Session Management entwickelt „PHP Developer’s Cookbook“ in Beispie-
hat. len auf Klassen des PHP Extension and
Die Autoren verzichten gänzlich auf ei- Add-On Repository (PEAR) zurückgreift,
ne Einführung in die Sprache an sich und wo dies Sinn macht. Das PEAR befindet
liefern mit ihrem Kochbuch eine wohlge- sich zurzeit noch im Aufbau, soll aber
ordnete Aneinanderreihung von Rezepten mittelfristig für PHP das bieten, was CPAN
für den täglichen Gebrauch. Dies führt da- und CTAN für Perl bzw. TeX bieten.
zu, dass man das Buch bei jedem Rezept Sebastian Bergmann
anfangen kann zu lesen, da die Rezepte in Sterling Hughes
sich abgeschlossene Einheiten darstellen. PHP Developer’s Cookbook
Die Arbeit mit dem Buch gestaltet sich MacMillan Publishing, 2000
für den Leser nun wie folgt: Am Anfang 528 Seiten, $ 39,99
steht das Problem, das es zu lösen gilt. Im ISBN 0-6723-1924-1
LE_PHP (25-34) 23.08.2001 10:21 Uhr Seite 34

Tools & Tipps Bücher


ten Kapitel des Buches widmen sich den

MySQL in 21 Tagen Themen Sicherheit, Administration und


Optimierung. Diese Kapitel vermitteln
allerdings höchstens erste Eindrücke
von dem, was machbar ist und worauf
mittels weiterführender Literatur aufge-
Mark Maslakowski baut werden kann. In den drei Anhängen
des Buches finden sich eine übersichtli-
che SQL- und Funktionenreferenz und
tel unterteilt, die dem Leser systematisch die Lösungen zu den Übungen der einzel-
Kenntnisse über die Open Source-Da- nen Kapitel. Ein umfangreiches Stich-
tenbank vermitteln sollen. Am Ende je- wortverzeichnis schließt das Buch
des Kapitels findet der Leser eine Zu- ab. Auf der beiliegenden CD-ROM fin-
sammenfassung und kann das Gelernte den sich knapp 600 MB an Zusatzsoft-
anhand von Fragen/Antworten und ware (z.B. Editoren, Administrations-
Übungen nochmals überprüfen bzw. Tools, Webbrowser, Perl, PHP), die
praktisch anwenden. Lösungs-Scripts zu den Aufgaben im
In den ersten beiden Kapiteln wer- Buch und der komplette Buchtext im
den grundlegende Informationen zu re- HTML-Format.
lationalen Datenbanksystemen gegeben Das Buch richtet sich in erster Linie
und die Installation der MySQL-Versio- an MySQL- und Datenbankeinsteiger.
nen unter Linux und Windows beschrie- Und genau diese Lesergruppe wird mit
ben. Leider findet man auf der dem Buch diesem Buch auch nicht schlecht bedient.
beiliegenden CD-ROM nur eine Beta- Professionelle Anwender werden in die-
Version für Windows, während für Li- sem Werk nichts oder nur wenig Neues
nux eine stabile Version zu finden ist. finden. Negativ fallen an dem Buch ei-
Generell gilt anzumerken, dass die mit- gentlich nur die unstrukturiert wirkende
gelieferten Versionen nicht dem aktuel- Kapitelaufteilung auf, die ein Nach-
len Stand entsprechen, jedoch im Buch schlagen erschwert, sowie einige Unsau-
darauf verwiesen wird, wo sie im Inter- berkeiten beim Satz des Buches. Bei-
net zu finden sind. Die folgenden fünf spielsweise wird an einer Stelle die Frage
Das relationale Datenbanksystem Kapitel behandeln dann anhand eines behandelt, was zu tun ist, wenn man das
MySQL erfreut sich bei Anwendern ei- konkreten Beispiels die theoretischen Kennwort des Datenbankadministra-
ner wachsenden Beliebtheit. Seine Leis- Vorüberlegungen, die mit dem Erstellen tors vergessen hat. Bei der Antwort feh-
tungsfähigkeit überzeugt bei vielen An- einer Datenbank einhergehen und da- len aber leider die benötigten Para-
forderungen und mittlerweile tritt es in rauf folgend das eigentliche Implemen- meterangaben bei dem Neustart des
ernsthafte Konkurrenz zu kommerziel- tieren der ersten Datenbank mit einer MySQL-Servers. Diese sind dem Seiten-
len Produkten wie beispielsweise dem ersten Tabelle. Hierbei wird u.a. auch umbruch an dieser Stelle zum Opfer ge-
Datenbankserver von Oracle. Eine der auf Begriffe wie Normalisierung und de- fallen. Positiv zu bewerten ist, dass auch
Stärken von MySQL liegt in der leichten ren erste drei Grade eingegangen. Leider die leider notwendige Theorie nicht zu
Administrierbarkeit und Bedienung, die werden diese Informationen nicht in ei- kurz kommt, die für sauberes Daten-
auch Datenbankeinsteiger in die Lage ner konsequenten Reihenfolge geliefert. bankdesign unerlässlich ist und das um-
versetzt, recht schnell erste Erfolge zu Beispielsweise wird das Erstellen und fangreiche, mitgelieferte Software-Pa-
verzeichnen. Genau an diese Zielgruppe Löschen einer Tabelle vor dem Anlegen ket, das auch die teilweise veralteten
richtet sich das Buch „MySQL in 21 Ta- der eigentlichen Datenbank beschrie- Versionen der MySQL-Server entschul-
gen“ von Mark Maslakowski aus dem ben. Die nächsten Kapitel befassen sich digt.
Münchner Markt und Technik-Verlag, mit den unterschiedlichen Methoden, Markus Hasenbein
das im Original im amerikanischen Ver- die MySQL-Datenbank zu befüllen, die
lag SAMS Publishing im Jahr 2000 er- gespeicherten Daten abzufragen und zu Mark Maslakowski
schienen ist. Die Buchreihe „... in 21 Ta- manipulieren. Infolgedessen werden die MySQL in 21 Tagen
gen“ erfreut sich schon seit mehreren unterschiedlichen Schnittstellen be-
Verlag Markt + Technik
Jahren mit unterschiedlichen Titeln und schrieben, mit denen der Zugriff auf die
m. CD-ROM
Themen bei vielen Computernutzern ei- Open Source-RDBMS auch über Inter-
ner großen Resonanz. Analog zum Titel net und Webbrowser realisiert werden 580 Seiten, DM 89,95

ist das 580 Seiten starke Buch in 21 Kapi- kann (z.B. ODBC, Perl, PHP). Die letz- ISBN 3-8272-5850-2

34 Linux Enterprise Special PHP


LE_PHP (35-46) 23.08.2001 10:34 Uhr Seite 35

Templates Development
Nachname <input type=“text“ name=“nachname“ value=“
<?php print $nachname; ?>“>
<p>
<input type=“submit“ value=“Namen speichern“>
</p>
</form>

Das Kontaktformular zählt zwar noch


zum Tagesgeschäft, aber es stellt nicht
mehr den Höhepunkt einer zeitgemäßen
Website dar, ein Online-Shop entspricht
schon eher dem aktuellen Kunden-
wunsch. Die Entwicklung eines ver-
gleichsweise komplexen Online-Shops
nimmt viel Zeit in Anspruch. Es rentiert
sich schnell, ein flexibles Basissystem zu
erstellen, welches den jeweiligen Anforde-
rungen entsprechend angepasst wird.
Jeder Kunde wird eigene Wünsche für

Zeit gewinnen
die Produktdarstellung haben.

Anforderungsanalyse
Das Szenario verlangt vom Programmie-
rer zwei Dinge:

mit Templates •Programmcode und HTML müssen


voneinander getrennt werden
•Das Design eines Artikels muss leicht
veränderbar sein

von Ulf Wendel Die erste Forderung ließe sich mit ei-
nem Layout-Manager erfüllen. Ein Lay-
out-Manager ist ein Objekt, welches über
Trennung von Layout und Code eine Grundregel zur Anordnung von dar-
zustellenden Elementen verfügt und an es
übergebene Elemente in einem Zielfor-
mat, z.B. HTML, darstellt. Eine einfache
Grundregel zur Darstellung von Elemen-
ten könnte lauten: Stelle jedes Element
zentriert in einer eigenen Zeile dar. Der In-
formatiker wäre mit einem solchen Ansatz
Es ist paradox:Templates und Template-Klassen In Version 2 trug PHP noch den Namen sehr zufrieden. Die erste Aufgabe ist er-
widersprechen einem der größten Vorteile von „PHP/FI“. FI steht für „Form Interpre- füllt, es steht kein HTML im Programm-
ter“. Durch die Einbindung von PHP in code, es entsteht ein HTML-Dokument,
PHP, der direkten Einbindung in HTML-Doku- das HTML-Formular gelingt es auch heu- und mit einem leicht veränderten Layout
mente, und dennoch sind sie [Link] treibt te noch, bei geringen Programmierkennt- Manager wäre gar PDF als Ausgabefor-
Programmierer dazu, sich mit fremden Skripten nissen eine interaktive Seite zu erstellen. mat möglich.
zu beschäftigen und ihre Programme zu ver- Das „PHP-Normalformular“, welches Leider droht dem Programmierer die
auf sich selbst verweist und die Formular- Kündigung, weil es trotz der raffinierten
langsamen? felder mit übermittelten Werten vorbe- Abstraktion nicht gelungen ist, die Dar-
legt, ist jedem Einsteiger bekannt. stellung von der Programmlogik zu tren-
nen. Der Grafiker des Kunden, welcher
<form action=“<?php print $PHP_SELF; ?>“ method=„post“> weder PHP noch HTML, sondern nur sei-
Vorname <input type=“text“ name=“vorname“ value=“ nen WYSIWYG-Editor beherrscht, ist mit
<?php print $vorname; ?>“><br> dem Layout unzufrieden und kann keine

Linux Enterprise Special PHP 35


LE_PHP (35-46) 23.08.2001 10:34 Uhr Seite 36

Development Templates
Änderung vornehmen. HTML-Templates Sie ähneln einem XSL Subset. Oft sind schwindigkeit der Templateklasse. Alle
bieten sich als Ausweg an. sie nicht als Open-Source verfügbar, Templateklassen müssen das Templatefile
sondern Teil eines kommerziellen Pro- laden und verwalten. Der Verwaltungs-
... dukts.) aufwand kann ab einer gewissen Zahl von
<table> Das einfache Template zur Produkt- Ersetzungen vernachlässigt werden. We-
<tr> darstellung kommt ohne sich wiederho- sentliche Geschwindigkeitsunterschiede
<td colspan=“2“><h2>{ARTIKELBEZEICHNUNG}</h2></td> lende Blöcke aus. EasyTemplate bietet können nur bei der Variablenersetzung
</tr>
sich an. Die Anwendung ist sehr einfach, auftreten.
<tr>
da die API nur vier Funktionen umfasst: PHP kennt drei Gruppen von Funk-
<td>Beschreibung</td>
<td>{BESCHREIBUNG}</td>
tionen zur Stringersetzung. Einfache Er-
</tr> •Template Klasse einbinden – require_on- setzungen mit den str*-Funktionen, Er-
<tr> ce(„[Link]“) setzungen basierend auf POSIX-kon-
<td>Preis</td> •Template Objekt von dem angegebenen formen Regulären Ausdrücken mit den
<td>{PREIS_DM}</td> File erzeugen – $tpl = new EasyTempla- ereg*-Funktionen und die preg*-Funk-
</tr> te(„[Link]“) tionen, die Perl-kompatible Reguläre
<tr> •Ersetzungen: Artikeldaten Ausdrücke verarbeiten. Das Parsen des
<td colspan=“2“> –$tpl->assign(„ARTIKELBEZEICH- einfachen Artikeltemplates gelingt mit
In den <a NUNG“, „Easy Rider“) den str_replace() am schnellsten. Rund
href=“{URL_BESTELLUNG}“><b>Warenkorb</b></a> legen.
–$tpl->assign(„BESCHREIBUNG“, 20% langsamer sind ereg_replace() und
</td>
„Abenteuer, VHS, 91 min., FSK 16“) ein mit Arrays aufgerufenes preg_repla-
</tr>
</table>
–$tpl->assign(„PREIS“, „14.95 DM“) ce(). Wirklich wichtig ist diese Erkenntnis
... •Ersetzungen: Shop Verwaltung – jedoch nicht, selbst mein Entwicklungs-
$tpl->assign(„URL_BESTELLUNG“, server, KROETE, ein AMD5x86-133 (et-
„/[Link]?inc=3016“) wa Pentium 60) benötigt nur 0.003
Ein Template ist ein HTML-Doku- •Template ausgeben – alternativ print Sekunden für die Ersetzungen im Artikel-
ment, welches Platzhalter enthält, die $tpl->easy_parse();$tpl->easy_print() template. Kein guter Ausgangspunkt für
vom Programm durch Werte ersetzt wer- Optimierungen!
den. Die meisten Template-Klassen ver- Der Konstruktor lädt das Template- EasyTemplate von Till Gerken ist für
wenden Platzhalter in der Form: {NA- file, dessen Name ihm übergeben wird. die gestellte Aufgabe die Template-Klasse
ME_IN_GROSSBUCHSTABEN}. Variablenersetzungen werden mit boole- der Wahl. Doch ein Kunde wäre kein ech-
an assign(string $varname, mixed $repla- ter Kunde, wenn keine neuen Anforderun-
Frei verfügbare Templatesysteme cement) vorgenommen. Die Ausgabe er- gen gestellt würden. Schnell wird klar,
Nachdem die Anforderungen geklärt sind folgt mit mixed easy_parse(void) oder dass nicht alle Produkte im Online-Shop
und ein Lösungsansatz gefunden wurde, boolean easy_print(void). in einer Detailansicht dargestellt werden
beginnt die Suche nach einer geeigneten können. Bei Auswahl einer Artikelgruppe
Templateklasse. [Link] zeigt schnell Laufzeitanalyse einfacher Lösungen soll zunächst eine Listendarstellung aller
zwei Gruppen von Templates. Intern verwendet EasyTemplate die Funk- enthaltenen Artikel erscheinen, bevor der
tion str_replace() zur Variablenersetzung. Internetnutzer zur Detaildarstellung ver-
Templates ohne Blöcke: Die Wahl der Funktion bestimmt die Ge- zweigen kann.
•EasyTemplate – [Link]/
(Teil des phpChat) PHPLib Template API PHPLib IT[X] API
Templates mit Blöcken: • Void Template([string $root = „.“, string • Void IntegratedTemplate([string $root = „“])
•QuickTemplate – [Link] $unknowns = „remove“]) – Setzt den Pfad, in – Setzt den Pfad, in dem die HTML Templates
[Link]/[Link]/ dem die HTML Templates liegen und be- liegen.
package/49 schreibt das Handling von unbekannten Platz • Boolean loadTemplatefile(string $filenam
•FastTemplate – [Link]. haltern. [, boolean $removeUnknownVariables = true,
net/php/[Link] • Void set_file(string $handle, string $filename) – $removeEmptyBlocks = true]) – Lädt das HTML
•PHPLib Template – [Link] Legt für das HTML Template $filename einen Template $filename in die Templateklasse und
de symbolischen Handlernamen $handle an. bestimmt das Handling von unbekannten

•Integrated Templates IT[X] – http:// • Void set_var(mixed $varname[, string Platzhaltern und Blöcken.

[Link] $value = „“]) – Ersetzt die Variable $varname • Void setVariable(mixed $variable[, $value = „“})
durch den Wert $value. Alternativ kann die – Ersetzt die Variable $variable durch den Wert
Funktion auch mit einem Array der Form [string $value. Alternativ kann die Funktion auch mit
(Eine dritte Gruppe von Templates
$var name => mixed $value] aufgerufen einem Array der Form [string $varname =>
mit Steueranweisungen und eigener
werden. mixed $value] aufgerufen werden.
Makrosprache wird nicht besprochen.

36 Linux Enterprise Special PHP


LE_PHP (35-46) 23.08.2001 10:34 Uhr Seite 37

Templates Development
Templates mit Blöcken Gruppe der Template- Klassen mit Unter- Die ausgestatteten Perl-kompatiblen
Der Grafiker gibt folgendes Layout für die stützung für sich wiederholende Blöcke Regulären Ausdrücke (preg*-Funktionen,
Listendarstellung vor: wird benötigt. Es konkurrieren X-, Fast- [Link]/manual/en/[Link])
und die beiden PHPLib-Templates. sind deutlich schneller und auch leistungs-
... Die Features und APIs der einzelnen fähiger als die POSIX- konformen ereg*-
<table> Templatesysteme unterscheiden sich et- Funktionen. FastTemplate wird zum
<tr> was, im Wesentlichen bieten sie jedoch die SlowTemplate und kann nicht mit seinen
<td colspan=“3“>Angebote aus der Artikelgruppe gleiche Funktionalität. Somit entscheidet Brüdern, den doppelt so schnellen PHPLib
Mustergruppe</td>
die Geschwindigkeit der Systeme über ih- Templates, mithalten. Die ursprünglich
</tr>
ren Einsatz. Ein einfacher Test (siehe aus der PHPLib stammenden Integrated
<!—- Anfang Listendarstellung eines Artikels — >
<tr>
[Link]/tpl_test.html) stellt Templates, kurz IT[X] genannt, gewinnen
<td><a href=“/[Link]“><img src=“/[Link]“></a></td> die verschiedenen APIs dar und spaltet das das Rennen knapp, weil die etwas andere
<td>Name des Artikels, Preis 99.99 DM</td> Lager in zwei Gruppen. Wieder entschei- Block-API einen Funktionsaufruf pro
<td><a href=“/[Link]“>Detailansicht</a></td> det die Wahl der Funktion zur Stringerset- Schleifendurchlauf einspart.
</tr> zung über Sieg und Niederlage. Zu verdanken haben die PHPLib-
<!—- Ende Listendarstellung eines Artikels — > Templatesysteme ihren Sieg Sascha Schu-
</table> •PHPLib Integrated Template mann. Er stattete in Version 3.0.7 die
... 4.13s (100.00%) PCRE-Funktionen mit einem Cache aus.
•PHPLib Template Der Cache speichert die Ergebnisse der C-
Zu den ursprünglichen Anforderun- 4.77s (115.58%) Funktion regcomp(). Regcomp() kompi-
gen an das Programm kommt eine neue •XTemplate liert ein Suchmuster und überführt es in ei-
hinzu: Der <tr>-Container mit der Listen- 8.94s (216.73%) ne Form, die von der C-Funktion
darstellung eines Artikels muss beliebig •FastTemplate regexec() verstanden wird, welche die ei-
oft wiederholt werden können. Die zweite 9.78s (237.08%) gentliche Suche durchführt. Hinzu kommt,

Anzeige
LE_PHP (35-46) 23.08.2001 10:34 Uhr Seite 38

Development Templates
dass preg_replace() im Gegensatz zu er- Mit der Methode set_block() wird dem zeug bereit, verlangt jedoch, dass dieser
eg_replace() mit nur einem Funktionsauf- Objekt mitgeteilt, dass im Template im Detail versteht, was passiert. Be-
ruf gleich eine ganze Reihe Ersetzungen „main“ ein Block „product_row“ exis- sonders bei komplexen Aufgaben mit
durchführen kann. Hierzu wird der Funk- tiert, der mehrmals dargestellt werden soll. mehreren Template-Files und tief ver-
tion statt eines einzelnen Suchmusters ein Set_block() ersetzt nun intern den Block schachtelten Blöcken kann leicht Verwir-
Array von Suchmustern und Ersatzwerten durch die Variable ROWS, die im dritten rung entstehen.
übergeben. Parameter benannt wurde. Zu diesem Die Integrated Templates versuchen,
Zeitpunkt ist der Inhalt von ROWS leer: hier Abhilfe zu schaffen. Zur Erledigung
Testsieger PHPLib (PEAR) der gleichen Aufgabe benötigt der Anwen-
Der Leistungsumfang der zwei schnell- $tpl->set_block(„main“, „product_row“, „ROWS“); der ein etwas kürzeres Skript. IT[X] geht
sten Systeme liegt so nah beisammen, davon aus, dass alle Blöcke in einem Tem-
dass die API über den Einsatz der einen In einer Schleife werden die Artikelda- plate-File enthalten sind. Es wird keine
oder anderen Lösung entscheidet. Wäh- ten dem Template-Objekt mit set_var() zu- Möglichkeit bereitgestellt, die Block-
rend das Laden eines Templates und die gewiesen. Das Objekt wird anschließend schachtelung zu verändern und einen ge-
Variablenzuweisungen in beiden Klassen mit parse() angewiesen, die übermittelten parsten Block an mehreren Stellen im
sehr einfach sind, unterscheiden sich die Daten im Block „products_row“ einzuset- Template einzufügen.
Funktionen zum Blockhandling wesent- zen und das Ergebnis dem Inhalt von Durch die Grundannahmen wird die
lich. ROWS hinzuzufügen. ROWS umfaßt mit API selbsterklärend. Wer nur selten die
Perl-Programmierer werden die Tem- jedem Schleifendurchlauf die Darstellung Einschränkungen überwinden muss, der
plate-Klasse von Kristian Köhntopp eines weiteren Artikels. Im Performance- sollte auf die Klasse Integrated Template
schnell anwenden können, weil sie stark testskript sieht dies alles wie folgt aus: Extension schauen. Sie enthält zusätzliche
an FastTemplate erinnert, welches wiede- Methoden, die sogar mehr Funktionalität
rum aus der Perl-Welt stammt. Anderen for ($j = 0; $j < ARTIKEL; $j++) { bieten, als die Template-Klasse zur Verfü-
wird das Verständnis nur gelingen, wenn gung stellt.
sie wissen, wie die Klasse arbeitet. Im $tpl->set_var($daten);
Gegensatz zu IT[X] analysiert Template $tpl->parse(„ROWS“, „product_row“, true); $tpl = new IntegratedTemplate(TEMPLATE_ROOT);
nicht das HTML Template, um herauszu-
finden, wie die gefundenen Blöcke ineinan- } $tpl->loadTemplatefile(„template_detail3.html“);
der verschachtelt sind. Die Klasse hat kein Statt für jeden Platzhalter set_var()
Wissen darüber, wie die Blöcke zu- aufzurufen, wird der Methode ein Array $tpl->setCurrentBlock(„product_row“);
for ($j = 0; $j < ARTIKEL; $j++) {
sammengesetzt werden müsen, ohne Rei- mit den Artikeldaten übergeben. Das For-
$tpl->setVariable($daten);
henfolge und Schachtelung zu zerstören. mat von $daten entspricht dem typischen
$tpl->parseCurrentBlock();
Die Vorlage des Grafikers ist nur mini- Rückgabewert einer Datenbankfunktion
}
mal zu verändern, damit sie verwendet wie mysql_fetch_array().
werden kann. Der erste HTML- Kom- $tpl->show();
mentar wird gegen <!—BEGIN pro- $daten = array(
duct_row ➞ ausgetauscht, der zweite ent- „URL_BESTELLUNG“ => „/[Link]?inc=3016“,
„URL_DETAIL“ => „/[Link]?art=3016“,
sprechend durch <!—END product_row Mit diesem Basiswissen ist es möglich,
„BEZEICHNUNG“ => „Easy Rider“,
➞ ersetzt, letztendlich werden Platzhalter HTML komplett aus dem Programmcode
„PREIS“ => „14.95 DM“
in der bekannten Form {VARNAME} ein- zu verbannen. Die Wiederverwendung
);
gefügt. Das Skript zur Bearbeitung benö- von Skripten wird einfacher, und die lästi-
tigt nur wenige, jedoch gehaltvolle Zei- gen Gespräche mit den Mäuseschubsern,
len. Das Template-File selbst muss auch ei- auch Grafiker genannt, bleiben aus, so-
Zunächst wird ein Objekt der Templa- ner Variablen zugewiesen werden, bevor bald diese einmal verstanden haben, was
te-Klasse erzeugt. Durch den Konstruktor diese ausgegeben werden kann. Der par- ein Template ist.
wird dem Objekt mitgeteilt, wo die se()-Aufruf legt den Inhalt des Template- Endlich gewinnt man Zeit, um eine ei-
HTML-Templates zu finden sind. Idealer- Files in der Variablen MAIN ab. Diese gene Templateklasse zu erfinden. Schließ-
weise ist dies in einer leicht veränderbaren kann abschließend mit der Methode p(), lich gehört es zum guten Ton in der PHP-
Konstanten gespeichert. Anschließend für print, ausgegeben werden: Szene, über eine solche zu verfügen, wenn
wird das Template „template_detail. html“ man schon kein Content Management
unter dem Handler „main“ geladen: $tpl->parse(„MAIN“, „main“); System geschrieben hat. Einige CMS set-
$tpl->p(„MAIN“); zen zwar schon auf XML und XSLT, doch
$tpl = new Template(TEMPLATE_ROOT); Templates sind verständlicher und lassen
Die fein abgestufte API stellt dem Pro- sich nicht nur zur Erstellung von HTML
$tpl->set_file( array(„main“=> „template_detail.html“) ); grammierer zwar ein mächtiges Werk- einsetzen.

38 Linux Enterprise Special PHP


php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 1

Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 2

Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 3

Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 4

Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 5

Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 6

Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 7

Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 8

Anzeige
LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 47

PHPLIB und PEAR im Überblick Development

Klassensystem
Unterverzeichnissen doc, pages, php und
stuff. Unter doc ist die Dokumentation
zu dieser Version enthalten; pages enthält
einige Testseiten; stuff enthält Dateien,
die zur Einrichtung der benötigten Da-
tenbanktabellen verwendet werden kön-
von Martin Jansen nen. Das Verzeichnis php schließlich ent-
hält die Klassen der PHPLIB. Der Inhalt
dieses Verzeichnissen muss auf den Web-
PHPLIB und PEAR im Überblick server kopiert werden. Die Dateien soll-
ten sich vorzugsweise in einem Verzeich-
nis befinden, welches außerhalb der
Document Root liegt. Auf jeder Seite, auf
PHPLIB (PHP Base Library) ist die eierlegende Wollmilchsau von PHP:Sie bietet komfortables und der die PHPLIB verwendet werden soll,
sehr mächtiges Session-Handling, Datenbank-Abstraktions-Klassen für den Zugriff auf eine Viel- muss später die Datei prepend.php3 aus
zahl verschiedener Datenbanksysteme unter derselben API, stellt Systeme zur Realisation von Be- dem Verzeichnis php eingebunden wer-
nutzerverwaltungen und geschützten Bereichen zur Verfügung und hat darüber hinaus viele wei- den. Wenn man dies nicht manuell für je-
tere Features zu bieten, auf die in diesem Artikel eingegangen [Link] alles geschieht unter der de einzelne Datei machen will, kann man
prepend.php3 in der [Link] bzw.
„schützenden Hand“ von LGPL (GNU Library Public License), was zur Folge hat, dass die Elemente [Link] als Wert für die Direktive
der PHPLIB sowohl in kommerziellen als auch in nichtkommerziellen Projekten kostenlos einge- auto_prepend_file mit der passenden
setzt werden dürfen. Pfadangabe eintragen.

Datenbank-Abstraktion
PHPLIB stellt eine Klasse DB_Sqlzur Verfü-
gung, die den Zugriff auf Datenbanken in
Was ist die PHPLIB? zum Download verfügbar. Unter der sel- einer Weise erlaubt, die weitgehend unab-
Die PHPLIB ist eine Sammlung von in PHP ben Adresse findet sich auch die englisch- hängig davon ist, welches Datenbanksys-
geschriebenen Klassen, die viele Mechanis- sprachige Dokumentation und Demon- tem verwendet wird. PHPLIB unterstützt
men bieten, welche ein Programmierer strationen verschiedener Features der derzeit die folgenden Datenbanksysteme:
beim Entwickeln von Applikationen in PHPLIB. mSQL, MSSQL, MySQL, Oracle 8, ODBC,
PHP häufig benötigt. Der Anlass, die Ent- Weiteren Support erhält man zu den PostgreSQL und Sybase. Somit ist es mög-
wicklung der PHPLIB zu starten, war der verschiedenen Klassen auf der Mailing- lich, eine Applikation zu entwickeln, die
Wunsch nach einer Möglichkeit, Variablen liste der PHPLIB, auf der man sich unter sich relativ flexibel an das gegebene Daten-
und deren Werte über mehrere Webseiten [Link] banksystem anpassen kann. Jedem Daten-
hinweg gültig und verfügbar zu machen. anmelden kann. banksystem ist eine Datei nach dem Muster
Daraus entstand die Session-Klasse, auf die Die PHPLIB steht unter der GNU Li- db_<Name>.inc im Verzeichnis php zuge-
im weiteren Verlauf dieses Artikels noch brary General Public License (LGPL) ordnet (MySQL: db_mysql.inc, ODBC:
eingegangen wird. Die ursprüngliche Ver- und kann daher sowohl in kommerziel- db_odbc.inc usw.). Durch das Ändern der
sion der PHPLIB wurde von Kristian Köhn- len als auch in nichtkommerziellen Pro- require-Anweisung in prepend.php3(De-
topp und Boris Erdmann entwickelt. Im jekten kostenfrei eingesetzt werden. Ein- fault:require($_PHPLIB[„libdir“].“db_m
Laufe der Zeit haben eine Vielzahl anderer zelheiten zur LGPL der PHPLIB finden [Link]“);) kann man festlegen, welches
Programmierer Klassen beigesteuert, dar- sich in der Datei COPYING, die Be- Datenbanksystem genutzt werden soll. Die
unter Sascha Schumann und Ulf Wendel. standteil jeder PHPLIB-Distribution ist. Klasse DB_Sql dient als Grundlage der Da-
Die Entwicklung von PHPLIB läuft über Die Installation der PHPLIB beginnt tenbank-Abstraktion und enthält keinerlei
CVS (Concurrent Versions System; mit dem Extrahieren der Dateien aus dem Verbindungsparameter. Daher muss vor der
[Link]) ab, was den Vorteil Archiv, das man unter [Link] Verwendung der Datenbank-Abstraktion
hat, dass Programmierer überall auf der [Link]/ heruntergeladen hat. Es ist un- eine von DB_Sql abgeleitete Klasse gebildet
Welt ihren Code auf eine sehr einfache Art günstig, die Development-Versionen der werden, in der die Verbindungsparameter
und Weise beisteuern können und gleich- PHPLIB im Produktionsbetrieb einzuset- angegeben sind. Beispiel:
zeitig eine korrekte und effiziente Versions- zen, da in diesen Versionen manche Me-
verwaltung durchgeführt werden kann. chanismen fehlerhaft oder nur experi- <?php
Die PHPLIB ist unter [Link] mentell implementiert sind. Nach dem class My_DB extends DB_Sql {
[Link] als komprimiertes tar-Archiv Extrahieren der Dateien entsteht ein Ver- var $Host = “localhost”;
oder als selbstentpackendes Shellscript zeichnis phplib-<version> mit den vier var $Database = “test”;

Linux Enterprise Special PHP 47


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 48

Development PHPLIB und PEAR im Überblick


var $User = “martin”; seiten der Applikation verfügbar sind. Funktionen besteht allerdings darin, dass
var $Password = “geheim”; Gleichzeitig bleiben diese jedoch ständig es bei diesen weitaus mehr Arbeit erfor-
} auf dem Server, wodurch ein „böser User“ dert, einen neuen Storage-Container zu
?>
sie nicht manipulieren und dadurch Scha- definieren (Standard ist hier eine Datei im
Die nun entstandene Klasse My_DB den anrichten kann, wie es beispielsweise Filesystem des Servers).
verhält sich absolut identisch zu DB_Sql beim Transport der sensiblen Daten in der
mit der Ausnahme, dass My_DB Verbin- URL oder in einem <hidden>-Feld in einem Templates
dungsparameter kennt, die DB_Sql nicht Formular möglich ist. Das Einzige, was der Templates ermöglichen es dem Program-
bekannt sind und somit eine Verbindung User verändern kann, ist der Wert der Ses- mierer, Layout und Code seiner Applika-
zum Datenbankserver mit diesen Parame- sion ID. Die Wahrscheinlichkeit, dass der tion zu trennen: Auf der einen Seite sind
tern aufbauen kann. Um nun mit My_DB User eine fremde Session ID errät, ist jedoch die HTML-Dateien, in denen keine Zeile
auf die Datenbank zuzugreifen, muss man bei einer Länge von 32 Zeichen pro ID (Bei- PHP-Code enthalten ist und die das De-
durch spiel.„bb5d8e09739373fe872d5ecc4370 sign vorgeben. In diesen HTML-Dateien
0c75“) sehr gering. sind Platzhalter vorhanden, die später
$db = new My_DB; Die eindeutige Identifizierung, die mit von den PHP-Skripten durch Inhalt er-
Hilfe der Session ID möglich ist, ist somit setzt werden. Auf der anderen Seite sind
ein neues Datenbankobjekt erzeugen und in einer gewissen Weise Abhilfe für das bei der Anwendung von Templates die
kann dann durch Problem, dass HTTP ein zustandsloses PHP-Skripte, in denen nur PHP-Code
Protokoll ist und somit nicht ohne weite- steht. Diese PHP-Skripte parsen die
$db->query(„SELECT * FROM table“); res die Entwicklung von Applikationen, HTML-Dateien und ersetzen die darin
die einen Zustand verlangen, ermöglicht. enthaltenen Platzhalter durch dynami-
beispielsweise alle Datensätze aus der Ta- Durch die Session-ID existiert zwar kein schen Inhalt. Durch diese Trennung kann
belle „table“ auslesen. Zustand der permanenten Verbindung sich der Programmierer auf das konzen-
zwischen Client und Server, es ist jedoch trieren, was er wirklich beherrscht, näm-
Sessionhandling möglich, den Client nach „Abbruch und lich das Erstellen der PHP-Skripte.
Die Session-Klasse war ursprünglich der Neuaufbau“ der HTTP-Verbindung wie- Gleichzeitig muss sich der Designer nicht
Anlass, mit der Entwicklung der PHPLIB der eindeutig zu identifizieren. mit PHP-Code, den er unter Umständen
zu beginnen. Ziel war es, wie bereits in der Ein Vorteil der Session-Klasse der nicht oder falsch versteht, herumschla-
Einleitung zu diesem Artikel gesagt, Vari- PHPLIB gegenüber anderen Lösungen be- gen und kann sich in Ruhe mit dem pas-
ablen und deren Werte über mehrere Sei- steht darin, dass sie den Datenpool auf die senden Layout und einem netten Design
ten einer Applikation hinweg verfügbar verschiedensten Arten auf dem Server beschäftigen.
zu machen. speichern kann: Die beiden am häufigsten Dieses Parsen und Ersetzen über-
Um dies zu erreichen, wird dem Brow- verwendeten Wege sind die Speicherung in nimmt in PHPLIB die Klasse template in
ser des Benutzers eine eindeutige Kennung einer Datenbank und die Speicherung in der Datei [Link].
gegeben (die Session ID), die bei jedem Zu- Textdateien. Daneben ist es jedoch auch Zum Prinzip und zur Funktionsweise
griff durch den Browser auf die Applika- möglich, den Datenpool in DBM-Dateien, von Template Systemen findet sich in die-
tion zwischen beiden ausgetauscht wird. einem shared-memory Segment oder in ei- ser Ausgabe ein Artikel von Ulf Wendel.
Die Session ID wird entweder in einem nem LDAP-System abzulegen. Die Datei-
Cookie auf dem System des Users gespei- namen der Klassen, die zum Speichern des Authentifizierung
chert oder als GET-Parameter in die URL Datenpools dienen, beginnen alle mit ct_, PHPLIB bietet die Klasse Auth, mit deren
integriert. Zu jeder Session ID gibt es auf wobei die Abkürzung „ct“ für Container Hilfe man geschützte Bereiche über meh-
dem Server einen Datenpool, in dem alle steht (der sog. „Storage Container“, in rere Seiten hinweg realisieren kann. Die
Daten abgelegt werden, die der Benutzer dem der Datenpool gespeichert wird). Klasse Auth prüft auf jeder Seite, ob sich
auf seinem Weg durch die Applikation ge- Sessions sollten überall dort Anwen- der Benutzer bereits auf einer anderen Sei-
sammelt hat (z.B. die Artikel in seinem vir- dung finden, wo mit sensiblen Daten (Kun- te der Applikation mit Username und
tuellen Warenkorb). Durch Übermittlung deninformationen, Bestelldaten usw.) gear- Passwort angemeldet hat. Ist dies der Fall,
der Session ID wird der Applikation nun beitet wird und es somit wichtig ist, dass wird der Inhalt der Seite dargestellt. Ist der
mitgeteilt, welcher Datenpool dem Benut- diese sensiblen Daten nicht die Trust Boun- Benutzer noch nicht angemeldet, wird ein
zer gehört. Die Applikation ist damit in der dary (Grenze zwischen Webserver und frei konfigurierbares Eingabeformular
Lage, auf den Datenpool zuzugreifen, Da- Internet) verlassen. ausgegeben, mit dessen Hilfe sich der Be-
ten aus ihm anzuzeigen, zu aktualisieren, zu Als „Konkurrenz“ zur SessionKlasse nutzer anmelden kann. Ob der Benutzer
löschen oder neu anzulegen. Der Vorteil der PHPLIB bietet PHP seit Version 4 ei- sich bereits angemeldet hat, wird mit dem
dieser Speicherung auf dem Server ist die gene Session-Funktionen, die unter www. oben beschriebenen Session-Manage-
Tatsache, dass die sensiblen Daten wäh- [Link]/manual/[Link] beschrie- ment von Seite zu Seite weitertranspor-
rend der Dauer der Session auf allen Web- ben werden. Der Nachteil dieser Session- tiert.

48 Linux Enterprise Special PHP


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 49

PHPLIB und PEAR im Überblick Development


Die Authentifizierung kann dabei den Archiven ist jedoch, dass die Skripte •Über ein Distributions-System wird es
wiederum gegen eine Vielzahl verschiede- auf viele verschiedenen Seiten verteilt möglich sein, nur die Elemente des PEAR
ner Storage Container für Benutzerdaten sind (und somit schwer zu finden sind), herunterzuladen, die man wirklich
durchgeführt werden (z.B. Datenbanken, dort häufig schlecht strukturiert sind und braucht, somit ein kompaktes, auf indi-
LDAP-Systeme, NT Domaincontroller). dass die direkte Integration in PHP viduelle Bedürfnisse zugeschnittenes
Darüber hinaus kann in Verbindung mit schwerlich umzusetzen ist. Durch PEAR System zu schaffen und diese Elemente
der Authentifizierung die Klasse Perm ver- jedoch gibt es eine einzige zentrale An- direkt in PHP einzubinden. Daneben
wendet werden, mit deren Hilfe sich ein- laufstelle, in der sich qualitativ hochwer- wird es ebenfalls möglich sein, die ver-
zelne Zugriffsrechte in der Applikation tiger Code für alle möglichen Zwecke fin- schiedenen Elemente (Packages) als Ar-
definieren lassen. det (wie es sich z.B. bei CPAN etabliert chivdatei herunterzuladen, die neben
hat). Es werden seitens der Entwickler dem Sourcecode eine XML-Informa-
Die Zukunft der PHPLIB sehr strikte Richtlinien bezüglich der tionsdatei enthalten wird.
Eine Version 8 der PHPLIB wird es vor- Struktur und Unterteilung des PEAR ein-
aussichtlich nicht mehr geben. Dies be- gehalten und durch das Installations- Jeder PHP-Entwickler, der Klassen
deutet jedoch nicht das Ende der PHPLIB. Tool werden die Elemente des PEAR di- oder Erweiterungen hat, die er der Öffent-
Vielmehr wird seitens der Entwickler eine rekt in PHP eingebunden und verfügbar lichkeit zur Verfügung stellen möchte, ist
Integration der PHPLIB in PEAR (PHP gemacht. eingeladen, an der Entwicklung des PEAR
Extension and Application Repository; Die derzeit wichtigsten Elemente des teilzunehmen, indem er seinen Code hier
[Link] angestrebt. Was das PEAR sind ein sehr mächtiges System zur veröffentlicht. Wer mitarbeiten möchte,
PEAR ist, wird im folgenden Abschnitt er- Datenbank-Abstraktion, das vergleichbar der meldet sich am besten auf der Mailing-
läutert. mit der Klasse DB_Sql von PHPLIB ist, eine liste pear-dev@[Link] an (Anmel-
Wann die Integration der PHPLIB Cache-Klasse, die das Caching von dyna- dung per WWW auf [Link]/
konkret stattfinden wird, ist zu dem Zeit- mischen Seiten erlaubt sowie der Doku- [Link], wo über die Weiterentwick-
punkt, da dieser Artikel geschrieben wird, mentationsgenerator PHPDoc, mit dem lung von PEAR und die Aufnahme neuen
noch nicht bekannt. Fest steht jedoch, API-Dokumentationen von PHP-Projek- Codes diskutiert wird.
dass beide Seiten (die Entwickler der ten im Stil von Javadoc erstellt werden kön- Martin Jansen ist Schüler und arbeitet
PHPLIB und die Entwickler des PEAR) ge- nen. Darüber hinaus finden sich Klassen als Entwickler für Internt- Applikationen
willt sind, diesen Schritt zu gehen. Als zum XML-Handling, eine Benchmark- bei der Bauer + Kirch GmbH in Monschau.
Zeitfenster für die Migration sind 6 Mo- Klasse für Performance-Tests von PHP- In seiner Freizeit ist er sowohl in der deut-
nate, beginnend mit Mitte Januar 2001, Skripten und viele weitere Skripte im PE- schen PHP- Szene (hauptsächlich in der
vorgesehen, die jedoch nicht zwingend AR. Newsgroup [Link]), als Mitau-
eingehalten werden müssen. Die Vorteile des PEAR liegen auf der tor der FAQ ([Link]/php/) zu
Hand: dieser Newsgroup und in der internationa-
PEAR: PHP Extension and Application len PHP-Community (Entwicklung des
Repository •Der in PEAR verfügbare Code hat eine PEAR und Übersetzung des PHP-Manu-
PEAR (Links zu Ressourcen finden sich sehr hohe Qualität, da er vor der Veröf- als) tätig.
im Kasten „Auf einen Blick: Links zum fentlichung intensive Tests durchläuft
Thema“) ist Bestandteil der PHP-Distri-
bution und verhilft nach Perl (CPAN)
und viele erfahrene PHP-Entwickler Zu-
griff und Einblick in die Quellcodes ha- Links
und TeX (CTAN) nun auch PHP zu einem ben, wodurch Fehler, Unebenheiten oder Die Homepage der PHPLIB:
[Link]
zentralen Archiv von nützlichen, geprüf- Schwachstellen im Code fachmännisch
ten und katalogisierten Klassen und Er- und sicher behoben werden können. Deutschsprachige FAQ zur PHPLIB:
weiterungen (geschrieben in PHP und C). •Die verschiedenen Elemente des PEAR [Link]/php/[Link]

Das PEAR befindet sich zu dem Zeit- verfügen über ein Layout und eine API, PEAR-Homepage: [Link]
punkt, da dieser Artikel geschrieben die sehr allgemein formuliert sind (ohne Dokumentation zu PEAR:
wird, noch in einem sehr frühen Entwick- dabei an Leistungsfähigkeit einzubü- [Link]/manual/[Link]
lungsstadium, verfügt allerdings bereits ßen), wodurch die Elemente leicht in al- Links zu Tutorials über PEAR-Komponenten:
über eine breite Basis an engagierten Ent- len möglichen Arten von Projekten ein- [Link]
wicklern, die Code beisteuern und die gesetzt werden können. Das CVS-Repository von PEAR:
Entwicklung von PEAR koordinieren. •Naming-Conventions und eine Untertei- [Link]
Möglicherweise wird nun die Frage lung des PEAR in verschiedenen Kate- Die Development-Mailingliste zu PEAR:
aufkommen: „Warum das alles? Es exis- gorien stellen sicher, dass selbst bei sehr pear-dev@[Link]
tieren doch mehr als genug Code-Archi- vielen verschiedenen Elementen und zu- Die User-Mailingliste zu PEAR:
ve!“. Diese Frage ist durchaus berechtigt. nehmender Größe des PEAR der Über- pear-general@[Link]
Das Problem bei den derzeit existieren- blick nicht verloren gehen wird.

Linux Enterprise Special PHP 49


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 50

Development PEAR Daten/ Content Cache


ming“, auch „memorizing“ genannt, wird
die rekursive Berechnung der Fibonacci
Zahlenfolge erheblich beschleunigt. Aus
einem Algorithmus mit exponentieller
Laufzeit wird einer mit linearer Laufzeit.

Beispiel Output Cache


Mit dem PEAR Cache Modul (http://
[Link]/) steht für PHP-Skripte ein
universeller Datencache zur Verfügung,
der zum Caching von Daten beliebigen
Typs, von Ausgaben, Funktionsaufrufen
und dynamischen Grafikgenerierungen
verwendet werden kann. Die Funktions-
weise des PEAR-Cache wird im folgenden
anhand des Output-Cache diskutiert, der
beispielsweise zur Beschleunigung von
Templates oder XSL Transformationen
benutzt werden kann.
Seit PHP 4 ist es mit dem „Output Buf-
fering“ möglich, Ausgaben eines Skripts
in einen Puffer umzuleiten, bevor diese
zum Webserver und damit zum Internet-
nutzer geleitet werden. Dieses Features

Schnelligkeit bedient sich der Output-Cache und lässt


aus dynamisch generierten Seiten für eine
gewisse Zeit „statische“ werden. Der re-
chen- und zeitintensive Skriptlauf wird
durch einen Cachezugriff ersetzt, also

durch Faulheit durch das Lesen zuvor gespeicherter Da-


ten aus dem Filesystem, der Datenbank
oder dem Shared Memory. Die Laufzeit
des PHP Skripts sinkt auf die Zeit, die für
einen Zugriff auf den Massenspeicher be-
von Ulf Wendel nötigt wird; in der Praxis läßt sich schnell
eine Einsparung um Faktoren von 2-10
gegenüber einem regulären Skriptlauf er-
Applikationen beschleunigen mit dem PEAR zielen.

Daten/Content Cache require_once(„Cache/[Link]“);

$cache = new Cache_Output


(„file“, array(„cache_dir“ => „cache/“));
$id = $cache->generateID($PHP_SELF);

if ($data = $cache->start($id))
Würde ein Student die Aufgabe erhalten, einen In diesem Beispiel hat der Student eine die(„$data<hr>Cache hit.“);
Versuch, [Link] Ball aus einer definierten simple Optimierung vorgenommen, in-
dem er bereits ermittelte Werte wiederver- // zeitaufwendiges Skript.
Höhe fallen zu lassen und die Wucht des Auf-
wendet hat, was aufgrund der determinis- print „Beliebige Ausgaben.“;
pralls zu messen, jede Stunde wiederholen zu tischen Natur des Vorgangs möglich ist. $cache->end();
müssen, so wäre eine zweite Person notwen- Cache-Technologien bedienen sich der print „<hr>Cache miss.“;

dig, die kontrolliert, dass der Laborant nicht die gleichen Idee und sind beispielsweise von
Festplatten bekannt, aber auch in der Zur Arbeit mit dem Cache wird ein
Ergebnisse des vorherigen Versuchs abschreibt
Softwaretechnik finden sie Anwendung. Objekt vom Typ Cache_Output erzeugt.
und die eingesparte Zeit für einen Flirt nutzt. Durch „top-down dynamic program- Im Konstruktor wird dem Objekt mitge-

50 Linux Enterprise Special PHP


LE_PHP (47-60) 23.08.2001 14:08 Uhr Seite 51

PEAR Daten/ Content Cache Development


teilt, welcher Storage Container zum Ein- eine Variable übergeben, die alle Werte Vorsicht ist geboten, wenn POST- oder
satz kommen soll. Im Beispiel wird der enthält, von denen das gecachte Datum GET-Parameter einbezogen werden. Ein
Filesystem-Container verwendet, dessen abhängig ist. Für unseren Studenten sind Angreifer könnte, durch eine Flut von An-
Konfigurationsparameter in einem Hash dies die Eigenschaften des Balls, die Fall- fragen mit unsinnigen Werten, immer
gespeichert sind, der als zweiter Parame- höhe und die Beschaffenheit des Bodens. neue IDs generieren und den Cache mit
ter im Konstruktor übergeben wird. Alter- Bei einem Seiten-Cache wird meist der Da- Datensätzen füllen, in der Hoffnung einen
nativ dazu können die Daten auch unter teiname genügen ($PHP_SELF), manch- Überlauf zu erzielen.
Verwendung der PEAR-, PHPLib- oder mal sind aber auch andere Determinanten Nachdem eine Kennung ermittelt
DBX-Datenbankabstraktion in einem für die Seite zu berücksichtigen wie die wurde, wird mit Cache_Output::start()
RDBMS sowie im Shared Memory gespei- $HTTP_[POST|GET|COOKIE]_VARS. geprüft, ob bereits ein Eintrag im Cache
chert werden. Dann wird analog zur Verwendung des vorliegt. Ist dies der Fall, liefert die Me-
Funktionscache, wo Funktionsname und thode die Daten aus dem Cache zurück
Die Bedeutung zur ID eines Funktionsparameter zu berücksichtigen und der Skriptlauf kann nach Ausgabe
Cacheseintrags sind, ein Hash mit allen Werten überge- der Daten abgebrochen werden. Werden
Zur Ablage von Daten im Cache wird ben: ganze Seiten gecacht, bietet es sich an,
mittels der Methode Cache::genera- den Test im auto_prepend-File durchzu-
teID(mixed $seed) eine Kennung für den $id = $cache->generateID(array(„file“ => $PHP_SELF, „cookie“ führen. Fehlt ein Cacheeintrag, so wird
Datensatz ermittelt. Als Parameter wird => $HTTP_COOKIE_VARS)); das Output Buffering gestartet und das

Anzeige
LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 52

Development PEAR Daten/ Content Cache


restliche Skript ausgeführt. Am Ende des hängigkeiten, als dass eine allgemeingül- Müllabfuhr
Skripts, idealerweise im auto_append- tige Funktion geschrieben werden könn- Nach einiger Zeit im Praxisbetrieb wird
File, werden die Inhalte des Output Buf- te. Soll beispielsweise geprüft werden, ob sich der Cache mit vielen Datensätzen ge-
fers im Cache abgelegt und angezeigt. Content (XML) und Template (XSL) sich füllt haben. Ähnlich wie bei Sessions sind
Durch einfache Veränderungen an den seit der Anlage des Cache-Datums nicht nicht mehr alle Einträge in Benutzung und
auto_prepend- und auto_append-Files, verändert haben, so kann dies entweder können gelöscht werden. Der Garbage
können bestehende Präsentationen mit durch Einbeziehung der Variablen in die Collector wird deshalb im „Destruktor“
neuer Cache Technologie ausgestattet ID-Generierung geschehen oder aber aufgerufen, der in der Klassenbibliothek
werden. durch Erweiterung der Cache_Output- PEAR über register_shutdown_function()
Klasse: simuliert wird. Er arbeitet zeit- und wahr-
Externe Abhängigkeiten scheinlichkeitsbasiert und löscht nach
Spielt ein Kommilitone dem Studenten im class LE_Cache_Output extends Cache_Output { Überschreitung einer vorgegebenen Zeit
Eingangsbeispiel einen Streich und läßt et- function start($id, $group = „default“) { oder zufällig im Mittel nach n% der Aufru-
was Luft aus dem Ball, ändert also die Aus- if ($this->no_cache) fe alle Einträge, die nicht endlos gelten und
return „“;
gangswerte, so ist der Student gezwungen, veraltet sind. Wer genau liest, der merkt,
seinen Versuch zu wiederholen. Die Ergeb- dass es eine Lücke gibt, die bei Bedarf
$userdata = $this->getUserdata($id, $group);
nisse der vorherigen Versuche kann er nicht durch eine eigene Ableitung zu schließen
mehr abschreiben. Für die Anwendung des ist. Einträge, die nie ablaufen aber nicht
$user = explode(„,“ $userdata);
Output Cache gilt das gleiche, ändert sich mehr benutzt werden, erfasst die Müllab-
if (filemtime($user[0]) != $user[1] || filemtime($user[2]) !=
das Template oder gar der Content einer $user[3])
fuhr nicht.
Seite, so ist das gecachte Datum ungültig. return „“;
Es gibt mehrere Varianten, um dem Was bringt es?
Problem zu begegnen. Der filemtime() des return Cache_Output::start($id, $group); Bei konsequenter Anwendung der verfüg-
Templates wird bei der Generierung der } baren Cachetechnologien werden PHP-ba-
ID berücksichtigt, der Cacheeintrag wird } sierte Webanwendungen trotz ihrer dyna-
mit einer maximalen Lebenszeit versehen mischen Natur fast so schnell wie statische
und veraltet nach Ablauf der Lebenszeit Dokumente. Die Bytecode Caches (Zend
automatisch, es werden im Cache Daten- Userdata-Feld Cache, APC, Afterburner/Bware) reduzie-
satz neben den Nutzdaten Vergleichswer- ren die „Ladezeit“ eines Skripts auf einen
te abgelegt, oder aber es wird unter Ver- wird angelegt vernachlässigbaren Wert, und Daten-/
wendung von Cache::flush() der Inhalt Content Caches, wie der PEAR Cache, re-
des Cache manuell gelöscht. duzieren die Laufzeit. Im Extremfall wird
Finden Templateveränderungen so Durch das Überschreiben der Methode die gesamte Laufzeit eingespart und durch
selten statt, dass dem Anwender eine ma- Cache_Output::start() wird der notwendi- einen Shared Memory-Zugriff ersetzt. In
nuelle Löschung zugemutet werden ge Test gekapselt und vor dem Program- diesem Szenario macht sich ein bereits ein-
kann, so ist es wünschenswert, nicht alle mierer verborgen, was bei Einbindung der mal ausgeführtes Skript bei allen Folgeauf-
Einträge im Zwischenspeicher zu lö- Daten in die ID-Generierung nur schwer- rufen selbst überflüssig. Der Overhead, der
schen, sondern nur diejenigen, die tat- lich gelingt. Die für den Vergleich notwen- durch den Einsatz von PHP entsteht, wird
sächlich vom Template abhängig sind. digen Vergleichswerte werden dem 255 auf die Kosten eines Prozessstarts redu-
Da Cache::generateID() keine umkehr- Zeichen-großen „Userdata“-Feld jedes Ca- ziert.
bare Berechnung durchführt, ist es nicht che-Datensatzes entnommen. Das Format Das Anwendungsspektrum des PEAR-
möglich, das zu einer ID gehörende Tem- der Userdata-Inhalte kann frei gewählt Cache ist durch die geringe Einstiegshürde
plate zu ermitteln. Um dennoch die zu ei- werden. Im Beispiel wurden nacheinander – so sind keine Änderungen am PHP
nem Template gehörenden Datensätze und durch Kommata getrennt Dateiname notwendig – sowie die generische Imple-
löschen zu können, werden diese bei der und filemtime()-Wert zum Zeitpunkt der mentierung sehr groß. Sicher gibt es An-
Anlage nach dem Namen des Templates Anlage des Cache Eintrags verwendet. wendungen, an die die verfassenden Ent-
gruppiert. Ebenso hätte aber auch eine Checksumme wickler noch nicht gedacht haben. Falls
verwendet werden können, die stets über dem so ist, bitte ich um eine Beiteiligung an
Cache::save($id, $data, $expires = 0, $group = „default“) die gleichen statisch in der Funktion codier- der Weiterentwicklung der PEAR-Klas-
ten Dateinamen gebildet wird. Angelegt senbibliothek, auf dass sie eines Tages die
Für eine automatische Erkennung wird das Userdata Feld mit der Methode Rolle einnehmen kann, die CPAN für Perl
von externen Abhängigkeiten ist es oft Cache::extSave(): oder die umfangreichen Standardbiblio-
von großem Nutzen, wenn individuelle theken für Java spielen, um dabei zu hel-
Testverfahren implementiert werden Cache::extSave($id, $cachedata, $userdata, $expires = 0, fen, PHP im Enterprise-Markt zu etablie-
können – zu mannigfaltig sind die Ab- $group = „default“) ren.

52 Linux Enterprise Special PHP


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 53

Sessionmanagement Development

Benutzer-
neuer Vorgang, der verarbeitet wird. Er
kann nicht unterscheiden, ob es sich um
den alten oder einen weiteren Benutzer
handelt.

orientiert Daten
Hilfe für den Server: Cookies
Für die Lösung dieses Problems wurden
von Netscape die Cookies erfunden. Diese
sind kleine Datenschnipsel, die im Brow-
ser gespeichert werden. Sie werden bei der

speichern nächsten Anforderung mit GET oder


POST angehängt – exakt getrennt nach
dem Server, der das Cookie gesetzt hat.
Der Server erkennt das Cookie und stellt
es seiner Programmierumgebung zur Ver-
von Jörg Krause fügung. So können Sie im Skript Anforde-
rungen von verschiedenen Clients unter-
scheiden. Das war der ursprüngliche
Zweck der Cookies – die Umgehung der
Sessionmanagement mit PHP 4 Probleme mit dem zustandslosen HTTP.
Allerlei Missbrauch führte aber leider zu
einer allgemein schlechten Meinung über
Cookies. Auf der anderen Seite muss man
anerkennen, dass viele Sites eiskalt auf
Das Internetprotokoll HTTP arbeitet zustands- Sessions (dt. Sitzungen) dienen der Verfol- Cookies setzen und dem Benutzer da-
[Link] haben viele Entwickler sicher schon ge- gung des Nutzers über mehrere Seiten. Das durch ein „cookieloses“ Surfen sehr er-
hört, aber wie sich das in der Praxis auswirkt, ist ist notwendig, weil die Anforderung der schwert wird. Praktisch kann man heute
Daten durch den Browser und das Auslie- von einer umfassenden Akzeptanz bei nai-
für Einsteiger in die Webserverprogrammie-
fern durch den Webserver mit dem zu- ven „Normalsurfern“ sprechen.
rung nicht auf den ersten Blick zu erkennen. standslosen Protokoll HTTP erfolgt. Wenn
Die ersten Schritte in PHP sind schnell absol- der Benutzer eine Adresse in die Kopfzeile Die Session entsteht
[Link] Webseiten zu generieren, ist des Browser eintippt, erzeugt der Browser Der Begriff Session ist in diesem Zu-
mit Vorkenntnissen in anderen Programmier- daraus eine HTTP-Anforderung GET: sammenhang eher eine Definitionsfrage,
sprachen nun kein Problem [Link] Zu- es steckt tatsächlich kein Protokoll oder
GET /[Link] HTTP/1.1 eine bestimmte Technik dahinter. Wenn
sammenspiel zwischen Browser und Webserver HOST: [Link] man dem Browser in einem Cookie eine
birgt jedoch einige Tücken – einen der schwie- eindeutige Kennung übermittelt, kann
rigen Fälle lösen so genannten Sessions. Der vergessliche Server man den Benutzer über mehrere Seiten
Diese Anforderung wird dann an den ge- verfolgen. Der Browser liefert den Cookie
wünschten Webserver gesendet. Dieser immer wieder mit aus und der Server
wertet die Anforderung aus und sendet reicht diese Daten an das Skript weiter.
entweder eine Fehlermeldung oder die Diese „Verfolgung“ des Benutzers wird
Daten der angeforderten Seite. Danach allgemein als Session bezeichnet.
„vergisst“ er den Vorgang. Wenn der Be- In der Praxis werden oft noch mehr
nutzer Daten mit einem Formular sendet, Daten in der Session gespeichert. So kön-
wird der HTTP-Befehl POST verwendet. nen auf der einen Seite verschiedene For-
Der Server nimmt die Daten entgegen, mulardaten erfasst werden, die auf der
übergibt sie Ihrem PHP-Skript und „ver- nächsten Seite Aktionen auslösen. Da-
gisst“ die Verbindung wieder. nach werden auch diese Daten in der Ses-

Quellcode Wenn Sie dem Benutzer auf der näch-


sten Seite den Eintrag seiner Daten in die
sion gespeichert – man spricht dann von
Sessionvariablen. PHP 4 unterstützt diese
Der Quellcode zum Datenbank bestätigen möchten, haben Sie Aktionen durch dedizierte Funktionen.
Artikel befindet sich auf ein Problem. Das nächste Skript wird ja Das ist auch einer der größeren Fortschrit-
der beiliegenden CD. wieder, wie oben gezeigt, mit GET ange- te gegenüber PHP 3. Denn dort mussten
fordert. Für den Server beginnt ein völlig Cookies und Sessionmanagement selbst

Linux Enterprise Special PHP 53


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 54

Development Sessionmanagement
programmiert oder mit Werkzeugen wie Abb. 1: Anzeige des Cookies mit der
der PHPLIB simuliert werden. So einfach, Session-ID im Internet Explorer
wie es beim ersten Hinschauen aussieht,
ist es denn auch nicht immer. Wenn der
Browser Cookies nicht akzeptiert, funk-
tioniert das Sessionmanagement nicht
mehr. Damit das nicht passiert, gibt es Al-
ternativen. So werden Daten vom Brow-
ser immer per GET oder POST angefor-
dert, wie am Anfang beschrieben. Wenn
Sie nun an jede Anforderung die Session-
daten anhängen, braucht Sie keine Coo-
kies mehr. In einer größeren Applikation
gibt es aber Hunderte von Links und Dut-
zende von Formularen – keine leichte Ar-
beit, alle von Hand zu erweitern.

PHP macht die Arbeit


Lassen Sie solche Arbeiten deshalb von
PHP erledigen. Um eine Session aufzubau- •Kein Cookie gesendet: PHP erzeugt eine mit der Option --enable-trans-sid kompi-
en, wird zuerst eine Identifikationsnum- neue Session. liert wurde. Bei den meisten Providern, die
mer benötigt, die sogenannte Session-ID. •Cookie erkannt: PHP akzeptiert die PHP 4 unter Linux betreiben, ist dies der
Wenn eine neue Session startet, wird sie übermittelte Session-ID und erzeugt kei- Fall. Sollte Ihr PHP nicht so eingerichtet
von PHP automatisch erzeugt. Wie sich ne neue. sein, können Sie die Session-ID auch von
PHP dabei verhält, kann in der Konfigura- Hand einsetzen. Dazu fügen Sie in den
tionsdatei [Link] eingestellt werden. Keine Probleme ohne Cookies Link folgenden Code ein:
Wenn Sie Zugriff darauf haben, finden Sie Wenn der Benutzer keine Cookies zulässt,
die möglichen Schalter im Kasten „SES- müssten Sie eigentlich die aufwendige <a href=“<?=$PHP_SELF?>?<?=SID?>“>Restart</a>
SIONS KONFIGURIEREN“. Standardmäßig Methode der Erweiterung der Links und
müssen Sie eine Session mit der Funktion Formulare wählen. Dank PHP 4 müssen Beachten Sie, dass es sich bei SID um
session_start() explizit starten. Starten Sie Sie das tatsächlich nicht. Erweitern Sie eine Konstante handelt und die Kurz-
mit dem folgenden Miniskript, um sich die das bereits gezeigte Skript um einen Link: schreibweise „<?=“ nicht verändert wer-
Session-ID anzusehen: den darf. Fügen Sie SID aber nur ein, wenn
<?php die automatische Erweiterung nicht funk-
<?php session_start(); tioniert. Jetzt sollte das Sessionmanage-
session_start(); ?> ment eigentlich unter allen Umständen
?> <html>
funktionieren – und gewinnt Zeit, um ech-
<html> <body>
te Daten damit zu speichern.
<body> <?php
<?php $sessid = session_id();
$sessid = session_id(); echo „Die Session-ID ist: $sessid<br>“;
Daten mitnehmen: Mit Sicherheit
echo “Die Session-ID ist: $sessid“; echo „<a href=\“$PHP_SELF\“>Restart</a>“; Sicher haben Sie schon Daten von einer
?> ?> Seite zur nächsten „mitgenommen“. Dazu
</body> </body> wird, wenn es sich um Links handelt, fol-
</html> </html> gende Schreibweise verwendet:

Beachten Sie, dass die Funktion ses- Dieses Skript ruft sich immer wieder [Link]?parameter=wert&parameter2=wert2
sion_start() hier ganz am Anfang des selbst auf. Schalten Sie nun Cookies ab,
Skripts steht. Beim Aufruf erzeugt die müsste das Skript bei jedem Aufruf eine Da diese Zeile Bestandteil der Anforde-
Funktion die entsprechenden Kopfzeilen neue Session-ID erzeugen. PHP 4 erkennt rung per GET ist, wird dies auch als GET-
für das Cookie. Kopfzeilen müssen aber dies und behilft sich selbst. Ein Blick in den Methode bezeichnet. Die Zeichenkette ist
vor den Daten stehen. Quellcode der HTML-Seite zeigt, wie hier der so genannte QueryString. Solche
Wenn der Browser des Benutzers Coo- Hand angelegt wurde: Schlangen sind im Browser in der Adress-
kies akzeptiert, ist damit eigentlich schon Da dieses Verhalten manchmal stören zeile gut zu erkennen – und auch zu mani-
alles erledigt. Wird die Seite erneut abge- kann, ist die Option steuerbar. Das auto- pulieren. Abgesehen davon ist die Länge
rufen, gibt es nun zwei Fälle: matische Einsetzen erfolgt nur, wenn PHP auf etwa 2000 Zeichen begrenzt, danach

54 Linux Enterprise Special PHP


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 55

Sessionmanagement Development

Abb. 2: Ohne Cookies: PHP ergänzt Links automatisch um die Session ID Abb.3: Die Sessionfunktionenwerden vor oder nach dem eigentlichen
Script aufgerufen

schneidet der Browser einfach ab. Wenn den Sessionvariablen deshalb unter einem gentlichen Daten. Mehrere Variablen sind
Sie Daten benutzerabhängig übergeben eigenen Namen mit dem Präfix sess_ abge- durch Semikola getrennt.
wollen, sollten Sie sich mit Sessionvaria- legt.
blen beschäftigen. Das funktioniert dank Sessiondaten selber speichern
PHP 4 sehr einfach. Variablen, die Sie er- Wo die Daten bleiben Wenn Sie eine große, kommerzielle Site
halten möchten (sowohl der Name als Da die Inhalte der Variablen auf der planen, ist diese Form der Speicherung
auch der Inhalt wird gespeichert), „regis- nächsten Seite geradezu magisch wieder vielleicht nicht so sicher wie gewünscht
trieren“ Sie für die laufende Sitzung. Dazu auftauchen, stellt sich die Frage, wo diese und auch nicht ausreichend flexibel. PHP
wird die Funktion session_register() ver- Werte gespeichert werden. Das Session- 4 bietet deshalb die Möglichkeit, eigene
wendet. Listing 1 zeigt die Anwendung. cookie enthält, wie in Abbildung 1 ge- Handlerfunktionen zu definieren, die
Dort wird der Benutzer zur Auswahl einer zeigt, nur die Session-ID. Standardmäßig beim Aufruf von session_register() und
Farbe aufgefordert. Erst wenn er sich ent- werden diese Werte in Dateien in seriali- session_unregister() aufgerufen werden.
schieden hat, kann er per Link weiterma- sierter Form abgelegt. Gespeichert wer- Diese können eingesetzt werden, um Da-
chen. Die ausgewählte Farbe taucht schein- den sie im temporären Verzeichnis /tmp. ten in einer Datenbank zu speichern, die
bar magisch im nächsten Skript auf. Das Andere Ziele lassen sich im Abschnitt möglicherweise flexibler mit den Informa-
Beispiel mag primitiv erscheinen, denken [session] in der [Link] einstellen (siehe tionen umgeht, als ein Dateisystem. Eine
Sie aber an ein umfangreiches Formular. Kasten „Sessions konfigurieren“). andere Alternative ist das Modul „mm“,
Erst wenn alle Felder ausgefüllt und über- Die Art der Speicherung ist unspekta- das die Daten im Shared Memory spei-
prüft wurden, geht es weiter. Die Daten kulär. Der Name der Datei entspricht der chert. Allerdings steht dies nur zur Verfü-
werden nicht einfach an den Links ange- Session-ID, der Inhalt der Darstellung gung, wenn PHP 4 als Apache-Modul
hängt – clevere Benutzer könnten sie nach der Variablen, wie sie die Funktion seria- kompiliert wurde, was die Einsatzbreite
der Prüfung wieder manipulieren. Statt lize() erzeugt. In der [Link] kann mit der Skripte einschränkt.
dessen werden sie in der Session als Ses- dem Parameter [Link] fest- Interessanter ist der Einsatz eigener
sionvariablen verpackt. gelegt werden, wann dieses Verzeichnis Sessionfunktionen. Dabei werden nicht
Beim Umgang mit den Variablen soll- aufgeräumt wird – der Standardwert be- die Aufrufe zu session_register() usw. er-
ten Sie darauf achten, für jede Methode trägt 1440 Minuten (1 Tag). Zumindest setzt, sondern die dahinterliegenden Funk-
der Übertragung andere Variablennamen beim Start der ersten Versuche mit Ses- tionen. An den Skripten, die bereits mit
zu verwenden. PHP erlaubt zwar die Fest- sions ist ein Blick in dieses Verzeichnis Sessions arbeiten, müssen Sie nichts än-
legung der Reihenfolge, in der externe Da- ratsam, weil die Aktivitäten der Skripte dern. Die Definition erfolgt mit zwei
ten automatisch in Variablen übertragen gut überwacht werden können. Das be- Funktionen:
werden – im Zweifelsfall handeln Sie sich reits gezeigte Beispiel würde in der Ses-
damit aber mehr Probleme ein als es Vor- siondatei folgende Daten ablegen: session_module_name(„user“);
teile bietet. Wechseln Sie vom lokalen Sys- session_set_save_handler(‘ms_open’, ‘ms_close’, ‘ms_read’,
‘ms_write’, ‘ms_destroy’, ‘ms_gc’);
tem zu einem Provider, der keine kunden- color|s:7:“#00ff00“;
spezifische Konfiguration der [Link]
erlaubt, funktioniert das Skript nicht Die serialisierte Form einer Variablen Mit session_module_name(“user”)
mehr. Was viel schlimmer ist: Solche Feh- ist gut lesbar. Zuerst kommt der Name, wird der interne Handler abgeschaltet.
ler sind nicht auf den ersten Blick zu erken- dann nach dem senkrechten Strich der Typ Welche Funktionen nun für die Ausfüh-
nen, führen nicht zu Laufzeitfehlern und („s“ steht für string, „i“ für integer usw.), rung zuständig sind, wird mit session_
sind kaum zu debuggen. Im Listing wer- dann die aktuelle Länge und zuletzt die ei- set_save_handler() definiert. Insgesamt

Linux Enterprise Special PHP 55


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 56

Development Sessionmanagement
können sechs Funktionen definiert wer- <html> session_register(‘s’, ‘a’);
den: <body> ?>
<h3>Seitenstart</h3> <h3>Seitenende</h3>
•Öffnen – ms_open im Beispiel <?php
</body>
$sessid = session_id();
•Schließen – ms_close </html>
$x = 122;
•Zurückholen von registrierten Variablen
$s = „Test“;
– ms_read Dies erzeugt nun die in Bild 4 gezeigte
•Registrieren von Variablen – ms_write $a = array(1, 22, „acht“); Ausgabe.
•Zerstören der Session – ms_destroy session_register(‘x’); Sie sehen hier, dass der Aufruf vor
•Funktion, die von der Garbage Collec- echo „<h4>Nach erstem session_register()</h4>“; dem Beginn der Seite erfolgt – und zwar
tion aufgerufen wird – ms_gc

Bis zu diesem Punkt ist der Vorgang si- Sessionfunktionen auf einen Blick
cher sehr einfach. Was etwas mehr Arbeit bool session_start(void) Startet eine neue Session und gibt immer TRUE zu-
verursacht, ist die Definition der Funktio- rück. Dabei wird eine neue Session-ID erzeugt.
nen. An dieser Stelle versagen leider auch
string session_save_path([string path]) Setzt oder ermittelt den Pfad, unter dem die Ses-
das Handbuch und diverse Tutorials. In sion-Daten abgespeichert werden.
Listing 2 finden Sie eine Definition der
bool session_register(string name [, string ...]) Registriert Variablen für eine Sitzung. Als Argument
wichtigsten Funktionen. ms_close() hat
wird der Name der Variable angegeben, nicht die Va-
hier keine Funktion, sondern wurde nur
riable selbst.
zu Testzwecken eingesetzt. Sie können die
bool session_unregister(string varname) Hebt die Registrierung einer Variablen wieder auf.
Definition auch weglassen. Nicht benötig- Die Variable selbst wird im aktiven Skript nicht ge-
te Funktionen werden dann in session_ löscht.
set_save_handler() durch eine leere Zei- string session_name([string sessionname]) Ermittelt oder setzt den Namen der Session. Dieser
chenkette ’’’’ ersetzt. Wert wird als Name des Session-Cookies oder der
Die verwendete MySQL-Tabelle hat GET/POST-Variablen verwendet.
folgende Struktur: string session_module_name([string modulename]) Setzt oder ermittelt das Modul, mit dem die Ses-
sion-Informationen verarbeitet werden.
CREATE TABLE currentsession (
bool session_is_registered(string varname) Prüft, ob eine Variable bereits registriert ist. Als Ar-
sessionID varchar(32) NOT NULL,
gument wird der Name der Variablen als Zeichen-
usrID bigint(20) NOT NULL,
kette übergeben.
variables text NOT NULL,
bool session_decode(string data) Dekodiert die in der Session in Form einer Zeichen-
laccess int(14),
kette gespeicherten Variablen, die mit session_en-
PRIMARY KEY (sessionID),
code verpackt wurden.
KEY usrID (usrID)
); bool session_destroy(void) Löscht alle Session-Daten. Das zugehörige Cookie
wird jedoch nicht sofort gelöscht. Die angelegte
Diese Tabelle erlaubt zusätzlich noch temporäre Datei wird sofort gelöscht.
die Zuordnung einer User-ID, die regis-
string session_encode(void) Kodiert alle Daten der aktuellen Session in Form al-
trierte Benutzer einer Session zuordnet. So
ler Zeichen.
gehen die Daten nicht verloren, die bereits
anonym erfasst wurden, wenn der Benut- string session_id([string sessionid]) Für die angegebene Session (Session-Name) wird
die aktuelle Session-ID ermittelt und zurückgege-
zer sich später anmeldet. Eine solche Ver-
ben.
haltensweise ist auf vielen Sites typisch.
Setzt die aktuellen Parameter für Cookies. Diese
Um sich klar zu machen, wann welche array session_set_cookie_params(int time
Einstellung überschreibt die Werte in der [Link]
Funktion aufgerufen wird, können Sie in ………………………[, string path]
nur die Laufzeit des aktuellen Skripts.
jede selbstdefinierte Funktion eine ent- ..............................[, string domain])
sprechende echo-Anweisung setzen und array session_get_cookie_params(void) Liest die aktuellen Parameter für Cookies aus und
das Verhalten beim Ausführen eines gibt sie in einem assoziativen Array zurück.
Skripts beobachten. Das folgende Skript Void session_set_save_handler(string open, Registriert nutzerdefinierte Funktionen, die als
zeigt die Nutzung: string close, string read, string write, Routinen für die Verwaltung genutzt werden. Diese
string destroy, string gc) Werte müssen vor session_start gesetzt werden
<?php (siehe Text).

include(„session_listing_2.[Link]“); string session_cache_limiter([string limiter]) Liest oder setzt die aktuellen Einstellungen für die

session_start(); Cachesteuerung im Browser. Dieser Wert muss vor


session_start gesetzt werden.
?>

56 Linux Enterprise Special PHP


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 57

Sessionmanagement Development
ausgelöst von session_start(). Am Ende bank. Die geringe Größe der Sitzungsdaten
erfolgt dann die Speicherung der „unter- erlaubt den Einsatz verschiedener Optimie-
wegs“ registrierten Daten. Das ist wich- rungsmechanismen. Auch ein paar Hun-
tig zu wissen, weil ein Skript, das ab- dert gleichzeitig aktiver Nutzer führen nur
bricht, nicht die Registrierung ausführt. zu wenigen Kilobyte Daten. Der Aufwand
Interessant ist auch, dass die registrierten dafür ist – zumindest programmtechnisch –
Daten bereits serialisiert sind, während sehr gering. Viel mehr, als hier gezeigt wur-
Sie diese beim Lesen aus der Datenbank de, muss man zu Sessions nicht wissen.
selbst wieder herstellen müssen. Das ist
mit session_decode() aber sehr einfach.
Literatur
Zusammenfassung [1] Jörg Krause, PHP 4 –
Die Nutzung eigener Sessionfunktionen Grundlagen und Profiwissen,
kann oft eingesetzt werden, um die Leis- Carl Hanser Verlag, 2000,
tung einer Seite zu steigern, beispielsweise ISBN 3-446-21546-8
durch Auslagerung in eine anderen Daten-

Sessions konfigurieren
session.save_handler. Name der Prozedur, mit der Daten gespeichert werden. Der Stan-
dardwert ist files.

session.save_path. Pfad, in dem Dateien erzeugt werden; Standardwert ist /tmp.

[Link]. Name des Session-Cookies. Der Standardwert ist PHPSESSID.

session.auto_start. Wenn 1, startet das Session-Modul zu Beginn einer Anfrage auto-


Anzeige
matisch. Der Standardwert ist 0.

session.cookie_lifetime. Lebensdauer des Session-Cookies in Sekunden. Der Wert 0 er-


zeugt ein Cookie für die Sitzungsdauer.

session.serialize_handler Art der Serialisierung der Daten, kann z.B. „php“ oder „wddx“
sein.

session.gc_probability. Wahrscheinlichkeit, mit der die Aufräumroutine (garbage collec-


tion) startet. Der Standardwert ist 1.

session.gc_maxlifetime. Zeit in Sekunden, nach der Daten aufgeräumt werden.

session.referer_check. Referer, der bei jedem Zugriff geprüft wird. Stimmt der Referer
nicht, wird die Sitzung gelöscht und neu gestartet. Der Referer ist
die letzte Adresse, von der der Seitenabruf kommt.

session.entropy_file. Pfad zu einer Datei mit Startwerten für den Generator der Ses-
sion-IDs.

session.entropy_length. Anzahl der Bytes, die von der Datei mit den Startwerten gelesen
werden. Der Standardwert ist 0.

session.use_cookies. Wird auf 1 gesetzt, wenn Cookies verwendet werden sollen.

session.cookie_path. Pfad, der im Cookie gespeichert wird.

session.cookie_domain Domain für das Cookie.

session.cache_limiter. Methoden der Cacheverwaltung: „nocache“, „private“, „public“.


„nocache“ ist der Standardwert.

session.cache_expire. Zeit, innerhalb derer die Daten im Cache bleiben. Der Standard-
wert ist 180. Die Angabe ist wirkungslos, wenn „nocache“ einge-
stellt wurde.
LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 58

Development Formularhandling mit JavaScript

Absolut clever
ben werden dann zum Browser gesendet.
Dieser verarbeitet die Informationen –
HTML und natürlich auch JavaScript. Es
liegt dann am gesendeten Code und der
Interaktion des Benutzers, wie es weiter-
geht. Klickt der Benutzer auf einen Link,
von Jörg Krause wird dieses als HTTP-Aktion an den Web-
server gesendet. Ebenso funktioniert es
bei Formularen – die Daten werden zu-
sammengestellt und gesendet. Ein Skript
Formularhandling mit JavaScript auf dem Server kann die Daten dann ver-
arbeiten. Der Datenaustausch zwischen
beiden Welten kann also nur an zwei Stel-
len stattfinden. Beim Aufbau der Seite
können Sie Daten an JavaScript folgen-
dermaßen übergeben:
Richtig gute Webseiten entstehen, wenn Sie ei- Puristen werden beim Gedanken, Java
nen ganzheitlichen Ansatz bei der Program- Script einzusetzen, erschaudern. Die Nach- <script language=“JavaScript“>
teile sind offensichtlich: Hat der Benutzer var muster = <?php echo $muster ?>
mierung verfolgen:Kombinieren Sie clever ser- </script>
JavaScript deaktiviert oder ist der Brow-
ver- und clientseitige [Link] PHP 4 und
ser nicht von der neuesten Generation,
JavaScript stehen Ihnen zwei äußerst vielsei- gibt es Schwierigkeiten beim Einsatz. Um Der Wert der PHP-Variablen $muster
tige Sprachen mit ähnlicher Syntax zur Verfü- diese zu umgehen, müssten einige Teile des steht nun in der JavaScript-Variablen
[Link] Artikel zeigt Ihnen, wie Sie damit Codes in PHP erneut ausgeführt werden, muster zur Verfügung. Umgekehrt ist es
elegant umgehen kö[Link] Schwerpunkt z.B. beim Prüfen von Formularen. Das be- schon etwas schwieriger. Daten vom
bildet der Umgang mit [Link]- deutet doppelten Aufwand und erhöht die Client können über einen Hyperlink
Fehlerquote. (HTTP-GET), ein Formular (HTTP-
vaScript selbst ist im Web und in zahlreichen
Auf der anderen Seite gehört meiner POST) oder Cookies zum PHP-Skript ge-
Büchern exzellent dokumentiert und wird hier Meinung nach JavaScript zum festen Be- langen. Cookies scheiden hier aus – die mit
beim Leser vorausgesetzt. standteil der clientseitig verfügbaren JavaScript erzeugten haben mit den über
Techniken. Der Prozentsatz der „Verwei- HTTP gesendeten absolut nichts zu tun.
gerer“ ist gering und bei vorteilhaftem Wenn Sie sowieso ein Formular senden,
Einsatz profitiert der Benutzer davon. Vie- können Sie ihre mit JavaScript erzeugten
le Gestalter gehen inzwischen dazu über, Daten dorthinein legen:
ihre Website in zwei Versionen anzubieten
– einer sehr einfachen ohne Skriptnutzung <script language=“JavaScript“>
und einer „feature reach“-Version, die function sendform()
Flash, JavaScript und Grafik nutzt. Beob- {
[Link] = „Wert“;
achtungen zeigen, dass Benutzer die auf-
[Link]=post;
wendigste Version annehmen, wenn ihre
[Link]();
Internetzugänge dies hinsichtlich der ver-
}
fügbaren Bandbreite und Kosten gestat- </script>
ten. Mit jedem neuen ADSL-Anschluss ...
und jeder besseren Standleitung in Unter- <form action=“[Link]“ name=“myform“ onsubmit=“
nehmen wird ihre Schar größer. Bereiten sendform();“>
Sie sich auf anspruchsvolle Benutzer vor <input type=hidden name=myfield>
und lernen Sie, clientseitige Techniken mit </form>
PHP 4 zu verknüpfen.
Wenn das Formular abgesendet wird,
Prinzipielle Fragen ruft der Klick auf den Submit-Schalter die
Bevor Sie sich intensiv mit PHP 4 und Ja- JavaScript-Funktion sendform() auf. Dort
vaScript auseinandersetzen, sollten Sie wird der Wert des versteckten Feldes „my-
sich völlig klar darüber sein, wo was ab- field“ mit einem beliebigen Wert belegt und
läuft. PHP wird auf dem Server verarbei- das Formular abgesendet. Alle anderen Fel-
tet. Die mit dem Skript erzeugten Ausga- der werden unverändert verarbeitet. In

58 Linux Enterprise Special PHP


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 59

Formularhandling mit JavaScript Development

Abb. 1: Formular zu Listing 1 in Aktion Abb. 2: Die Interaktion von JavaScript und PHP funktioniert perfekt

PHP können Sie auf die Variable $myfield Das Absenden des Formulars kann man error() erfolgt die Übergabe der Ergeb-
bzw. $HTTP_POST_VARS[„myfield“] auch durch JavaScript erledigen lassen, z.B. nisse an JavaScript und die erneute Anzei-
zugreifen, um den Wert auszulesen. Verges- nach der Absolvierung aller Prüfungen: ge – ohne Bruch der Benutzerführung.
sen Sie nicht „global“, um dies auch in Abbildung 2 zeigt dieses Wechselspiel –
Funktionen sichtbar zu machen. document.<formname>.submit() beim Absenden eines leeren Feldes erfolgt
hier keine Übertragung zum Server. Mit
Mit Formularen spielen Was Sie bei der Entwicklung clientsei- wenig Aufwand ist es möglich, nun auch
JavaScript erlaubt manchmal einfach tiger Prüfungen beachten sollten, betrifft zwischen Browsern mit und ohne JavaS-
Lösungen für eine raffinierte Benutzer- eine konsistente Benutzerführung. Es ist cript zu unterscheiden. Ohne die Verfüg-
führung. Angenommen, Sie möchten auf unglücklich, zuerst mit JavaScript-seiti- barkeit von JavaScript erfolgt die Prüfung
Ihrer Webseite eine Abstimmung auf- gen Alert-Meldungen zu arbeiten und der Daten nur mit PHP. Wenn JavaScript
bauen, dann wäre ein Formular mit dem nach der Prüfung in PHP – die vielleicht aktiviert ist, profitiert der Benutzer durch
in Abbildung 1 gezeigten Aussehen so umfassender und genauer ist – rote Fehler- schnelleren Seitenaufbau und weniger
einfach wie möglich und so funktional texte auszugeben. In solchen Fällen mag Serverzugriffe.
wie nötig. Listing 1 zeigt den Code für Ihnen mit ein wenig JavaScript und dem
dieses Formular, wobei die oben bereits HTML-Objektmodell geholfen sein. Das Optimales Zusammenspiel
beschriebene Mischung aus PHP und Ja- Skript in Listing 6 zeigt Fehlermeldungen Kleine Chat-Lösungen erfreuen sich nach
vaScript mit der Wertübergabe verwen- im HTML-Text an – ebenso wie Sie dies wie vor großer Beliebtheit. Das hier vorge-
det wird. mit PHP realisieren können. Es basiert auf stellte Projekt realisiert einen Chat, der ser-
einem Layer und einem kleinen Formular: verseitig auf MySQL und PHP-Sessions
Zugriff auf Formulare basiert, clientseitig die Darstellung aber
Der Zugriff auf Formulare ist per Java <div id=“errors“></div> durch JavaScript unterstützt. Dies vermin-
Script sehr einfach. Wenn der Code im <form name=“myform“ method=“post“> dert etwas den Datentransfer zwischen
aktuellen Dokument steht, können Sie <input type=“Text“ name=“namefield“ value=“<?php echo Client und Server und bietet dadurch einen
$namefield; ?>“>
sich an folgenden Aufrufen orientieren. ähnlichen Komfort wie Chats, die auf Java
<input type=“button“ value=“Absenden“ onclick=“check()“>
Dabei ersetzen Sie <formname> durch basieren. Im Ganzen besteht der Chat aus
</form>
den Namen des Formulars (Attribut na- einer Datenbanktabelle, die alle Einträge
me=“„ im <Form>-Tag) und <feldname> der Chatter ausnimmt. Hier der Code, mit
durch den Namen eines Felds (Attribut Abgefangen wird das onClick-Ereig- dem Sie die Tabelle erzeugen können:
name=“„ im <input>-Tag). Die folgen- nis, das zur ersten Prüfung mit Java Script
den Formen erlauben den Zugriff auf den führt. In diesem Fall wird nur die Länge CREATE TABLE chat (
Feldwert: überwacht. Falls zu wenig Zeichen einge- id bigint(20) NOT NULL auto_increment,
time varchar(10) NOT NULL,
geben wurden, erscheint eine entspre-
data text,
document.<formname>.<feldname>.value = „Neuer Wert“; chende Meldung. Reicht die Anzahl der
sender varchar(32) DEFAULT ‘1’ NOT NULL,
variable = document.<formname>.<feldname>.value; Zeichen aus, wird das Formular versen-
PRIMARY KEY (id),
det – das Skript ruft sich dabei selbst auf. KEY id (id)
Die Eigenschaften des Formulars wer- In PHP erfolgen weitere Prüfungen (im );
den folgendermaßen festgelegt: Listing 6 ist dies natürlich nur angedeu-
tet). Je nach Struktur der Daten werden Neben der ID wird ein Zeitstempel ti-
document.<formname>.method = „Post“; verschiedene Meldungen in der Variablen me und der Name des Chatters sender
document.<formname>.action = „url“; $errors abgelegt. In der Funktion show_ festgehalten. In data stehen die Einträge.

Linux Enterprise Special PHP 59


LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 60

Development Formularhandling mit JavaScript


Ein Frameset baut die Chatseite auf. Abb. 3: Der Chat-
Dort wird zum einen die Session gestartet room in Aktion
und zum anderen eine JavaScript-Funk-
tion definiert, die alle aktuellen Beiträge
ausgibt. Diese Datei heißt [Link]. Sie
finden Sie in Listing 2. Die drei Frameda-
teien bedienen den Chat folgendermaßen:

•[Link]. Diese Datei ist unsichtbar. Per


JavaScript lädt sie sich alle vier Sekunden
erneut – dieser Wert ist natürlich einstell-
bar. Alle neuen Einträge, die in dieser
Zeit aufgelaufen sind, werden in das Ja-
vaScript-Array msg[] geschrieben. Sie
finden Sie in Listing 3.
•[Link] wird die Ausgabefunktion vom Browser empfangene Quelltext für beiträge auszugeben – sonst wird die Liste
im Top-Frame aufgerufen. Alle Nachrich- [Link] innerhalb des JavaScript-Ab- schnell endlos lang. Das alles ändert aber
ten, die aufgelaufen sind, werden nun an- schnitts z.B. folgendermaßen aus: nichts am Prinzip. In jedem Fall sparen Sie
gezeigt. Sie finden Sie in Listing 4. durch JavaScript die Übertragung großer
•[Link]. Neben der schon von [Link] <script language=“JavaScript“> Datenmengen bei lebendigen Diskussio-
bekannten Ausgabefunktion werden hier [Link][[Link]]=“<b>Mixer</b>: Ich komme hier selten nen und damit Bandbreite und Ladezeit.
zwei Aufgaben erledigt: Ein kleines For- vorbei“;
[Link]();
mular erfasst den Namen des Absenders Ausblick
</script>
und seine Nachricht. Diese Daten werden Der Umgang mit JavaScript gehört zum
in die Datenbank geschrieben. [Link] Handwerkszeug des PHP-Programmierers
kümmert sich dann wieder um die Dar- Es werden also nur noch alle neuen und ist genauso elementar wie ein tiefge-
stellung. Sie finden Sie in Listing 5. Daten zum Browser übertragen – und hendes Verständnis von HTML und den
nicht möglicherweise schon Hunderte von Vorgängen beim Zusammenspiel mit dem
Was genau passiert Zeilen, die im Chat bislang erzeugt wur- Webserver – also die Kenntnis der verwen-
Eine reine PHP-Lösung würde bei jedem den. Diese existieren nur in einer Java deten Protokolle. Erst die ganzheitliche Be-
Erneuern der Daten alle Frames neu laden. Script-Variablen im Top-Frame. Erst trachtung des Systems Webserver/Browser
Notwendig ist die Inanspruchnahme des wenn der Top-Frame neu geladen wird, führt zu eleganten, leistungsfähigen und si-
Servers aber nur dann, wenn die Daten im müssen auch alle Daten wieder übertra- cheren Lösungen. Jede Sprache und jeder
Ausgabeframe aktualisiert werden müs- gen werden. [Link]() Teil in diesem System hat seine spezifischen
sen – also wenn neue Einträge vorliegen – stellt das Anzeigeframe (show) neu dar – Stärken und ist für sich genommen weder
und wenn ein Benutzer selbst Daten abge- ohne auf den Server zuzugreifen. Hier besser noch schlechter als andere Teile. Die
sendet hat. Initiiert wird die Darstellung in wird nur das Array msg[] ausgelesen. Ein Aussage, bei der Formularverarbeitung auf
[Link] – alle vier Sekunden. Nach der identischer Aufruf findet sich auch in JavaScript verzichten zu können (oder
Abfrage der Datenbank erfolgt die „Ver- [Link], damit nach dem Absenden die schlimmer: zu müssen), wenn man PHP zur
längerung“ des Arrays msg[]: eigenen Daten zügig im Anzeigeframe er- Verfügung hat, ist grundsätzlich genauso
scheinen. falsch wie die grundsätzliche Verwendung
<script language=“JavaScript“> von Flash, weil HTML die Wünsche der
<?php Wie es weitergeht Designer nicht hinreichend erfüllt. Lassen
if (is_array($arrMsg)) Die vorgestellte Chatlösung ist sicher äu- Sie sich nicht von Puristen irritieren –
{
ßerst primitiv, enthält aber im Grunde alles, schauen Sie über den Tellerrand und versu-
foreach($arrMsg as $strLine)
was an grundsätzlicher Funktionalität be- chen Sie, optimale Lösungen zu finden, an-
echo „[Link][[Link]]=\“$strLine\“;\n“;
nötigt wird. Die feste Integration der Be- statt der vermeintlich reinen Lehre zu fol-
}
?>
nutzer-Pseudonyme sollten Sie durch eine gen.
[Link](); Benutzerverwaltung ersetzen. Außerdem
</script> ist die Ergänzung um Smileys, Benutzerfar-
ben und spezielle Codes im Text empfeh- Literatur
PHP 4 – Grundlagen und Profiwissen, 2000,
Beim ersten Aufruf erscheinen alle bis- lenswert. HTML sollten Sie nicht zulassen,
Carl Hanser Verlag, München,
lang veröffentlichten Beiträge. Sendet dies führt oft zu Missbrauch. Sinnvoll wäre
ISBN: 3-446-21546-8,
aber ein Benutzer einen Beitrag ab oder er- es auch, den Einstiegspunkt des Benutzers DM 99,80
folgt der automatische Refresh, sieht der festzuhalten und erst ab diesem die Chat-

60 Linux Enterprise Special PHP


LE_PHP (61-72) 23.08.2001 10:46 Uhr Seite 61

File Uploads Development


<html>
<head>
<title>File-Upload mit PHP</title>
</head>
<body>
<h3>File-Upload mit PHP</h3>
<p>
<form method=“post“ action=“[Link]“
enctype=“multipart/form-data“>
Zu &uuml;bertragende Datei:
<input type=“file“ name=“datei“><br>
<input type=“submit“ value=“&Uuml;bertragen“>
</form>
</p>
</body>
</html>

Achten Sie auf die folgenden Punkte:

•Die Versendemethode des Formulars


(method-Attribut) wurde auf post ge-
setzt. Dies ist zwingend notwendig, denn
Dateien können nicht mit GET übertra-

Geladen!
gen werden.
•Ebenfalls im <form>-Tag muss der Wert
des enctype-Attributs auf multipart/form-
data gesetzt werden, ansonsten kann die
zu übertragende Datei serverseitig nicht
ausgelesen werden.
von Christian Wenz
•Das action-Attribut des Formulars wird
auf [Link] ersetzt. Die Formular-
daten, also auch die zu übertragende
Datei-Uploads mit PHP leicht gemacht Datei, werden an dieses Skript ver-
schickt. Wir werden also im Folgenden
eine [Link] entwickeln müssen.
•Das Formularfeld, das für die Dateiüber-
tragung zuständig ist, heißt <input
Eines der seltener verwendeten HTML-Ele- Normalerweise ist es nicht im Sinne type=“file“>. Das name-Attribut ist
mente ist <input type=“file“>. Damit können des Webmasters, wenn ein Surfer Dateien hierbei wichtig; setzen Sie es auf eine ein-
auf seinen Server überspielen kann. Doch deutige Zeichenkette (in unserem Bei-
Dateien per Formular auf den Webserver über-
keine Regel ohne Ausnahmen. Stellen spiel: datei).
tragen [Link] vielen Skriptsprachen ist Sie sich beispielsweise einen Webserver
das Arbeiten mit diesen Dateien mühsam oder vor, der hinter einer Firewall steht. FTP- Im Browser wird das File-Upload-For-
erfordert externe Komponenten – nicht so bei Zugriff ist nur von hinter der Firewall aus mularfeld durch ein Eingabefeld nebst
[Link] ist es ein Leichtes, auf die Daten zuzu- möglich, also beispielsweise im Netzwerk Schaltfläche DURCHSUCHEN oder
greifen und [Link] PHP 4.0.3 der betreuenden Agentur. Weder der Kun- BROWSER dargestellt. Durch einen Klick
de noch irgendwelche anderen Personen auf diese Schaltfläche öffnet sich ein Dia-
gibt es hierzu neue Funktionen, auf die wir ei-
haben von außen Zugriff. Auf einer pass- logfenster, in dem der Benutzer die zu
nen gesonderten Blick werfen mö[Link] wortgeschützten Seite kann dem Kunden übertragende Datei per grafischer Ober-
auch Benutzer von PHP 3 kommen hier nicht zu jedoch die Möglichkeit geboten werden, fläche auswählen kann. Alternativ dazu
kurz. Dateien in ein bestimmtes Verzeichnis zu kann der Dateiname (inklusive komplet-
übertragen. Dies können HTML-Seiten tem Pfad) auch direkt in das Textfeld ein-
sein, aber auch andere Dateitypen wie et- gegeben werden.
wa PDFs oder Grafiken.
PHP-Vorbereitungen
HTML-Vorbereitungen In der [Link] (bzw. [Link] für PHP 3) fin-
Das Webinterface für dieses Szenario ist den Sie nach der Standardinstallation die
schnell erstellt: folgenden Einträge:

Linux Enterprise Special PHP 61


LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 62

Development File Uploads


upload_tmp_dir = ; temporary directory for HTTP uploaded •$datei_type – enthält den MIME-Typ Webserver übertragen worden ist und dann
files (will use system default if not specified) der Datei, beispielsweise text/html. wird die Datei kopiert bzw. verschoben.
upload_max_filesize = 2097152 ; 2 Meg default limit on file Mit der Funktion move_uploaded_file()
uploads
Wenn Sie track_vars aktiviert haben können Sie diese zwei Aktionen in einer zu-
(den entsprechenden Eintrag in der sammenfassen. Zunächst wird die Datei
Die einzelnen Abschnitte sind selbster- [Link] auf „on“ setzen), stehen Ihnen die- überprüft, wie is_uploaded_file() das tut.
klärend: Unter upload_tmp_dir geben Sie se Angaben ab PHP 4 auch im globalen Ar- Im Erfolgsfalle wird die Datei dann an die
das Verzeichnis an, in das die Dateien nach ray $HTTP_POST_FILES zur Verfü- angegebene Stelle verschoben (andernfalls
der Übertragung gespeichert werden sol- gung. Sofern das name-Attribut des wird „false“ zurückgegeben):
len. Sie sollten darauf achten, ein Ver- Datei-Upload-Formularelements weiter-
zeichnis zu wählen, in das der Webserver hin auf datei gesetzt ist, finden Sie dann die
Lese- und Schreibzugriff hat (/tmp ist eine wichtigen Informationen in den folgenden <?php
gute Idee). Ansonsten erhalten Sie beim Arrayelementen: move_uploaded_file($HTTP_POST_FILES[„datei“]
[„tmp_name“],
Experimentieren mit den weiteren Lis-
„/upload/“.$HTTP_POST_FILES[„datei“]
tings in diesem Artikel merkwürdige Feh- •$HTTP_POST_FILES[„datei“][
[„name“]);
lermeldungen. „tmp_name“] – Name der temporären
?>
Die zweite Einstellung ist upload_ Datei
max_filesize, welche die maximale Größe •$HTTP_POST_FILES[„date“][„
der zu übertragenden Dateien angibt. Da- name“] – ursprünglicher Dateiname Sie haben nun das Rüstwerkzeug, um
mit können Sie verhindern, dass böswillige •$HTTP_POST_FILES[„date“][„size“] eine per Formular übertragene Datei zu
Benutzer gigabytegroße Dateien auf Ihren – Dateigröße verschieben und somit weiterzuverwen-
Webserver übertragen und ihn damit „zu- •$HTTP_POST_FILES[„datei“][ den. Ein paar Überprüfungen, ob auch
müllen“. „type“] – MIME-Typ der Datei alles funktioniert hat, sind jedoch trotz-
Nun sind alle Vorbereitungen getätigt, dem noch Pflicht. Beim Einsatz von
und es kann losgehen. Wenn Sie das Dateien kopieren move_uploaded_file() wird ein Großteil
Beispielsformular verschicken, geschieht Wir hatten es oben bereits einmal erwähnt: dieser Aufgaben schon innerhalb dieser
Folgendes: Der Browser überträgt die For- Die übertragene Datei wird nach dem Ab- Funktion übernommen; für eine detail-
mulardaten – und damit auch die Datei – lauf des PHP-Skripts gelöscht; Sie müssen liertere Fehlermeldung müssen Sie in
auf den Webserver. Dort werden sie vom die Datei also innerhalb des Skripts an eine mehreren Schritten vorgehen:
PHP-Interpreter im unter upload_tmp_dir andere Stelle kopieren. Um eine mögliche
angegebenen temporären Verzeichnis un- Sicherheitslücke zu umgehen, sollten Sie
tergebracht und nach Abarbeitung des zunächst mit is_uploaded_file() überprü- <?php
PHP-Skripts wieder gelöscht. Damit ist die fen, ob die Datei auch wirklich via Formu- if (is_uploaded_file($HTTP_POST_FILES[„datei“]
[„tmp_name“])) {
noch zu erledigende Arbeit klar: Die Datei lar übertragen worden ist und ob nicht ein
if (move($HTTP_POST_FILES[„datei“][„tmp_name“],
muss – bevor sie gelöscht wird – noch „in Si- böswilliger Zeitgenosse versucht, Ihr Sys-
„/upload/“.$HTTP_POST_FILES[„datei“][„name“]))
cherheit gebracht“ werden. tem zu beschädigen. Diese Funktion steht
{ echo „Upload ok!“;
aber erst ab PHP-Version 3.0.17 bzw. 4.0.3 } else {
Zugriff mit PHP zur Verfügung: echo „Kann Datei nicht verschieben! Rechteproblem?“;
Werfen Sie noch einmal einen Blick auf das }
name-Attribut des Datei-Upload-Formu- } else {
larelements. Dies lautete datei. Ihnen ste- <?php echo „Keine Datei &uuml;bertragen!“;
hen nun von PHP aus die folgenden if (is_uploaded_file($HTTP_POST_FILES[„datei“] }
[„tmp_name“])) { ?>
Variablen zur Verfügung:
copy($HTTP_POST_FILES[„datei“][„tmp_name“],
Je nach Bedarf empfiehlt es sich auch,
„/upload/“.$HTTP_POST_FILES[„datei“][„name“]);
•$datei – enthält den Namen der übertra- mittels file_exists(/upload/.$HTTP_POST
}
genen Datei, die sich im angegebenen ?>
_FILES[date][name]) zu überprüfen, ob
temporären Verzeichnis befindet. Sofern die Zieldatei bereits existiert; bei manchen
keine Datei übertragen worden ist, ent- Stellen Sie unbedingt sicher, dass der Anwendungen sollte diese dann nicht über-
hält die Variable den Wert none. PHP-Interpreter Schreibrechte in das Uplo- schrieben werden.
•$datei_name – enthält den originalen ad-Verzeichnis besitzt, sonst erhalten Sie Christian Wenz ist freier Systement-
Namen der Datei im System des die Fehlermeldung „permission denied“, wickler sowie Autor und Co-Autor von
Benutzers, der das Formular abgeschickt möglicherweise auch in einer anderen Spra- über 20 Computerbüchern, unter ande-
hat. che. rem dem Bestseller ‘PHP4’ im Verlag
•$datei_size – enthält die Größe der über- In obigem Listing wird zunächst über- Markt+Technik. Er ist erreichbar unter
tragenen Datei in Bytes. prüft, ob die Datei per Formular auf den christian_wenz@[Link].

62 Linux Enterprise Special PHP


LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 63

Anzeige
LinuxAbo_Doppelseite 23.08.2001 9:56 Uhr Seite 2
LinuxAbo_Doppelseite 23.08.2001 9:56 Uhr Seite 2

Anzeige
LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 66

Development Shellscripts mit Usereingaben

PHP-Shellskripts
die Möglichkeit, situationsabhängige
Daten zur Laufzeit über eine Eingabeauf-
forderung eingeben zu können, sehr hilf-
reich.
In PHP gibt es grundsätzlich zwei Al-

mitUsereingaben
ternativen zum Lesen von der Standard-
eingabe:

Pseudoprotokoll php://
Ab PHP3 können Usereingaben über das
Pseudoprotokoll php:// verarbeitet wer-
von Christiane Schmidt-Köster den. Die Standardeingabe wird hierfür
wie eine ganz normale Datei aus dem
Skript heraus mit fopen() geöffnet. Mit
Hilfe von fgets() kann dann das Warten
Lesen aus der Standardeingabe mit PHP des Skriptes auf Eingaben hervorgerufen
werden. Nach Betätigen der Entertaste
kann der Rückgabewert von fgets() – also
die Usereingabe – wie gewohnt ausge-
wertet werden. Dieser enthält auch
das/die Steuerzeichen für den Zeilenum-
bruch!
Lesen aus der Standardeingabe über
das Pseudoprotokoll php:// ist sowohl un-
ter Windows, als auch unter Unix/Linux
möglich. Ein Beispiel:

#!/usr/local/bin/php
Auch mit PHP sind Shellskripts möglich, die Voraussetzung für PHP-Shellskripts ist <?php

gerne dazu verwendet werden, um automati- die CGI-Variante von PHP, die als Standa-
echo „Ihr Name: „;
lone-Binary im Programmpfad liegen
sierte Vorgänge abzuwickeln, oder um aufwen-
sollte. Es ist übrigens kein Problem, die
if ($fp = fopen(„php://stdin“,“r“)) {
dige Administrationsarbeiten zu erleichtern. CGI-Binary und PHP als Apache-Modul $line = fgets($fp,100);
Gerade bei letzteren kann es nützlich sein, auf einem Server parallel zu betreiben. fclose($fp);
wenn dort auch Usereingaben verarbeitet wer- PHP-Skripts können dann durch gemein- }
samen Aufruf mit der Binary (php script-
den kö[Link] kann zum einen eine einfache
[Link]) interpretiert und ausgeführt $name = ereg_replace(„[\n\r]“, ‘’, $line);
Nachfrage aus Sicherheitsgründen vor kriti- werden. Auf Unix/Linux-Systemen ist es
schen Operationen sein („Möchten Sie wirk- sogar möglich, solche Skripte durch An- echo „Hallo $name !“ ;

lich....? (j/n)“), zum anderen wäre es denkbar, gabe des Pfades zur Binary in der ersten
?>
Zeile (z.B. #!/usr/local/bin/php) nach Set-
bestimmte Informationen erst zur Laufzeit des
zen des Ausführungsrechts wie jedes an-
Skriptes abzufragen, die dann den weiteren dere Shellskript zu starten. Anmerkung: Ähnlich funktionieren
Verlauf des Skriptes beeinfl[Link] Menü- Während viele PHP-Shellskripts für php://stdout und php://stderr.
gesteuerte Abläufe sind auf diese Weise mög- wiederkehrende Aktionen mithilfe des
Dämons Cron eingesetzt werden, z.B. zur Funktion readline() und Verwandte
[Link] nützlich zum Schnelltest von
Datenbankbereinigung, ist es manchmal Ab PHP 4 >= 4.0b4 kann über die Funk-
PHP-Features ist außerdem ein Skript, das PHP- sinnvoll, solche Skripts direkt aufzuru- tion readline() von der Standardeingabe
Code aus der Standardeingabe entgegen fen, um administrative Jobs abzuwi- gelesen werden. Die Funktion ist Teil der
nimmt und diesen sofort ausführt. ckeln. Skripte, die über das Apache- PHP-Readline-Extension, die ein Inter-
Modul ausgeführt werden, sind in die- face zur GNU Readline Library darstellt
sem Fall oft nicht geeignet, da weiterge- und in voller Funktionalität nur auf
hende Rechte benötigt werden, als Unix/Linux-Systemen zur Verfügung
dem Apache-User zur Verfügung stehen. steht. Analog zu anderen Extensions muss
Gerade für solche PHP-Shellskripts ist PHP in diesem Fall mit der Option --with-

66 Linux Enterprise Special PHP


LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 67

Shellscripts mit Usereingaben Development


readline kompiliert werden. Da die GNU •boolean readline_read_history (string fi- mandos entgegen (Abbruch mit leerer
Readline Library als Grundlage dient, lename) – schreibt die History in eine Da- Eingabe) und führt den Code anschlie-
muss diese selbstverständlich im System tei ßend sofort aus. Auf diese Weise spart
zur Verfügung stehen. Syntax: sich so mancher Programmierer das Er-
Eine Gesamtübersicht aller Readline-Funk- stellen zahlloser Files zu Testzwecken,
string readline ([string prompt]) tionen findet man unter [Link]/ die anschließend ohnehin gleich wieder
manual/[Link]. gelöscht werden.
Als optionaler Parameter kann der Als Beispiel für die Anwendung der
Funktion der gewünschte Prompt mitgege- Funktionen dient das folgende kleine #!/usr/local/bin/php
ben werden. Als Rückgabewert erhält Skript: <?php

man den vom User eingegebenen String oh-


#!/usr/local/bin/php if (is_file(„.php_history“)) {
ne Steuerzeichen für den Zeilenumbruch:
<?php readline_read_history („.php_history“);
}

#!/usr/local/bin/php //read command history from file


if (is_file(„.php_history“)) { //get command(s) from user
<?php
readline_read_history („.php_history“); $cmdarr = array();
} $cmd = readline („Command(s):\n“);
$name = readline(„Ihr Name: „);
while ($cmd) {
//get command(s) from user $cmdarr[] = $cmd;
echo „Hallo $name !“ ;
$cmd = readline („Command: „); readline_add_history ($cmd);
$cmd = readline ();
?>
//add command to history }

Zusätzlich gibt es noch weitere an die readline_add_history ($cmd);


//execute command(s)
GNU Readline Library angelehnte Funk-
//dump history echo „Eval command(s):\n“;
tionen, die zum Erstellen einer Komman- $cnt = count($cmdarr);
echo „\n\nHistory: „;
do-History ähnlich der History in der for ($i=0; $i<$cnt; $i++) {
print_r (readline_list_history());
Korn-Shell dienen. Dabei werden alle ein- eval („$cmdarr[$i];“);
gegebenen Kommandos gespeichert //dump variables }
und stehen bei der nächsten Eingabe bei- echo „\n\nReadline-Info: „;
spielsweise über die Pfeiltasten wieder zur print_r (readline_info()); //write command history to file
Verfügung. Zum Merken der History über readline_write_history („.php_history“);
die Laufzeit des Skriptes hinaus dienen //write command history to file
?>
Funktionen zum Schreiben in bzw. Lesen readline_write_history („.php_history“);
aus Dateien. Die History-Funktionalität
kann z.B. nützlich sein, um dem User ?> Anmerkung:
Mehrfacheingaben von längeren Strings In jüngster Zeit gab es bei den PHP-
zu erleichtern oder zur Korrektur von Dort wird zunächst – falls vorhanden – ei- Entwicklern Diskussionen um die Readli-
Tippfehlern bei der Eingabe verwendet ne Eingaben-History aus einer Datei ein- ne-Extension. Die GNU Readline
werden. Hier eine kurze Übersicht weiterer gelesen. Danach kann eine weitere Einga- Library läuft unter der GNU GENERAL
Funktionen der Readline-Extension: be gemacht werden, wobei man hier aus PUBLIC LICENSE, und es könnte zu
den vorhandenen Einträgen in der History Konflikten mit der PHP-Lizensierung
•mixed readline_info ([string varname wählen kann und nur bei Bedarf eine wirk- kommen. Daher wird überlegt, die Exten-
[, string newvalue]]) – Anzeigen/Setzen lich neue Eingabe tippen muss. Die sion in einem der nächsten PHP-Releases
verschiedener interner Readline-Varia- Usereingabe wird nach Betätigen der En- entweder ganz zu entfernen oder sie
blen tertaste in die bestehende History aufge- durch freie Alternativen (z.B. von
•void readline_add_history (string line) – nommen und am Ende des Skripts mit den FreeBSD) zu ersetzen. Mit Syntax-Ände-
fügt eine Eingabe der History hinzu übrigen Einträgen in die History-Datei ge- rungen muss also gerechnet werden.
•boolean readline_clear_history (void ) – schrieben. Zwischendurch werden zur In- Christiane Schmidt-Köster entwickelt,
leert die History formation alle vorhandenen Einträge und zusätzlich zu ihrer Teilzeittätigkeit als
•array readline_list_history (void ) – gibt internen Variablen auf den Bildschirm Informatikassistentin, PHP/MySQL Ap-
ein Array aller Elemente der History zu- ausgegeben. plikationen für die Xonline GmbH in
rück Als besonders nützlich zum Testen Aachen. Dort arbeitet sie unter anderem
•boolean readline_read_history (string file- und Ausprobieren von PHP-Funktionen als technische Projektleiterin für www.
name) – liest eine neue History aus einer kann sich das nun folgende Skript erwei- [Link]. Sie ist erreichbar unter
Datei ein sen. Es nimmt beliebig viele PHP-Kom- christiane@[Link].

Linux Enterprise Special PHP 67


LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 68

Development Dynamische Grafiken

Ein Bild sagt


de Bibliotheken nötig: libpng, zlib und
jpeg-6b. Diese Bibliotheken werden von
GD vorausgesetzt und sind wohl bei prak-
tisch allen Distributionen schon mitinstal-
liert. Daneben kann zur Verwendung von

mehr als
True Type Fonts die FreeType Bibliothek
mittels --with-ttf eingebunden werden, die
Unterstützung für Adobe T1-Fonts wird
mittels der T1-Bibliothek und dem Para-
meter --with-t1lib eingebunden.

1.000 Worte von Andreas Stübinger


Ein erstes Programm
Nach dem Übersetzen und Installieren
von PHP kann auch schon mit der Erzeu-
gung von Grafiken per PHP begonnen
werden:

<?php

Dynamische Grafiken mit GD in PHP $im = ImageCreate(20, 150);


$back_color = ImageColorAllocate($im, 255, 255, 255);
$text_color = ImageColorAllocate($im, 233, 14, 91);
ImageStringUp($im, 1, 1, 125, „Hello World using GD in
PHP.“, $text_color);

Header(„Content-type: image/png“);
Mittels PHP erhält der Webentwickler ein An dieser Stelle sind die Imaging Functions ImagePNG($im);
Werkzeug, das viele Möglichkeiten bietet. von PHP die richtige Wahl. Sie stellen eine ImageDestroy($im);
Schnittstelle zu GD dar. GD wiederum ist ?>
Durch die einfache Programmierung erhält ein eine Bibliothek, die Funktionen zur Erzeu-
Anfänger sehr schnell Erfolgserlebnisse, für ei- gung und Bearbeitung von Bitmapgrafiken Um ein Bild erzeugen zu können, muss
nen Profi bietet PHP genug [Link] Da- zur Verfügung stellt. An Bitmap Formaten zunächst eine entsprechende Datenstruk-
ten effektvoll und leicht verständlich darstellen werden JPEG, PNG und WBMP unter- tur angelegt werden. Der Aufruf Image-
stützt. Das GIF-Format wurde früher Create erwartet hierzu die Breite und Höhe
zu können, werden Möglichkeiten benötigt, unterstützt, dann aber zugunsten von der zu erzeugenden Grafik in Pixeln und
diese Daten grafisch [Link] die Da- PNG entfernt, unter anderem um mög- gibt bei Erfolg einen Handle zurück, der
ten jedoch dynamisch sind, sind vordefinierte lichen Lizenzforderungen von UNISYS, für alle nachfolgenden Aufrufe als Parame-
Bitmapgrafiken hier nicht mehr ausreichend. dem Inhaber eines Patentes auf den im ter zu verwenden ist. Der Ursprung des Ko-
GIF-Format verwendeten LZW-Kompres- ordinatensystems befindet sich in der lin-
sions-Algorithmus, entgegenzuwirken. ken oberen Ecke. In dem obigen Beispiel
werden dann jeweils durch Angabe von
Installation Rot-, Grün- und Blauanteil die Hinter-
Die Installation erfolgt analog zur Instal- grundfarbe weiß und als Textfarbe eine Art
lation aller anderen Schnittstellen von rot vereinbart und ein Text erzeugt. Dane-
PHP über einen Parameter beim ./configu- ben kann ein Bild auch von einem schon
re. Für GD ist dies der Parameter --with- vorhandenen Bild generiert werden. Hier-
gd. Damit wird die Schnittstelle zu GD in zu dienen die Funktionen ImageCreate-
PHP eingebunden. Wie in [ST01] be- FromJPEG und ImageCreateFromPNG,
schrieben, kann es nötig sein, den Pfad zu die ebenfalls einen Handle auf die erzeugte
GD mittels --with-gd=path_to_gd anzu- Datenstruktur zurückgeben. Zu beachten
geben, falls GD vom configure-Skript ist bei Verwendung der letzten beiden
nicht gefunden werden kann. Auch ist es Funktionen, dass zuerst das Bild von der
möglich, die Schnittstelle zu GD mittels externen Quelle angelegt wird, und erst
shared als dynamisch ladbare Bibliothek danach eigene Farben mittels ImageColor-
einzubinden. Auf die Installation von GD Allocate angefordert werden.
selbst soll hier nicht genauer eingegangen Um das erzeugte Bild vom Server an
werden, es sind jedoch mindestens folgen- den Client zu schicken, werden die letzten

68 Linux Enterprise Special PHP


LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 69

Dynamische Grafiken Development


...
drei Befehle im Skript verwendet. Zu- $green = hexdec($cols[„2“]);
<?php $blue = hexdec($cols[„3“]);
nächst ist dem Client mitzuteilen, was er
... return ImageColorAllocate($im, $red, $green, $blue);
da eigentlich bekommt. Dies erledigt die $description = „ ..... „; // z.B. aus einer Datenbank }
Funktion Header. Vor dem Aufruf von $color = „#FFFF00“;
Header darf jedoch nichts an den Client ...
ausgegeben werden, sonst meldet PHP ei- $params = „text=“ . urlencode($description) Damit können die von HTML-Tags
nen Fehler. Das bedeutet, es dürfen auch .“&color=“ . urlencode($color); bekannten Farbcodierungen direkt beim
keinerlei Debuggingmeldungen mittels echo „<img src=\“create_button.php?$params\“>“; Aufruf des Skripts verwendet werden, d.h.
z.B. echo ausgegeben werden. Aber auch ... aus einem color=#FFFF00 bei Aufruf von
ein möglicherweise um den PHP-Code HTMLImageColorAllocate wird die Far-
vorhandenes HTML darf zu keiner Aus- Die an create_button.php übergebe- be gelb angelegt. Zu beachten ist, dass GD
gabe führen. Das einleitende PHP-Tag nen Parameter werden mittels urlencode innerhalb eines Bildes bis zu 256 unter-
<?php wird deshalb normalerweise gleich zur Übertragung vorbereitet und an den schiedliche Farben unterstützt. Falls eine
in der ersten Zeile des grafikerzeugenden Aufruf des Skripts angehängt. Das Skript Farbe mittels ImageColorAllocate nicht
PHP-Skripts zu finden sein. Sodann wird create_button.php zur Erzeugung der ei- mehr angelegt werden kann, so wird -1 zu-
mittels ImagePNG aus der internen Dar- gentlichen Grafik ähnelt dem vorhin ge- rückgegeben. Dann kann mittels Image
stellung der Grafik ein Bytestrom erzeugt, zeigten, diesmal jedoch erwartet es zwei ColorClosest der Index auf die ähnlichste
der an den Client geschickt wird. In obi- Parameter: Farbe eingesehen werden (siehe auch Lis-
gem Beispiel wird hierfür das Format ting 2, Funktion ImageHSVColor Allo-
PNG verwendet. Sauberer Programmie- <?php cate).
rung entsprechend, wird der von Image- if(!isset($text) || !isset($color)) die(„Fehler“); Für Tests über die Kommandozeile
Create angelegte Speicherbereich mittels mittels einem stand-alone-PHP (siehe auch
$im = ImageCreate(150, 100);
ImageDestroy am Ende wieder freigege- [ST01]) ist ein Aufruf an folgende Funktion
$back_color = ImageColorAllocate($im, 255, 255, 255);
ben. zum Setzen der Variablen vor der ersten if-
$text_color = HTMLImageColorAllocate($im, urldecode
Ist das oben dargestellte Skript als Da- Abfrage günstig. Man beachte hierbei die
($color));
tei create_image.php abgelegt, kann es in ImageString($im, 1, 5, 5, urldecode($text), $text_color);
Verwendung von $$b, um die globalen Va-
einem HTML-Dokument wie folgt einge- riablen erzeugen zu können. Eine andere
setzt werden: Header(„Content-type: image/png“); Möglichkeit wäre die direkte Verwendung
ImagePNG($im); von $GLOBALS[$bb] gewesen.
.... ImageDestroy($im);
<img src=“create_image.php“> ?> function SetVariablesFromCmdLine($argv1) {
.... $a = explode(‘&’, $argv1);
Die Fehlerbehandlung ist hier nur ru- for($i = 0; $i != count($a); $i++) {
$b = explode(‘=’, $a[$i]);
Damit wird das Bild in der Anzeige auf dimentär ausgeführt. Vor Verwendung
global $$b[0];
dem Client ebenso behandelt, wie jedes der Parameter müssen diese mittels urlde-
$$b[0] = $b[1];
normale Bild, das als PNG oder JPEG auf code wieder decodiert werden. Je nach-
}
dem Server vorhanden ist. Der Client er- dem, ob auch Umlaute angezeigt werden }
fährt nicht, dass das Bild zur Laufzeit er- sollen, kann eine weitere kleine Routine,
zeugt wurde. die beispielsweise &auml; nach ä umwan- Nun muss nicht jedes Mal über den
delt, sinnvoll sein. WWW-Server getestet werden, sondern
Und jetzt dynamisch die Bilderzeugung kann direkt in der
Nun ist ein statisches Bild alleine nicht Kleine Hilfen Kommandozeile überprüft werden:
sehr viel wert, auch ist PHP hier das Da die Schnittstelle zur Definition von
falsche Mittel der Wahl. Erst mittels Farben die Teilfarben Rot, Grün und Blau ./php -q ./create_button ‘text=ein&text&color=#FF0000’
der Verwendung von Parametern wird als einzelne Parameter erwartet, wurde >[Link]
die Verwendung von GD in PHP inter- im obigen Skript eine Funktion HTML-
essant. Parameter können über verschie- ImageColorAllocate verwendet, die aus Das -q unterdrückt die Erzeugung der
dene Wege zwischen HTML-Seiten über- der in HTML üblichen Schreibweise die Headerinformation, die einfachen Hoch-
geben werden, jedoch wird zur entsprechenden Werte extrahiert und die kommata halten die Shell davon ab, die
Bilderzeugung wohl meist der Weg der Farbe dann anlegt: normalerweise durchgeführte Variablen-
GET-Parameter verwendet werden. Um substitution durchzuführen. Durch den
nun eine beschriftete Grafik z.B. zur Ver- function HTMLImageColorAllocate($im, $html_string) { einmaligen Aufruf von SetVariables
wendung als Schaltfläche zu erzeugen, ereg( „([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})“, FromCmdLine($argv[1]) vor den ersten
könnte das aufgerufene Skript wie folgt $html_string, $cols ); Tests stehen die normalerweise bei GET-
aussehen: $red = hexdec($cols[„1“]); Methoden automatisch gesetzten Varia-

Linux Enterprise Special PHP 69


LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 70

Development Dynamische Grafiken


Listing 1 Listing 2
? <?php
/** file [Link] /** file [Link]
* Create a rotating text using rainbow colors.
* Create a graphical button for use in a navigation bar. */
* @params $text The text to show in button function blue_value($hue, $r) {
* @params $barCol The color to use for underlining bar $x = 0.0;
* @params $barHighCol The color to use iff highlight this bar if($hue >= 360.0) $hue = $hue - 360.0;
* @params $active Active buttons have to be highlighted if($hue < 0.0) $hue = $hue + 360.0;
*/
if ($hue < 120.0) $x = 0.0;
/** Allocate a color described by an HTML color string. else if($hue < 180.0) $x = ($hue - 120.0) / 60.0;
* @params $im The GD image structure. else if($hue < 300.0) $x = 1.0;
* @params $hexstring The HTML color string, i.e. FFFF00 else $x = 1.0 - ($hue - 300.0) / 60.0;
*/ return $x * $r + 1.0 - $r;
function HTMLImageColorAllocate($im, $hexstring) { }
ereg( „([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})“, $hexstring, $cols );
/** Allocate a color out of the rainbow color circle.
$red = hexdec($cols[„1“]);
* If the exact color is not available the next best color is chosen.
$green = hexdec($cols[„2“]);
* @param $hue Position of color in the 360 degree color circle
$blue = hexdec($cols[„3“]);
* @param $saturation Dominance of hue in the color.
return ImageColorAllocate($im, $red, $green, $blue);
* @param $intensity Intensity of light in color.
}
*/
// Replace HTML umlaut descriptions to direct umlauts function ImageHSVColorAllocate($im, $hue, $saturation, $intensity){
$text = str_replace(„&auml;“, „ä“, $text); $red = blue_value($hue + 240.0, $saturation) * $intensity;
$text = str_replace(„&Auml;“, „Ä“, $text); $green = blue_value($hue + 120.0, $saturation) * $intensity;
$text = str_replace(„&ouml;“, „ö“, $text); $blue = blue_value($hue , $saturation) * $intensity;
$text = str_replace(„&Ouml;“, „Ö“, $text);
$c = ImageColorAllocate($im, $red, $green, $blue);
$text = str_replace(„&uuml;“, „ü“, $text);
if($c == -1) {
$text = str_replace(„&Uuml;“, „Ü“, $text);
$c = ImageColorClosest($im, $red, $green, $blue);
$text = str_replace(„&szlig;“, „ß“, $text);
}
$barCol = urldecode($barCol); return $c;
$barHighCol = urldecode($barHighCol); }
// Compute size of text and allocate image $font = „/usr/X11R6/lib/X11/fonts/[Link]“;
// $fontsize = 15;
$font = „/usr/X11R6/lib/X11/fonts/truetype/[Link]“; $text = „ Hello from PHP/GD“;
$fontsize = 13;
// Compute size of text box
$size = ImageTTFBBox($fontsize, 0, $font, $text);
$size = ImageTTFBBox($fontsize, 0, $font, $text);
$xsize = $size[2] - $size[0] + 20; // add some additional space
$xsize = $size[2] - $size[0] + 20; // add some additional space
$im = imagecreate($xsize, 26);
// Create image with enough size to hold circle
// Allocate colors
$im = imagecreate($xsize*2, $xsize*2);
//
$white = ImageColorAllocate($im, 255, 255, 255); // Allocate basic colors
$barUnderText = HTMLImageColorAllocate($im, $barCol); $white = ImageColorAllocate($im, 255, 255, 255);
$selectedBarUnderText = HTMLImageColorAllocate($im, $barHighCol); $black = ImageColorAllocate($im, 0, 0, 0);
$black = ImageColorAllocate($im, 0, 0, 0); // Allocate rainbow colors
// Create image for($i = 0; $i < 36; $i++) {
// $cn = (360.0 * $i) / 35.0;
ImageTTFText($im, $fontsize, 0, 0, 10, $black, $font, $text); $color = ImageHSVColorAllocate($im, $cn, 1.0, 255.0);
ImageFilledRectangle($im, 0, 20, $xsize, 26, $barUnderText); }
// // Create image
if($active == 1) { for($i = 0; $i < 36; $i++) {
// Button is active, draw an additional underbar for highlighting $cn = (360.0 * $i) / 35.0;
// Remove the above added 20 to get smaller highlighting bar $color = ImageHSVColorAllocate($im, $cn, 1.0, 255.0);
ImageFilledRectangle($im, 0, 15, $xsize - 20, 19, $selectedBarUnderText);
} $angle = $i * 10.0; // Drawing angle
// Now output the graphic back to client ImageTTFText($im, $fontsize, $angle, $xsize, $xsize, $color, $font, $text);
// }
Header(„Content-type: image/png“);
// Now output the graphic back to client
ImagePNG($im);
Header(„Content-type: image/png“);
ImageDestroy($im);
ImagePNG($im);
?>
ImageDestroy($im);
?>

70 Linux Enterprise Special PHP


LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 71

Dynamische Grafiken Development


blen auch in der Kommandozeilenversion Abb. 2: Verschie-
von PHP zur Verfügung. Das Bild wird als dene Möglichkei-
ten von Farbe und
Binärstrom über stdout ausgegeben, wes- Schrift
halb dieser Strom mittels „>“ auf eine Da-
tei umgelenkt wird. Eine andere Möglich-
keit, die jedoch einen weiteren Eingriff in
das Skript bedeutet, ist die Verwendung
des zweiten Parameters von ImagePNG,
mit dem die Datei angegeben werden
kann, auf die der Bytestrom, d.h. das Bild,
zu schreiben ist.
Zum Bildererzeugen gibt es nun eine
ganze Reihe von Befehlen. So zum Beispiel
um Linien, Kurven oder Polygone zu er-
zeugen oder auszufüllen. Auch Informa-
tionen über das zu bearbeitende Bild kön-
nen angefordert werden, wie z.B. Höhe
und Breite oder auch verwendete Farben.
Genauere Informationen über Verwen-
dung und Schnittstellen finden sich im
Handbuch zu PHP.

Verwendung von Schrift


Neben dem Erzeugen und Bearbeiten von
Zeichnungen stellt GD auch verschiedene zu sein, dass für ImageCreate die Größe Die Addition von 20 bzw. 10 ver-
Möglichkeiten zur Beschriftung zur Ver- des Bildes bekannt sein muss. Die zur Dar- schafft noch etwas zusätzlichen Platz um
fügung: stellung des Textes benötigte Größe hängt den eigentlichen Text herum. Wie schon
jedoch wiederum von dem verwendeten beim einführenden Beispiel erwähnt, ist
•eingebaute Bitmap Fonts mittels Image- Font und dessen Laufweite ab, die mittels noch eine Routine zu empfehlen, die
String ImageTTFText aber erst nach Anlegen des HTML-codierte Umlaute wie &auml;
•T1 Fonts mittels ImagePSText Bildes ermittelt werden kann. Die Lösung nach ä usw. im Text umcodieren, damit
•True Type Fonts mittels ImageTTFText. stellt die Funktion ImageTTFBBox dar. auch wirklich der Umlaut und nicht seine
Mit ihrer Hilfe ist es möglich, zunächst die HTML-Beschreibung ausgegeben wird.
Neben den einfach anwendbaren fünf Höhe und Breite eines Textes zu berech- In Listing 1 ist das gesamte PHP-Skript für
internen Bitmap-Fonts, die nicht rotierbar nen, um diese dann bei ImageCreate zu Schaltflächen nochmals dargestellt. Hier
sind, ist der Einsatz von True Type-Fonts verwenden: ist zusätzlich vorgesehen, dass die aktuell
einfach und liefert dennoch sehr hochwer- ausgewählte Schaltfläche, die so genannte
tige Beschriftungen. Voraussetzung ist die $font = „/path/to/fonts/[Link]“; aktive Schaltfläche, noch unterstrichen
eingangs erwähnte eingebaute True-Type- $fontsize = 13; dargestellt wird. Der Aufruf kann auf die-
Unterstützung mittels FreeType. Dann ge- se Weise erfolgen:
....
nügen folgende Zeilen, um eine Graphik
zu beschriften: <img src=“create-
$size = ImageTTFBBox($fontsize, 0, $font, $text);
[Link]?text=Schalter1&barCol=FFFF00&barHighCol=FFFFF0
$font = „/path/to/fonts/[Link]“; &active=0“>
$fontSize = 13; Die Funktion ImageTTFBBox liefert
als Ergebnis ein Array von Koordinaten Dem Skript werden der Text, die bei-
....
zurück, die die Bounding Box um den den Farben und das Active-Flag überge-
Text beschreiben. Daraus lässt sich der ben. Diesen „Aufrufschlauch“ erzeugt
ImageTTFText($im, $fontSize, $rotAngle, $x, $y,
für den Text benötigte Platz errechnen. man am besten wiederum über eine kleine
$textColor, $font, $text);
Danach kann das Bild selbst angelegt Funktion in PHP:
werden:
Ein Problem bei der dynamischen Er- <?php
zeugung von beschrifteten Auswahlfel- $xsize = $size[2] - $size[0] + 20; function CreateButton($text, $link, $active) {
dern, die normalerweise nur den Schrift- $ysize = $size[5] - $size[3] + 10; $params=“text=“ . $text .
zug selbst enthalten, scheint es zunächst $im = ImageCreate($xsize, $ysize); „&barCol=00FF00&barHighCol=FF0000“;

Linux Enterprise Special PHP 71


LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 72

Development Dynamische Grafiken


if($active==1) { GD Version nur mit 256 Farben arbeitet,
$params .= „&active=1“; die hier nicht mehr ausreichend sind. Das
} kommt dadurch zustande, dass zur Be-
$s = „<a href=\“„ . $link . „\“>“
rechnung der True Type Schrift nicht nur
.“<img src=\“[Link]?$params\“
die im Aufruf von ImageTTFText angege-
BORDER=0>“;
return $s;
bene Farbe verwendet wird. Zum Glätten
} der Schrift werden noch weitere Farben
angefordert, wie eine Vergrößerung des
Abb 1.: Vertauschte Active-Parameter beim
Bildes sehr schnell zeigt. Deshalb müssen Create-Button
echo CreateButton(„Seite1“, „[Link]“, 0); hier vor dem Erzeugen der rotierten Schrift
echo CreateButton(„Seite2“, „[Link]“, 1); die für den Regenbogen benötigten Farben
einmal angefordert werden, sodass
?> diese Farben auch wirklich alle verfügbar diese grafisch anzeigen und mit anderen
sind. In der Routine ImageHSVColorAllo- Werten vergleichen.
Damit ist jedoch nur der Code für sei- cate wird dann der Rückgabewert von Dr. Andreas Stübinger ist Senior Engi-
[Link] gezeigt. Der Code für [Link] ImageColorAllocate abgeprüft, ob die ge- neer bei der Siemens AG in München und
ist analog mit vertauschten Active-Para- wünschte Farbe noch angelegt werden beschäftigt sich mit Graph Drawing
metern beim Create-Button. Die beiden konnte. Falls dies nicht mehr der Fall ist, so und diskreter Optimierung. Er kann per
Seiten zeigt Abbildung 1. wird mittels ImageColorClosest die farb- eMmail über [Link]@mchp.
D.h. je nachdem welche der beiden Sei- lich passende Farbe angefordert. [Link] erreicht werden.
ten aktuell angezeigt wird, ist die entspre-
chende Beschriftung unterstrichen. Mit Fazit
diesem Mechanismus ist die Unterschei- Mittels der Imaging-Funktionen, die auf
dung und Anwahl der verschiedenen Fol-
geseiten für einen Leser sehr übersichtlich
GD basieren, stellt PHP eine sehr einfa-
che, dabei aber wirkungsvolle Möglich-
Literatur & Links
• [St01] Andreas Stübinger: Installation
und für den Webentwickler sehr einfach. keit zur Verfügung, Daten grafisch und Konfiguration von PHP, Linux Enterprise
darzustellen. Die hier vorgestellten Bei- 2001
Farbe und Schrift spiele können dabei nur einen kleinen Teil • [GD] [Link]/gd
Ein weiteres Beispiel für die Verwendung der Möglichkeiten von GD anreißen. • [libpng] [Link]/pub/png/
von Farbe und Schrift ist in Listing 2 ge- So könnte man Vorschaubilder (Thumb- • [jpeg-6b][Link]/
zeigt. Ein Text wird rotiert dargestellt, wo- nails) dynamisch erzeugen, die Daten wie • [TTF] [Link]/
bei alle Farben des Regenbogens verwen- z.B. die Mitgliederentwicklung eines Ver- • [zlib] [Link]/pub/infozip/zlib
det werden. eins oder die Kursentwicklung eines Ak- • [T1LIB] [Link]
In diesem Script zeigt sich das Problem, tienpapiers der letzten drei Monate aus ei- [Link]/pub/software/t1lib/
dass die in den aktuellen PHP verwendete ner MySQL-Datenbank extrahieren,

Herausgeber:
Impressum Autoren dieser Ausgabe: Anzeigen © 2001 für alle Beiträge.
Software & Support Verlag GmbH Sebastian Bergmann,Uwe Debacher, MARKETING PROJEKT 2000 GMBH Alle Rechte, auch für Übersetzungen, sind vor-
Martin Drahorad, Jens Gräfe, Albrecht Hochstr. 3 behalten. Reproduktionen jeglicher Art (Foto-
Anschrift der Redaktion: Günther, Markus Hasenbein, Martin 86453 Dasing kopie, Nachdruck, Mikrofilm oder Erfassung
Linux Enterprise Jansen, Jörg Krause, Bernd Kretschmer, Tel. 08205 / 96 233 auf elektronischen Datenträgern) nur mit
Software & Support Verlag GmbH Dr. Nadja Rosmann, Christiane Schmidt- Fax 08205 / 96 23 - 45 schriftlicher Genehmigung des Verlags. Eine
Kennedyallee 87 Köster, Björn Schotte, Uwe Steinmann, eMail: info@[Link] Haftung für die Richtigkeit der Veröffentlichun-
60596 Frankfurt am Main Dr. Andreas Stübinger, Ulf Wendel, gen kann trotz Prüfung durch die Redaktion
Tel.: (069) 63 00 89 - 0 Christian Wenz Aboservice vom Herausgeber nicht übernommen werden.
Fax: (069) 63 00 89 - 89 Software & Support Verlag GmbH Honorierte Artikel gehen in das Verfügungs-
eMail: redaktion@[Link] Pressevertrieb: Tel. 069 / 630089 0 recht des Verlags über. Mit der Übergabe der
WWW: [Link] IPV Inland Presse Vertrieb GmbH Fax 069 / 630089 89 Manuskripte, Abbildungen eventueller Quell-
Postfach 10 32 46 eMail: abo@[Link] codes an den Verlag erteilt der Verfasser dem
Chefredaktion: Dr. Nadja Rosmann 20022 Hamburg Herausgeber das Exklusivitätsrecht zur Veröf-
eMail: nrosmann@[Link] Abonnementpreise ( Linux Enterprise ) fentlichung. Für unverlangt eingesandte Ma-
Redaktion: Sebastian Meyen, Erscheinungsweise: Inland 12 Ausgaben DM 54,50 nuskripte, Abbildungen oder Quellcodes keine
Andrea Streb monatlich Studentenpreis 12 Ausgaben DM 45,- Gewähr.
Redaktionsassistenz: Mark Hohe-Dorst, Europ. Ausland 12 Ausgaben DM 74,50
Meike Wulf Linux ist eingetragenes Warenzeichen von Li-
Herstellungsleitung: Jens Mainz Einzelverkaufspreis nus Torvalds. Alle weitere Markennamen sind in
Layout, Titel: Deutschland DM 5,- der Regel eingetragene Warenzeichen der ent-
Dominique Bergmann, Schweiz sfr 5,- sprechenden Hersteller oder Organisationen.
Tobias Friedberg, Melanie Hahn, Österreich öS 40
Jens Mainz, Maria Rudi Luxemburg lfr 122

72 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 73

PostgreSQL Datenbanken
Installation
Die Installation ist insbesondere unter Li-
nux einfach, selbst dann, wenn Sie die Da-
tenbank aus den Quellen übersetzen möch-
ten. In der Regel ist dies jedoch nicht
notwendig, da nahezu alle Linux-Distribu-
tionen fertige Pakete mitliefern. Gegebe-
nenfalls müssen Sie noch das Datenver-
zeichnis data unterhalb des PostgreSQL
Installationsverzeichnisses erstellen und
dort mit initdb die Datenbankstruktur initi-
alisieren. Eine Konfiguration der Daten-
bank erfolgt in der Datei pg_hba.conf. Dar-
in werden insbesondere die Zugriffsrechte
festgelegt. Ohne Modifikationen an dieser
Datei sollte ein Zugriff von Clients vom glei-
chen Rechner bereits möglich sein. Für eine
genaue Beschreibung der Datei sollten Sie
die ausführliche Dokumentation zu Rate

Open Source
ziehen.
PHP mit PostgreSQL-Unterstützung zu
installieren setzt voraus, dass zumindest die
PostgreSQL-Bibliotheken auf dem Zielsys-
tem installiert sind. Die Datenbank selbst

Alternative
kann natürlich auf einem anderen System
beherbergt sein. Sofern kein vorkompilier-
tes PHP mit PostgreSQL-Unterstützung
verwendet wird, werden noch die entspre-
chenden Header-Dateien und natürlich die
von Uwe Steinmann PHP-Quellen zum Übersetzen benötigt. Bei
der Konfiguration von PHP muss die Op-
tion --with-pgsql und dies gegebenenfalls
PostgreSQL als Alternative zu kommerziellen unter Angabe des Verzeichnisses, in das die
Datenbank installiert wurde, angegeben
Datenbanken und MySQL werden. Die PostgreSQL-Unterstützung
unterscheidet sich hier nicht von der vieler
anderer PHP-Erweiterungen, sodass auch
eine eigene Installation leicht fallen sollte.
Denkt man an PHP und Datenbanken, dann ist PostgreSQL verfügt bereits über eine lange
MySQL nicht [Link]ßlich kann MySQL- Geschichte, die mit dem Datenbanksystem Erste Schritte
Ingres an der University of California im Alle PostgreSQL-Kommandos, die PHP
Unterstützung ohne weitere Software in PHP Jahr 1977 begann. Nach ständiger Weiter- bereitstellt, beginnen mit dem Präfix pg_.
eingebunden [Link] es gibt Alternati- entwicklung wurde 1994/95 Unterstützung Für einen ersten Test ist bereits das fol-
ven, die ähnlich einfach wie MySQL eingesetzt für SQL implementiert und Postgres95 her- gende einfache Skript ausreichend. Es
werden können, kostenlos sind und darüber ausgebracht. Im Namen manifestiert wurde öffnet und schließt lediglich eine Daten-
diese Erweiterung erst etwas später, was zu bank mit dem Namen test auf dem Host
hinaus weitere Funktionen [Link] der heutigen Bezeichnung PostgreSQL localhost.
ist eine solche Alternative. führte. PostgreSQL in ihrer aktuellen Ver-
sion 7.1 ist eine leistungsfähige objekt-rela- <?php

Quellcode tionale Datenbank mit SQL-Schnittstelle


und verfügt darüber hinaus über Transak-
?>
$db = pg_connect(„dbname=test“);
pg_close($db);
Der Quellcode zum tionsmanagement und referenzielle Inte-
Artikel befindet sich auf grität. PostgreSQL existiert für viele ver-
der beiliegenden CD. schiedene Unix-Systeme und natürlich auch Für das Skript ist es notwendig, dass
für Linux. zum einen ein Datenbankserver auf dem

Linux Enterprise Special PHP 73


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 74

Datenbanken PostgreSQL
gleichen Rechner läuft, auf dem das Skript entsprechendes PHP-Skript absetzen kön-
Listing1 ausgeführt wird und zum anderen eine Da- nen. Das dazu notwendige Kommando ist
[Link] tenbank mit dem Namen test existiert. Ei- pg_exec(). Mit pg_exec() können unter
<? ne solche Datenbank kann leicht in einer Angabe der Datenbankverbindung alle
include(„[Link]“); Shell mit den Kommando createdb test an- SQL-Anfragen ausgeführt werden. Die
?>
gelegt werden. Da nicht explizit der Rech- Funktion liefert false zurück, falls ein Feh-
<HTML>
<HEAD> nername angegeben wurde, auf dem die ler bei der Ausführung der Anweisung
<TITLE>Briefmarkenalbum</TITLE> Datenbank läuft, wird als Voreinstellung auftritt. Die genaue Fehlermeldung kann
</HEAD> localhost gewählt. Ohne Angabe des dann mit der Funktion pg_errormessage()
<BODY bgcolor=“white“> Rechnernamens ist es auch unwesentlich, erfragt werden. Es ist in jedem Fall sinn-
<CENTER>
ob der Datenbankserver mit der Option „- voll, Aufrufen von pg_exec() ein at-Zei-
<H1>Virtuelles Briefmarkenalbum</H1>
</CENTER> i“ oder ohne diese gestartet wurde. Post- chen voranzustellen, um eine mögliche
<? greSQL erlaubt es, mit der Option „-i“ so- Fehlerausgabe durch die Funktion zu
$conn = @pg_Connect(„user=$dbuser dbname=$dbname“);
wohl Verbindungen über TCP/IP, als auch unterdrücken. Stattdessen sollte eine eige-
if (!$conn) { über Unix-Domain-Sockets entgegen zu ne Fehlerbehandlung für die Ausgabe ei-
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_ nehmen. Wenn als Host explizit localhost ner für den Anwender verständlichen Feh-
errormessage($conn).“\“</B>\n“; angegeben wird, dann sollte auch die Op- lermeldung sorgen. Etwa in der folgenden
exit; tion „-i“ verwendet werden, ohne die das Form:
}
obige Skript keine Verbindung hätte auf-
$result = @pg_Exec($conn, „select * from briefmarken bauen können. Alternativ zu pg_connect() $result = @pg_exec($db, $sqlstmt);
order by jahr“); existiert eine Variante zur Öffnung einer if($result == FALSE) {
if (!$result) { echo „....“;
persistenten Datenbankverbindung durch
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_ } else {
errormessage($conn).“\“</B>\n“; pg_pconnect(). Sie verspricht eine Be-
}
pg_close($conn); schleunigung des Verbindungsaufbaus, da
exit; sie auf bestehende Verbindungen zurück- Wenn der Aufruf von pq_exec() erfolg-
} greift. reich das SQL-Kommando absetzen konnte
$num = pg_NumRows($result); Für weitere Experimente mit der Daten- und zudem Datensätze als Ergebnis erwar-
echo „ <CENTER><H3>Album beinhaltet $num bank muss zunächst eine Datenbanktabelle tet werden, dann werden diese in einem
Briefmarken</H3></CENTER>\n“;
angelegt werden. Am einfachsten erfolgt möglicherweise mehrzeiligen Ergebnisda-
?>
<HR WIDTH=40%> dies mit dem PostgreSQL Monitorpro- tensatz zurückgeliefert. Zugriff auf dieses
<CENTER> gramm psql. Verwenden Sie am besten ei- Ergebnis erhalten Sie mit den Kommandos
<A HREF=“[Link]“>LISTE DER BRIEFMARKEN</A> | nen Benutzernamen, den Sie vorher mit cre- pg_fetch_row(), pg_fetch_array() oder
<A HREF=“[Link]“>NEUE BRIEFMARKE</A> ateuser vergeben haben. Grundsätzlich pg_fetch_object(). Jede diese Funktionen
</CENTER>
bietet sich auch die Möglichkeit, als System- liefert eine Zeile des Ergebnisdatensatzes
<HR WIDTH=40%>
<UL> benutzer zu arbeiten. Es gilt jedoch auch zurück, entweder als assoziatives Array, als
<TABLE> hier der Grundsatz, dass man nur dann als indiziertes Array oder als Objekt. Für wel-
<? Systembenutzer arbeitet, wenn dies zwin- che der drei Funktionen man sich entschei-
for($i=0; $i<$num; $i++) { gend erforderlich ist. Lautet der Benutzer- det, ist eine Frage des Geschmacks. Wenn
$datensatz = pg_fetch_object($result, $i);
name gleich dem der Datenbank, dann man beispielsweise auf die obige Tabelle ei-
echo “ <TR><TD><A HREF=\“[Link]?id=
“.$datensatz->id.“\“>Löschen</A></TD><TD> reicht es aus, psql -U <name> aufzurufen. ne SELECT-Anweisung ausführte und alle
<A HREF=\“[Link]?oid=“.$datensatz->bild.“\“> Man meldet sich damit unter dem angege- Felder erfragte, dann erhielte man entweder
<IMG WIDTH=25% RC=\“[Link]?oid=“ benen Namen bei dem Datenbankserver an ein assoziatives Array mit den Feldnamen
.$datensatz->bild.“\“BORDER=0></A></TD> und wählt gleichzeitig die Datenbank mit als Schlüssel, ein indiziertes Array oder aber
<TD>$datensatz->titel, $datensatz->jahr,
dem gleichen Namen aus. ein Objekt mit den Feldnamen als Eigen-
$datensatz->nennwert Pfennig</TD></TR>\n“;
} Für eigene Experimente sollten Sie eine schaftsnamen. Es gibt sogar noch eine vierte
pg_FreeResult($result); einfache Datenbanktable anlegen, bei- Möglichkeit über die Funktion pg_result().
pg_Close($conn); spielsweise die folgende: Mit ihr kann man auf einzelne Felder eines
?> Datensatzes zugreifen. In der Regel bedeu-
</TABLE> CREATE TABLE adressen (id INTEGER, name char(50), tet dies jedoch mehr Aufwand, weil immer
</UL> strasse char(50), ort char(20));
</BODY> nur ein Feld erfragt werden kann.
</HTML> Die Anzahl der Zeilen im Ergebnisda-
Mit \d adressen können Sie sich die tensatz kann mit pg_numrows() erfragt
Struktur der neuen Tabelle im Monitor- werden. Ein übliches Konstrukt, um alle
programm anschauen. Diese SQL-Anwei- Zeilen einer Anfrage auszuwerten, ist das
sung hätte man auch ebenso gut über ein Folgende:

74 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 75

PostgreSQL Datenbanken
Abb. 1: Auflistung
der Briefmarken als
Tabelle
Listing 2
[Link]

<?php
include(„[Link]“);

$conn = @pg_Connect(„user=$dbuser dbname=


$dbname“);
if (!$conn) {
exit;
}

header(„Content-Type: image/*“);

pg_exec($conn, „begin“);
$lobj = pg_loopen($conn, $oid, „r“);
do {
$l = pg_loread($lobj, 8192);
if($l)
echo $l;
Abb. 2: Einfügen } while($l != false);
neuer Marken pg_loclose($lobj);
durch das HTML- pg_exec($conn, „commit“);
Formular
pg_close($conn);
?>

Listing 3
[Link]
<HTML>
<HEAD>
<TITLE>Neue Briefmarke einfügen</TITLE>
</HEAD>
<BODY bgcolor=“white“>
$result = @pg_exec($db, „select * from adressen); existieren eine Reihe von Funktionen, die <CENTER>
if(!$result) sich auf die Felder eines Ergebnisdatensat- <H1>Neue Briefmarke einfügen</H1>
exit; </CENTER>
zes beziehen. So lässt sich mit pg_fieldna-
$c = pg_numrows($result); <HR WIDTH=40%>
me(), pg_fieldsize() und pg_fieldtype() der <FORM method=POST ENCTYPE=“multipart/form-data“
for($i=0; $i<$c; $i++) {
Name, die Größe in Byte und der Typ eines ACTION=“[Link]“>
$obj = pg_fetch_object($result, $i);
Feldes erfragen. pg_fieldnums() liefert die <TABLE>
// Verarbeitung der Daten
}
Anzahl der Felder. Mit diesen Funktionen <TR><TD>Titel der Briefmarke: </TD><TD>
lässt sich somit sehr leicht die Tabellen- <INPUT TYPE=“input“ NAME=“titel“></TD></TR>
Ebenso kann die tatsächliche Länge ei- struktur rekonstruieren. <TR><TD>Nennwert der Briefmarke: </TD><TD>
<INPUT TYPE=“input“
nes Feldes mit pg_fieldprtlen() festgestellt Das Einfügen neuer Datensätze kann
NAME=“nennwert“></TD></TR>
werden und mit pg_fieldisnull(), ob ein ebenfalls über die Funktion pg_exec() und <TR><TD>Erscheinungsjahr der Briefmarke:
Feld Null ist. Die beiden letzten Funktio- der entsprechenden SQL INSERT-Anwei- </TD><TD> <INPUT TYPE=“input“ NAME=“jahr“ SIZE=4
nen benötigen dazu wieder eine Nummer, sung erfolgen. Von Interesse ist in diesem MAXLENGTH=4></TD></TR>
die die Zeile im Ergebnisdatensatz aus- Zusammenhang eine Eigenschaft von <TR><TD>Dateiname der Briefmarke:
wählt. PostgreSQL, die es erlaubt über eine globa- </TD><TD> <INPUT TYPE=“file“
Sollte ein Ergebnisdatensatz nicht mehr le Objektkennung, den zuletzt eingefügten NAME=“briefmarke“></TD></TR>
<TR><TD></TD><TD><INPUT TYPE=“Submit“
benötigt werden, dann kann er mit pg_free- Datensatz zu ermitteln. pg_getlastoid() lie-
VALUE=“Einfügen“></TD></TR>
result() aus dem Speicher entfernt werden. fert diese Kennung, die wie eine versteckte </TABLE>
Falls dieses nicht geschieht, so sorgt mit Be- Spalte in jeder Tabelle verfügbar ist. Über </FORM>
enden des Skripts PHP selbst dafür. eine SELECT-Anweisung der Form </BODY>
Neben den Funktionen, um Daten aus SELECT * from tablename where </HTML>
dem Ergebnisdatensatz zu extrahieren, oid=’$oid´, wobei die Variable $oid zuvor

Linux Enterprise Special PHP 75


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 76

Datenbanken PostgreSQL
mit pg_getlastoid() gesetzt wurde, lässt sich und Applikationsserver auf getrennten kenablum realisiert. Die notwendige Da-
der zuletzt eingefügte Datensatz ermitteln. Rechnern betrieben werden. tenbanktabelle kann durch die SQL-An-
Dies kann immer dann sinnvoll sein, wenn Um beispielsweise die obige Tabelle weisung
Felder erst mit dem Einfügen des Datensat- um ein Foto der Person zu erweitern, ist le-
zes gesetzt werden, z.B. durch eine Sequenz diglich eine weiteres Feld, beispielsweise
oder die aktuelle Zeit. Man sollte jedoch mit dem Namen Foto und vom Typ oid
nicht den Fehler machen, diese Objektken- notwendig. Das Foto als BLOB kann mit
nung als Ersatz für Sequenzen oder gar als
Schlüssel zu verwenden. Schon das Über-
der Funktion pg_locreate(), pg_loopen()
und pg_lowrite() oder pg_loimport() er-
Listing 4
[Link]
tragen eines Datenbestandes auf einen an- stellt werden. Die von pg_locreate() zu- <?
deren Datenbankserver wird zum Pro- rückgelieferte Objektkennungen muss in include(„[Link]“);
blem, weil die OIDs nur dann vom dem Feld Foto der Tabelle adressen durch ?>
Anwender vorgegeben werden können, eine INSERT- oder UPDATE-Anweisung <HTML>
wenn sie auf dem Zielsystem nicht bereits eingetragen werden. <HEAD>
vergeben sind. <TITLE>Briefmarke einfügen</TITLE>
PostgreSQL unterstützt auch soge- Transaktionen </HEAD>
nannte Binary Large Objekts (BLOB). Alle Operationen auf BLOBs müssen <BODY bgcolor=“white“>
<CENTER>
BLOBs sind binäre Daten, die keine feste innerhalb einer Transaktion ausgeführt
<H1>Virtuelles Briefmarkenalbum</H1>
Struktur aufweisen und in der Regel deut- werden. Transaktionen werden mit
</CENTER>
lich größer sind, als dass sie von einem Ta- der SQL-Anweisung BEGIN begonnen <HR WIDTH=40%>
bellenfeld aufgenommen werden können. und mit COMMIT erfolgreich abge- <CENTER>
Häufig handelt es sich dabei um Videos, schlossen beziehungsweise mit ROLL- <A HREF=“[Link]“>LISTE DER BRIEFMARKEN</A> |
Bilder, Applets aber auch große Texte. BACK rückgängig gemacht. Diese Forde- <A HREF=“[Link]“>NEUE BRIEFMARKE</A>
Der Umgang mit BLOBs ist sehr daten- rung ist schon deshalb sinnvoll, weil </CENTER>
bankabhängig und wird bei PostgreSQL Operationen auf BLOBs häufig auch Än- <HR WIDTH=40%>
über die Funktionen mit dem Präfix pg_lo derungen an der Tabelle, die die Referenz <?php
realisiert. Die Funktionen erinnern sehr auf das BLOB enthält, notwendig ma- $fd = fopen($briefmarke, „r“ );
stark an herkömmliche Dateioperation chen. Es sind also mindestens zwei Daten- $blob = „“;
while($cont = fread( $fd, 1000))
und in der Tat legt PostgreSQL jedes bankoperationen notwendig, um bei-
$blob .= $cont;
BLOB als Datei auf der Festplatte ab und spielsweise ein BLOB abzulegen. Schlägt
fclose( $fd );
liefert lediglich die globale Objektken- eine der beiden Operationen fehl, sollte
nung zurück. Die Verwaltung der BLOBs auch die andere nicht ausgeführt werden. $conn = @pg_Connect(„user=$dbuser dbname=
obliegt damit zu einem Teil der Daten- Der Zugriff auf ein BLOB erfolgt $dbname“);
if (!$conn) {
bankanwendung und liegt somit in der durch die Funktionen pg_loopen(),
echo „Es ist ein Fehler aufgetreten: <B>
Verantwortung des Programmierers. Die pg_loread() und pg_loreadall(). Falls
\“„.pg_errormessage($conn).“\“</B>\n“;
Tatsache, dass auch hier OIDs verwendet ein BLOB gelöscht werden soll, dann ist exit;
werden, die möglicherweise als Referenz dies über pg_lounlink() möglich. Hierbei }
in Tabellenfeldern auftauchen, macht eine sollte beachtet werden, dass diese Opera-
@pg_exec($conn, „begin“);
Übertragung des Datenbestands auf einen tion möglicherweise eine entsprechende
if(FALSE == ($oid = pg_locreate ($conn))) {
anderen Server schwierig oder im Einzel- Änderung des Datensatzes mit der Refe- echo „Es ist ein Fehler aufgetreten: <B>
fall auch unmöglich. Nicht ganz unpro- renz des BLOBs zur Folge hat. Hierin \“„.pg_errormessage($conn).“\“</B>\n“;
blematisch ist auch die Tatsache, dass liegt auch die größte Gefahr bei der Ver- pg_close($conn);
Werkzeuge wie pg_dump nur bedingt bei wendung von BLOBs. Sie sollten immer exit;
der Übertragung des Datenbestands wei- bedenken, dass, sobald die Referenz auf }
ter helfen. Mit ihnen lassen sich Tabellen das BLOB verloren geht, keine Möglich- $handle = pg_loopen ($conn, $oid, „w“);
und ihre Daten aus einer Datenbank keit mehr besteht, darauf zuzugreifen. In pg_lowrite ($handle, $blob);
extrahieren, die BLOBs werden aller- so einem Fall hilft nur noch der SQL-Mo- pg_loclose ($handle);
dings nicht beachtet und müssen daher nitor psql, in dem man mit dem Kom- // Schritt 5: Eintrag des neuen Objekts in der Tabelle
durch Handarbeit übertragen werden. mando \lo_list zumindest alle Objekt- atom
Dennoch bieten die BLOBs in Post- kennungen der BLOBs auflisten kann, $query = „insert into briefmarken (titel, nennwert, jahr,
greSQL einen Vorteil gegenüber der ma- um sie dann mit \lo_unlink zu löschen. bild) values (‘„.$titel.“‘,“.$nennwert.“,“.$jahr.“,“.$oid.“)“;
nuellen Ablage im Dateisystem. Über das $result
Datenbankprotokoll ist der Zugriff auf Beispiel
die BLOBs auch dann noch unproblema- Die Listings 1 bis 6 zeigen ein einfaches
tisch möglich, wenn Datenbankserver Beispiel, welches ein virtuelles Briefmar-

76 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 77

PostgreSQL Datenbanken
CREATE TABLE briefmarken (
Listing 5 id serial,
titel varchar,
[Link]
nennwert int,
jahr int,
<?
bild oid
include(„[Link]“);
);
?>
<HTML>
erstellt werden.
<HEAD>
<TITLE>Briefmarke löschen</TITLE>
Es können Briefmarken eingefügt, aufgelistet und gelöscht
</HEAD>
<BODY bgcolor=“white“>
werden. In der Datenbanktabelle briefmarken wird neben dem
<CENTER> Titel, Nennwert und Erscheinungsjahr auch die Objekt-ID eines
<H1>Briefmarke loeschen</H1> BLOBs abgelegt. Dahinter verbirgt sich ein eingescanntes Bild
</CENTER> der Briefmarke. Die Datei [Link] listet alle Briefmarken im Al-
<HR WIDTH=40%> bum als Tabelle auf (siehe Abbildung 1 und Listing 1).
<CENTER> Die Ausgabe des gescannten Bildes übernimmt die Datei zei-
<A HREF=“[Link]“>LISTE DER BRIEFMARKEN</A> | [Link] (siehe Listing 2). Ihr wird als Parameter die Objekt-ID
<A HREF=“[Link]“>NEUE BRIEFMARKE</A> des BLOBs übergeben, welches aus der Datenbank gelesen und
</CENTER> direkt an den Browser geschickt wird.
<HR WIDTH=40%>
Das Einfügen neuer Marken erfolgt durch das recht einfa-
<?php
che HTML-Formular in [Link] (siehe Listing 3) und
$conn = @pg_Connect(„user=$dbuser dbname=$dbname“);
if (!$conn) {
das PHP-Skript in [Link] (siehe Abbildung 2 und Lis-
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_errormessage($conn).“\“</B>\n“; ting 4).
exit; Gelöscht werden kann eine Briefmarke über den Verweis Lö-
} schen in der Liste der Briefmarken. Hinter dem Verweis verbirgt
sich das Skript [Link], dem die eindeutige Kennung einer
$result = pg_exec($conn, „select bild from briefmarken where id=$id“); Briefmarke übergeben wird (siehe Listing 5). Der eigentliche
if (!$result) { Löschvorgang besteht aus dem Löschen des BLOBs und des Da-
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_errormessage($conn).“\“</B>\n“; tensatzes. Beides wird in einer Transaktion ausgeführt, sodass
pg_close($conn); ein Fehler bei einer der beiden Operationen keinen inkonsisten-
exit;
ten Zustand der Datenbank hinterlässt.
}
Das Beispiel enthält nur eine rudimentäre Fehlerbehandlung.
$num = pg_NumRows($result);
if($num == 1) {
Insbesondere wird nicht überprüft, ob die Eingabewerte sinnvoll
@pg_exec($conn, „begin“); und vom richtigen Typ sind und das Bild der Briefmarke auch
$oid = pg_result($result, „bild“, 0); wirklich ein Bild ist. Sie werden damit also kaum eine(n) erfah-
if(FALSE == pg_lounlink($conn, $oid)) { rende(n) PHP-Programmierer(in) beeindrucken können, viel-
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_errormessage($conn).“\“</B>\n“; leicht aber Ihre nächste nächtliche Bekanntschaft.
@pg_exec($conn, „rollback“);
pg_close($conn); Fazit
exit; PostgreSQL ist unter den Open-Source-Datenbanken sicherlich
} eine der Leistungsfähigsten, die in vielen Anwendungsfällen
auch im Vergleich zu den kommerziellen Systemen gut dasteht.
$result = pg_exec($conn, „delete from briefmarken where id=$id“);
Referenzielle Integrität und Transaktionsmanagement sind klare
if (!$result) {
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_errormessage($conn).“\“</B>\n“;
Pluspunkte für PostgreSQL im Vergleich zu MySQL. Entwickler,
@pg_exec($conn, „rollback“); die bisher nur mit MySQL gearbeitet haben, dürften nur wenige
pg_close($conn); Probleme haben, auf PostgreSQL umzusteigen, da die PHP-
exit; Schnittstelle ähnliche Funktionen aufweist. PostgreSQL unter-
} stützt BLOBs, allerdings in einer Weise, die eine Sicherung des
@pg_exec($conn, „commit“); Datenbestandes erschwert.
}
pg_close($conn);
?>
Datensatz erfolgreich gelöscht. Links [Link]
</BODY>
</HTML> [Link]

Linux Enterprise Special PHP 77


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 78

Datenbanken PHP und MSSQL - unter Linux


nicht in eine Diskussion über die Vor- und
Nachteile gewisser Datenbanksysteme ab-
gleiten lassen, sondern zeigen Ihnen, wie
Sie von einer Linux-Maschine aus via PHP
auf einen MSSQL-Server zugreifen kön-
nen.
Bevor wir in die eigentliche Materie ein-
steigen, noch ein kurzer Hinweis, welche
Softwarevoraussetzungen die Beispiele in
diesem Artikel haben: Apache 1.3.x muss
installiert sein; außerdem sollte PHP instal-
liert sein, und zwar mindestens Version
4.0.4 – davor hatte die MSSQL-Unterstüt-
zung noch einige Bugs. Eine funktionieren-
de Installation des Microsoft SQL Server
7.0 muss im Netzwerk erreichbar sein, und
Sie müssen mindestens Service Pack 1 in-
stalliert haben (erhältlich unter www.

PHP und MSSQL


[Link]/sql/downloads/default.
htm).

FreeTDS installieren und konfigurieren


Unter [Link]/ kann FreeTDS

– unter Linux heruntergeladen werden – ein Open-


Source-Projekt, welches das TDS-Proto-
koll implementieren will. TDS steht für
Tabular Data Stream und ist dasjenige
Protokoll, mit dem die Client-Server-
von Christian Wenz Kommunikation von Sybase realisiert
wird. Wie bereits oben erwähnt, ist
MSSQL ja eine Weiterentwicklung von
Sybase. Die zur Zeit aktuelle Version ist
Wie man den Microsoft SQL-Server in die 0.51; sollten Sie eine neuere Version vor-
finden, sollten Sie diese einsetzen und die
Linux-Welt einführen kann folgenden Installationshinweise entspre-
chend anpassen.
Laden Sie zunächst FreeTDS von der
Website herunter, der Dateiname ist bei
Version 0.51 [Link], bei ande-
ren Versionsnummern ändert er sich ent-
sprechend. Entpacken Sie dann das Ar-
chiv:
Der wohl häufigste PHP-Installationstyp ist Um Anfeindungen fanatischer MySQL-
LAMP – Linux, Apache, MySQL und [Link] ei- Verfechter gleich vorzubeugen: Obwohl gzip –d –c [Link] | tar xvf –
MSSQL von Microsoft stammt (genauer
nige Leute empfehlen analog auch noch WAMP
gesagt: von Sybase lizenziert und weiter- Als nächstes müssen Sie FreeTDS kon-
– Windows, Apache, MySQL und PHP, der Apa- entwickelt worden ist), hat die Software in figurieren; rufen Sie dazu folgendes Kom-
che Web Server dringt also in die Windows- gewissen Bereichen Vorteile gegenüber der mando auf:
Welt [Link] wollen den umgekehrten Weg ge- Open-Source-Konkurrenz, beispielsweise
das Konzept der Transaktionen, was erst ./configure —prefix=/usr/local/freetds —with-tdsver=4.2
hen und eine der mächtigsten —enable-dbmfix
in der nächsten MySQL-Generation einge-
Windows-Datenbanken, den Microsoft SQL Ser- führt werden soll. Einen ganz guten Über-
ver (MSSQL), in die Linux-Welt einführen. blick gibt es direkt auf den Seiten von Mit dem Schalter --with-tdsver=4.2
MySQL unter [Link]/informa- geben Sie die zu verwendende Version von
tion/[Link]. Wir wollen dies aber TDS an. FreeTDS unterstützt zwar schon

78 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 79

PHP und MSSQL- unter Linux Datenbanken

Abb. 1: Die Tabelle im Enterprise Manager

Version 7.0, die angegebene Version 4.2 auch schon getan – Ihr System unterstützt Sie sehen in obigem Beispiel, dass der
ist jedoch deutlich stabiler. nun den Zugriff auf eine MSSQL-Daten- Datenbankserver über seine IP-Adresse
Nach erfolgter Konfiguration instal- bank von PHP aus. angesprochen worden ist. Natürlich kön-
lieren Sie die Software wir gehabt über das nen Sie auch den Namen des Servers ver-
Makefile: PHP-Funktionen für MSSQL wenden, doch das DSN-Lookup funktio-
Unter [Link]/manual/en/[Link] niert nicht immer. Sie sollten deswegen
make .php finden Sie eine Übersicht über alle den Servernamen unter /etc/hosts eintra-
make install Funktionen, die PHP zum Zugriff auf eine gen, dann sollte der Verbindungsaufbau
Microsoft SQL Server Datenbank anbie- funktionieren.
Um die Installation abzuschließen, müs- tet. Wir stellen Ihnen im Folgenden die Nach Aufbau einer Verbindung müs-
sen Sie nun noch /usr/local/freetds/lib (oder wichtigsten davon vor. sen Sie angeben, auf welche Datenbank
den entsprechenden Pfad Ihrer FreeTDS-In- Der eigentliche Verbindungsaufbau Sie zugreifen möchten. Dazu dient die
stallation) in die Datei /etc/[Link] einfü- zu einer Datenbank geht mit der Funk- Funktion mssql_select_db, als Parameter
gen und diese Änderungen beim System an- tion mssql_connect vonstatten. Als übergeben Sie den Namen der Daten-
melden: ersten Parameter übergeben Sie den Na- bank:
men des Servers, als nächstes den Benut-
ldconfig zernamen und das Passwort. Die letzten mssql_select_db(„news“);
beiden Parameter sind optional, wenn Sie
Als nächstes muss noch der PHP-Inter- also einen anonymen Zugriff auf die Da- Eine SQL-Anfrage an die Datenbank
preter entsprechend konfiguriert werden. tenbank erlauben, sollten Sie vielleicht schicken Sie mit der Funktion mssql_que-
Ersetzen Sie zunächst in der Datei ext/sy- Ihre Einstellung zur Systemsicherheit ry. Diese Funktion liefert entweder im Er-
base/php_sybase_db.c alle Aufrufe von überdenken, PHP macht das aber nichts folgsfalle ein numerisches Handle zurück,
dbopen durch tdsdbopen. Dann können aus. ansonsten false. Dabei macht es keinen
Sie sich ans Kompilieren machen. Welche Unterschied, welche Art von Abfrage ver-
Schalter Sie genau verwenden, hängt von $conn = mssql_connect(„[Link]“,“guest“,“guest“); wendet wird:
Ihren speziellen Anforderungen ab. Wich-
tig ist auf jeden Fall der Schalter —with- Die Funktion mssql_connect hat als $result1 = mssql_query(„DELETE FROM NEWS WHERE
sybase=/usr/local/freetds, mit dem Sie Rückgabewert ein numerisches Handle für expiredate < getdate()“);
FreeDTS integrieren: die aktuelle Verbindung, dieses wird aber – $result2 = mssql_query(„SELECT * FROM news“);
im Gegensatz zum PHP-Zugriff auf
./configure —with-sybase=/usr/local/freetds \ MySQL-Datenbanken – nicht weiter ver- Bei INSERT-, UPDATE- und DELETE-
—enable-track-vars —enable-memory-limit=yes \ wendet. Wenn Sie die Funktion mssql_con- Abfragen wird der Rückgabeparameter
—enable-debug=no —with-apxs —with-mysql —with-gd nect mit identischen Parametern noch ein- nicht mehr weiter benötigt. Wenn Sie je-
make
mal aufrufen, wird keine neue Verbindung doch eine SELECT-Abfrage ausführen,
make install
geöffnet und die alte Verbindung weiter sind Sie sehr wohl am Rückgabewert
verwendet. Am Ende des PHP-Skripts wer- interessiert, denn Sie möchten ja auf die
Nun müssen Sie gegebenenfalls noch den alle offenen Verbindungen automa- Daten zugreifen, die Ihnen die Abfrage lie-
Ihren Webserver (i.d.R. Apache) für die tisch geschlossen; Sie müssen also die dazu- fert. Die Funktion mssql_fetch_array lie-
PHP-Unterstützung konfigurieren, und gehörige Funktion mssql_close nicht fert ein Array mit allen Spalten der Ergeb-
dann ist der schwierige Teil der Arbeit explizit aufrufen. nisliste zurück, das Sie dann in einer

Linux Enterprise Special PHP 79


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 80

Datenbanken PHP und MSSQL - unter Linux


Schleife durchschreiten können. Als Para- $sql .= „‘„.$HTTP_POST_VARS[„content“].“‘)“; Die Ausgabe der einzelnen Nachrich-
meter müssen Sie den Rückgabeparame- $query_result = mssql_query($sql); ten geschieht mittels einer INSERT-An-
ter von mssql_query übergeben. Hier ein if ($query_result) { weisung auf der Seite [Link]. Wird kein
echo „Daten in die Datenbank geschrieben!“;
komplettes Beispiel: Parameter übergeben, werden alle Nach-
} else {
richtenüberschriften angegeben; andern-
echo „Fehler beim Schreiben in die Datenbank!“;
$conn = mssql_connect(„[Link]“,“guest“,“guest“);
}
falls wird nur die gewünschte Nachricht
mssql_select_db(„news“); angezeigt.
?>
$query_result = mssql_query(„SELECT * FROM news“); Sie sehen also: Mit relativ wenig Auf-
</h3>
while ($result = mssql_fetch_array($query_result)) {
<a href=“[Link]“>Eine weitere Nachricht eingeben</a> wand lässt sich hier die Brücke zwischen
echo htmlspecialchars($result[„headline“]).“<br>“;
</body> Linux- und Microsoftwelt schlagen. Das
}
</html> Newstool diente hier natürlich nur als ein-
faches Beispiel und lässt sich an vielen Stel-
Praxisbeispiel Beachten Sie, dass (aus Platzgründen) len erweitern.
Im Folgenden wollen wir noch ein Praxis- Sonderzeichen in den Eingaben vor dem
beispiel vorführen, das die MSSQL-Funk- Schreiben in die Datenbank nicht ent-
tionen verwendet. Es soll ein kleines
Newstool geschrieben werden. In dieses
fernt bzw. maskiert worden sind. Be-
sonders wichtig ist, dass das einfache
Listing 2
<?php
können Nachrichten anhand von Über- Apostroph „‘“ innerhalb eines SQL- $conn = mssql_connect(„[Link]“, „guest“, „guest“);
schrift, Unterüberschrift und Nachrich- Werts durch “ ersetzt werden muss. Ent- mssql_select_db(„news“);
tentext eingetragen werden. Auf einer ent- weder setzen Sie in der [Link] den Wert $sql = „SELECT * FROM wwwnews“;
sprechenden Ausgabeseite werden die magic_quotes_sybase auf 1 und verwen- ?>
Nachrichten aufgelistet. Eine Administra- den die Funktion addslashes, oder Sie <html>
tionsseite ermöglicht es, die Nachrichten versuchen ganz prosaisch str_replace <head>
zu editieren und auch zu löschen. („‘„, „‘’“, $variable). <title>Nachricht anzeigen</title>
</head>
Zunächst einmal muss die Datenbank
<body bgcolor=“white“>
eingerichtet werden. Erstellen Sie im En-
<?php
terprise Manager des Microsoft SQL Ser-
ver eine neue Tabelle namens wwwnews Listing 1 if (isset($HTTP_GET_VARS[„ID“])) {
$sql .= „ WHERE ID=“.$HTTP_GET_VARS[„ID“];
mit fünf Spalten: ID, headline, subheadli- [<html>
$query_result = mssql_query($sql);
ne, content und created. In Abbildung 1 se- <head> if ($query_result){
hen Sie, welche Datentypen und sonstigen <title>Neue Nachricht</title> $result = mssql_fetch_array($query_result);
Einstellungen Sie für dieses Beispiel tätigen </head> echo „<p><big><b>“;
müssen. <body bgcolor=“white“> echo htmlspecialchars($result[„headline“]);
<h3>Neue Nachricht eingeben</h3> echo „</b></big></p>“;
Beginnen wir mit der Maske für die
<form action=“[Link]“ method=“post“> echo „<p><b>“;
Eingabe einer neuen Nachricht. Hier das
<table border=“0“ cellspacing=“10“> echo htmlspecialchars($result[„subheadline“]);
HTML-Formular ([Link]): <tr> echo „</b></p>“;
<td><b>&Uuml;berschrift</b></td> echo „<p>“;
Dieses Formular wird an das Skript <td><input type=“text“ name=“headline“ size=“30“ echo nl2br(htmlspecialchars($result[„headline“]));
[Link] verschickt, welches anhand der maxlength=“255“></td> echo „</p>“;
Angaben im Formular einen entsprechen- </tr> }
den SQL-String zusammensetzt und an <tr> echo „<p><a href=’“.$PHP_SELF.“‘>Zur&uuml;ck zur
die Datenbank schickt: <td><b>Unter&uuml;berschrift</b></td> &Uuml;bersicht</a></p>“;
<td><input type=“text“ name=“subheadline“ size=“30“ } else {
<html> maxlength=“1000“></td> echo „<h3>Nachrichten&uuml;bersicht</h3>“;
<head> </tr> $query_result = mssql_query($sql);
<title>Neue Nachricht</title> <tr> while ($result = mssql_fetch_array($query_result)) {
</head> <td><b>Nachrichtentext</b></td> echo „<a href=’“.$PHP_SELF.“?ID=“.$result[„ID“].“‘>“;
<body bgcolor=“white“> <td><textarea name=“content“ wrap=“virtual“ echo htmlspecialchars($result[„headline“]);
<h3> cols=“60“ rows=“10“></textarea></td> echo „ („.$result[„created“].“)</a><br>“;
<?php </tr> }
$conn = mssql_connect(„[Link]“, „guest“, „guest“); </table> }
mssql_select_db(„news“); <input type=“submit“ value=“Daten speichern“> ?>
$sql = „INSERT INTO wwwnews „; </form> </body>
$sql .= „(headline, subheadline, content) VALUES („; </body> </html>
$sql .= „‘„.$HTTP_POST_VARS[„headline“].“‘, „; </html>
$sql .= „‘„.$HTTP_POST_VARS[„subheadline“].“‘, „;

80 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 81

Zugriff auf Oracle Datenbanken

Mit PHP gelingt


Oracle Datenbank: Die ältere und weni-
ger leistungsfähige Schnittstelle im Mo-
dul „Oracle“, und eine verbesserte
Schnittstelle durch das Modul „OCI8“,
das trotz seines Namens sowohl mit Ora-
cle8 als auch Oracle7 Datenbanken ein-

der Umstieg gesetzt werden kann. Die OCI8-Schnitt-


stelle soll ausschließlicher Gegenstand
dieses Artikels sein, zumal sie auch Binary
Large Objects unterstützt, doch dazu spä-
ter mehr.
von Uwe Steinmann
Installation
Grundvoraussetzung für das Einbinden
Oracle Datenbankzugriff mit PHP der Unterstützung von Oracle in PHP sind
die Client-Bibliotheken der Oracle-Distri-
bution. Diese sind im Verzeichnis $ORA-
CLE_HOME/lib und sollten dort bei der
Konfiguration von PHP gefunden werden,
sofern die Umgebungsvariable $ORA-
CLE_HOME richtig gesetzt ist. Ebenso
kann mit der configure-Option —with-
MySQL bietet in vielen Anwendungsfällen aus- LAMP (Linux Apache MySQL PHP) ist ei- oci8 der Pfad des Oracle-Home-Verzeich-
reichende Leistung und Eigenschaften, um ne sehr verbreitete Software-Kombination nisses übergeben werden. Sofern nicht
zur Realisierung von Datenbankanwen- auch das LDAP-Modul eingebunden
kleine bis mittlere Projekte [Link]-
dungen für das WWW. Die Gründe dafür wird, sollte es zu keinen weiteren Proble-
gen die Anforderungen an Datenbank oder Da- bestehen in der freien Verfügbarkeit aller men beim Übersetzen von PHP kommen.
tenvolumen, sind schnell andere Alternativen Komponenten, der einfachen Installation Die gleichzeitige Unterstützung von
[Link] Datenbanksystem, das auch geho- und nicht zuletzt der hohen Geschwindig- LDAP kann allerdings zu einem Fehler
keit der Datenbank MySQL. Dennoch hat beim Linken führen. Der Grund liegt in
benen Anforderungen entspricht, ist der Oracle
diese Lösung Nachteile, die inbesondere in den Oracle-Bibliotheken, die auch LDAP-
Enterprise [Link] PHP auch diese Daten- MySQL begründet sind. Die Performance Funktionen enthalten. Werden die Ora-
bank unterstützt, versteht sich fast von selbst. der Datenbank sinkt mit steigender Zahl cle-Bibliotheken vor der LDAP-Biblio-
der Datensätze, es fehlt ein Transaktions- thek eingebunden, erfolgt bereits eine
management, es wird keine referenzielle In- Symbolauflösung über die LDAP-Funk-
tegrität und nur bedingt eine Replikation tionen der Oracle-Bibliotheken und die ei-
des Datenbestands unterstützt. Mit dem gentliche LDAP-Bibliothek bleibt unbe-
Oracle Enterprise Server existiert eine Da- rücksichtigt. Dies führt entweder zu einer
tenbank, die – wenn auch nicht kostenlos – Fehlermeldung des Linkers oder zu einer
jede dieser Anforderungen erfüllt und bei nicht funktionierenden LDAP-Anbin-
Großprojekten vielfach die erste Wahl ist. dung in PHP. Man sollte daher mit ldd
Den PHP-Anwendungsentwickler kann überprüfen, ob der Web-Server oder PHP
ein Wechsel zu Oracle nicht aus der Bahn (falls PHP als CGI-Skript kompiliert wur-
werfen, denn auch dafür bietet PHP eine de) die LDAP-Bibliothek verwendet. Ist
Schnittstelle. Auch wenn diese für den dies nicht der Fall, muss die Reihenfolge
MySQL erfahrenden Entwickler zunächst der Bibliotheken beim Linken so verän-
ungewohnt erscheint, lässt sie sich mit et- dert werden, dass die LDAP-Bibliothek
was Erfahrung ebenso einfach nutzen. Im vor der Oracle-Bibliothek eingebunden
übrigen kann man unter [Link] wird. Gegebenenfalls muss dazu das

Quellcode [Link] eine kostenlose Entwicklerlizenz


und reichlich Dokumentation bekommen.
Makefile modifiziert werden.
Für einen erfolgreichen Verbindungs-
Der Quellcode zum aufbau zur Datenbank müssen mindes-
Artikel befindet sich auf Qual der Wahl tens die Umgebungsvariablen $ORA-
der beiliegenden CD.
Genau genommen unterstützt PHP nicht CLE_HOME und $ORACLE_SID ge-
nur eine, sondern zwei Schnittstellen zur setzt sein. Dies kann entweder im PHP-

Linux Enterprise Special PHP 81


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 82

Datenbanken Zugriff auf Oracle


Skript durch putenv() oder vor Aufruf des derweitig false. Ebenso gibt OCIParse() wird (OCI_COMMIT_ON_SUCCESS)
Web-Servers bzw. des PHP-CGI-Skripts in „false“ bei einem aufgetretenen Fehler zu- oder ein nachfolgendes commi“ notwen-
der Shell erfolgen. Wird der Web-Server rück. Es kann aber auch die aufbereitete dig ist (OCI_DEFAULT). Für ein funk-
automatisch über die init-Skripte beim Anfrage, im folgenden auch Statement ge- tionierendes Transaktionsmanagement
Hochfahren des Linux-Systems gestartet, nannt, zurückgeben: sollte dieser Wert auf OCI_DEFAULT
bietet es sich an, die Variablen im startup- gesetzt werden und die Funktion OCI-
Skript vor dem Aufruf des Web-Servers zu $stmt = OCIParse($db, „select * from table_name“); Commit() oder OCIRollback() nach Mo-
setzen. Alle Variablen müssen auf die Wer- OCIExecute($stmt); difikationen am Datenbestand ausge-
te gesetzt werden, die auch für ein funktio- führt werden.
nierendes sqlplus notwendig sind. Als Übergabeparameter erhält OCIE- Nach dem Aufruf von OCIExecute()
Zusätzlich sind bei Bedarf die Variablen xecute() die Rückgabe von OCIParse(). kann auf das Ergebnis der Anfrage über
$LD_LIBRARY_PATH, $NLS_LANG Sie dient im übrigen auch dazu, das Ergeb- das Statement zugegriffen werden. OCI-
und $ORA_NLS33 zu setzen, sofern sie nis von OCIExecute() auszuwerten. In Fetch() setzt den internen Zeiger auf den
nicht schon für ein funktionierendes der Regel ist es sinnvoll, den Funktions- ersten – bzw. bei weiteren Aufrufen auf
sqlplus richtig gesetzt wurden. Die Benut- aufrufen, die einen Fehler verursachen den folgenden – Eintrag im Ergebnis. Mit
zerkennung des Web-Servers muss zudem können, ein „@“ voranzustellen, um die OCIResult() kann auf die Daten zugegrif-
in die Oracle-Gruppe mit aufgenommen Fehlerausgabe zu unterdrücken und sie fen werden. Die Anzahl der Spalten im Er-
werden, um Zugriff auf die Oracle-Biblio- von der Datenbankanwendung durch gebnis ist mit OCINumCols() ermittelbar.
theken zu erhalten. Falls es danach noch OCIError() abzufangen: Den Namen einer Spalte kann man mit
immer zu Problemen kommt, sollte ver- OCIColumnName() ermitteln. OCI-
sucht werden, die Shell-Variable $LD_ if(!$stmt = OCIParse($db, „select * from table_name“)) { Fetch() und OCIColumnName() erwar-
PRELOAD auf [Link].8.0 zu setzen. $error = OCIError($db); ten je einen zweiten Parameter mit der
Wenn alles geklappt hat listet php_info() echo „Code = $error[code], Message = $error[message]\n“; Nummer der Spalte, beginnend mit Null.
exit;
das OCI8-Modul auf. Eine Auflistung aller Mit diesen Funktionen lässt sich leicht ein
}
Umgebungsvariablen befindet sich im Kas- gesamter Datensatz als assoziatives Array
if(!@OCIExecute($stmt)) {
ten „Umgebungsvariablen“. Sie müssen in der Variablen $obj erstellen. Auf eine
$error = OCIError($stmt);
ggf. an die verwendete Oracle-Version und echo „Code = $error[code], Message =
Fehlerbehandlung wurde im folgenden
den Datenbanknamen angepasst werden. Beispiel verzichtet, um das Beispiel ein-
$error[message]\n“; fach zu halten:
Verbindung aufbauen exit;
Nach diesen vorbereitenden Arbeiten } $stmt = OCIParse($db, „select * from test_table“);
kann mit einem ersten, einfachen Skript OCIExecute($stmt, OCI_DEFAULT);
eine Verbindung zur Datenbank aufge- Die Rückgabe von OCIError() ist ein if(OCIFetch($stmt)) {
$ncols = OCINumCols($stmt);
baut werden: assoziatives Array mit den Einträgen code
for ( $i = 1; $i <= $ncols; $i++ ) {
und message. OCIError() kennt einen op-
$column_name = strtolower(OCIColumnName($stmt, $i));
<?php tionalen Parameter, der den Kontext be-
$column_value = OCIResult($stmt, $i);
$db = OCILogon($dbuser, $dbpassword, $dbname); stimmt, in dem der Fehler aufgetreten ist. $obj[$column_name] = $column_value;
OCILogOff($db); Bei Fehlern, die den Verbindungsaufbau }
?>
betreffen, entfällt der Parameter. Bei Feh- }
lern, die durch OCIParse() erzeugt wur-
Übergeben wird der Funktion OCILo- den, wird die Verbindungskennung über- Alternativ dazu kann man auch
gon() der Benutzername, das entsprechen- geben, bei Fehlern von OCIExecute() die die Funktion OCIFetchInto() verwenden
de Passwort sowie der Datenbankname. aufbereitete Anfrage (Rückgabewert von und ihr als Modus den Wert OCI_AS-
Wie auch bei den anderen Datenbank- OCIParse()). SOC+OCI_RETURN_NULLS überge-
schnittstellen, sind neben nicht persisten- OCIExecute() kennt einen zweiten ben:
ten Verbindungen auch persistente Ver- Parameter, über den festgelegt wird, ob
bindungen mit OCIPLogon() möglich. die Anfrage vollständig durchgeführt OCIFetchInto($stmt, $obj, OCI_ASSOC+OCI_RETURN_NULLS);
Auf ein OCILogOff() sollte dann natür-
lich verzichtet werden. Umgebungsvariablen
Die Ausführung einer SQL-Anfrage ORACLE_HOME=/u01/app/oracle/product/8.1.5 ORACLE_SID=mmk
erfolgt in zwei Schritten. Zunächst wird ORACLE_NLS_LANG=[Link].
die Datenbankanfrage mit OCIParse() we8iso8859p1
aufbereitet und deren Ergebnis mit OCIE- ORA_NLS33=/u01/app/oracle/product/8.1.5
xecute() ausgeführt. Die Rückgabe von /ocommon/nls/admin/data
OCIExecute() ist im Erfolgsfall true, an-

82 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 83

Zugriff auf Oracle Datenbanken


Listing 1
CREATE SEQUENCE Global_id_seq increment by
1 start with 1;

CREATE TABLE Namen (


name_id INTEGER NOT NULL,
name char(50)
PRIMARY KEY (name_id),
UNIQUE (name_id)
);
CREATE TRIGGER Name_id_trigger
BEFORE INSERT ON Namen
FOR EACH ROW
BEGIN
SELECT Global_id_seq.NextVal INTO :new.name_id
FROM DUAL;
END;
Abb. 1: Eingabeformular für einen neuen Mitarbeiter mit Passfoto /

Das Ergebnis ist das gleiche wie im obi- den erfahrenen Oracle-Anwender sollten INSERT INTO Namen VALUES (1, „M. Schmidt“);
gen Beispiel und steht ebenfalls in $obj. Zu sich dadurch keine Einschränkungen erge- SELECT Global_id_seq.currval as id from dual;
beachten ist allerdings, dass die Schlüssel ben. Listing 1 illustriert dies an einem ein-
des Arrays alle in Großbuchstaben ge- fachen Beispiel.
schrieben werden. Sollen alle Ergebnis-
Datensätze mit einer Funktion erfragt
werden, dann kann dies mit OCIFetch-
Die Sequenz Global_id_seq wird dazu
genutzt, beim Einfügen eines neuen Da-
Listing 2
Statement() erfolgen: tensatzes das Feld name_id mit der ak- $lob = OCINewDescriptor($db, OCI_D_LOB);
tuellen Sequenznummer zu füllen. Führt $stmt = OCIParse($db,“insert into mitarbeiter
$nrows = OCIFetchStatement($stmt, $result); man direkt im Anschluss daran die SE- (id, data, mimetype) values ($id, EMPTY_BLOB(),
LECT-Anweisung auf die Tabelle dual ‘$mimetype’) returning data into :the_blob“);
Die Variable $result enthält nach dem aus, erhält man die gerade vergebene OCIBindByName($stmt, ‘:the_blob’, &$lob, -1,
Aufruf ein zweidimensionales Array, des- Nummer. OCI_B_BLOB);
sen erste Dimension der Feldname und Doch es geht auch anders, wenn man if(OCIExecute($stmt, OCI_DEFAULT)) {
dessen zweite Dimension die Nummer die Möglichkeit von Oracle nutzt, PHP- if($lob->save($blob)){
OCICommit($db);
des Datensatzes ist. Auf das Feld id im Variablen an Platzhalter in SQL-Anwei-
OCIFreeDesc($lob);
dritten Datensatz kann man demgemäß sungen zu binden. Dabei kommt die Tren-
OCIFreeStatement($stmt);
mit $result[‘ID’][2] zugreifen. Zu beach- nung in OCIParse() und OCIExecute()
return TRUE;
ten ist hierbei, dass der Feldname durch- zum tragen. In der folgenden SQL-An- } else {
gängig groß geschrieben werden muss. weisung werden solche Platzhalter ver- OCIFreeDescriptor($lob);
Bei SELECT-Anfragen ist darauf zu ach- wendet und durch ein vorangestelltes „:“ OCIFreeStatement($stmt);
ten, dass alle Felder unterschiedliche Na- gekennzeichnet. Ausgangspunkt ist die return FALSE;
men haben, damit OCIFetchInto() und Tabelle aus Listing 1: }
OCIFetchStatement() eindeutige Schlüs- }
sel im assoziativen Array vergeben kön- INSERT INTO Namen (name) VALUES (:name)
nen. Ist dies nicht der Fall, werden frühe- RETURNING ROWID INTO :rid;
re Felder durch spätere überschrieben.
Natürlich lassen sich mit OCIParse() Über die Funktion OCIBindBy
und OCIExecute() auch alle anderen SQL-
Kommandos absetzen. Bei INSERT, UP-
Name() lassen sich diesen Platzhaltern
PHP-Variablen zuordnen, deren Inhalt bei
Listing 3
$id = 23; /* mögliche ID des Datensatzes */
DATE und DELETE sollte ein abschlie- der Ausführung der Anweisung die Platz- $stmt = OCIParse($db,“select * from mitarbeiter where
ßendes COMMIT oder ROLLBACK halter ersetzt. Von besonderer Bedeutung id=$id“);
nicht vergessen werden. Leider existieren ist dabei der Platzhalter :rid, hinter dem while(OCIFetchInto($stmt, $row, OCI_ASSOC) ) {
so praktische Funktionen wie mysql_in- sich ein abstrakter Datentyp unbestimm- $lob_data = $row[„DATA“]->load();
};
sert_id() nicht; sie lassen sich aber durch ter Länge verbirgt. Eine Variable, die an
Sequenzen und Trigger nachbilden. Für diesen Platzhalter gebunden wird, muss

Linux Enterprise Special PHP 83


LE_PHP (73-98) 23.08.2001 10:49 Uhr Seite 84

Datenbanken Zugriff auf Oracle


zunächst mit OCINewDescriptor() er- Abb. 2 : Auf-
zeugt werden: listung aller
Mitarbei-
terfotos
$stmt = OCIParse($db,“insert into Namen (name) values (:name)
returning ROWID into :rid“);
$rowid = OCINewDescriptor($db, OCI_D_ROWID);
OCIBindByName($stmt, „:name“, &$name, 50);
OCIBindByName($stmt, „:rid“, &$rowid, -1, OCI_B_ROWID);

Setzt man die Variable $name auf den


gewünschten Wert und ruft

$name = „Müller“;
OCIExecute($stmt);
OCICommit($db);

auf, wird der Datensatz mit dem Varia-


blenwert eingefügt und man erhält in der
Variablen $rid dessen eindeutige Row ID.
Diese kann beispielsweise dazu verwendet so genannte Large Objects (LOB). Dabei Fazit
werden, Felder der Tabelle, die automa- handelt es sich um unstrukturierte Daten, Dass Oracle eine leistungsfähige Daten-
tisch ausgefüllt wurden, zu erfragen. In die als atomare Einheit in der Datenbank bank ist, braucht nicht noch einmal be-
dem Beispiel in Listing 1 ist dies das Feld abgelegt werden. Nahezu alle Datenban- tont zu werden. Für den PHP-Entwickler
name_id. ken nutzen dafür ihr eigenes API. Zur Ver- ist sie ebenso einsetzbar wie MySQL,
waltung solcher Objekte kennt Oracle eige- wenn auch ein geringfügig höherer Ein-
$stmt = OCIParse($db, „select * from Namen where ne Datentypen, von denen hier nur das arbeitungsaufwand notwendig ist – nicht
ROWID = :rid“); Binary Large Object (BLOB) behandelt zuletzt weil auf Oracle häufig mehrere
OCIBindByName($stmt, „:rid“, &$rowid, -1, OCI_B_ROWID); werden soll. Die Handhabung solcher Möglichkeiten bestehen, ein Ziel zu er-
OCIDefineByName($stmt, „NAME_ID“, $name_id);
BLOBs ist etwas aufwendig. Listing 2 zeigt reichen. Insbesondere solche Eigenschaf-
OCIExecute($stmt);
das Einfügen eines BLOBs. Ausgangs- ten wie Transaktionsmanagement, Refe-
punkt ist eine Tabelle mit drei Feldern, von renzielle Integrität, Stabilität und die
Grundsätzlich bieten sich mehrere denen das Feld data ein BLOB ist. Verfügbarkeit auf vielen Plattformen
Möglichkeiten, die automatisch verge- Für das eigentliche Objekt muss mit zeichnen Oracle aus. Die Möglichkeit,
bende Kennung zu ermitteln. Die einfach- OCINewDescriptor() ein Deskriptor an- PHP-Variablen an Oracle-Variablen zu
ste Methode lässt sich mit OCIDefineBy gelegt werden. Über diesen werden später binden, ist eine sehr nützliche Eigen-
Name() realisieren. Mit ihr lassen sich Fel- die Daten abgespeichert. Der Eintrag in schaft, auf die man bald nicht mehr ver-
der eines Datensatzes an eine PHP-Varia- der Datenbanktabelle erfolgt wie üblich zichten möchte.
ble binden. Dabei ist zu beachten, dass der mit einer INSERT-Anweisung, allerdings Uwe Steinmann ist Geschäftsführer der
Feldname in Großbuchstaben angegeben wird statt der Daten des BLOBs mittels MMK Multimedia Kommunikations Syste-
wird. Feldnamen, die nicht existieren, des Schlüsselwortes EMPTY_BLOB() ein me GmbH in Hagen, sowie seit 1997 PHP
führen nicht zu einer Fehlermeldung. zunächst leeres Objekt eingefügt. Entwickler. In dieser Funktion hat er die
Alternativ dazu kann natürlich mit Der Name der Variable :the_blob, die PHP-Module pdf, cpdf, fdf, hyperwave und
OCIResult() auf den Datensatz zugegrif- mit dem Feld data assoziiert wurde, wird domxml erstellt, bzw. an diesen mitgearbei-
fen werden, oder es kann OCIBindBy mit OCIBindByName() an den Deskrip- tet. In der MMK GmbH wird seit 1993 Li-
Name(), wie schon beim Einfügen des Da- tor gebunden. nux als Betriebssystem eingesetzt.
tensatzes, verwendet werden. Nach dem Ausführen der SQL-Anwei-
Der Deskriptor kann danach mit sung mit OCIExecute() kann man über
$rowid->free() freigegeben werden. die Methode save() des Deskriptors auf
das BLOB zugreifen und darin Daten ab-
Große Brocken legen. save() übergibt man den Wert der Links
Immer häufiger sollen nicht nur struktu- PHP-Variablen $blob, die sinnvollerweise [Link]
rierte Daten, sondern beliebige andere Da- vom Typ String ist, da Strings in PHP auch [Link]#php/
tenblöcke wie beispielsweise Bilder, größe- binäre Daten enthalten können. [Link]/
re Texte oder sogar Videos in Datenbanken Das Auslesen des BLOBs ist etwas ein-
[Link]/manual/
abgelegt werden. Oracle unterstützt daher facher und ist in Listing 3 zu sehen.

84 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 85

Aufbau einer Community Solutions


PHP und MySQL Grundlagen
Viele Anbieter speichern auch „norma-
le“ Inhalts-Webseiten heute nicht mehr
als HTML-Dateien, sondern erzeugen sie
bei Bedarf dynamisch mit PHP und meist
mit einer Datenbank wie MySQL.
Dynamische Seiten kann man leichter
pflegen und konsistent halten, als stati-
sche Seiten. Außerdem kann man damit
Gestaltung und Inhalt voneinander tren-
nen: der Inhalt steckt in einer Datenbank,
die Gestaltung bestimmt das Programm,
das aus den Datenbankinhalten Websei-
ten erzeugt. Durch diese Trennung lassen
sich die gleichen Inhalte für sehr unter-
schiedliche Ausgabegeräte, wie z.B. Desk-
top-Rechner und Palm-Tops aufbereiten.
Betrachter merken von diesem „Um-
weg“ kaum etwas, ihnen könnte höchstens
auffallen, dass die von ihnen aufgerufenen
Seiten nicht die üblichen Endungen .html
oder .htm tragen. Auf ihre Endgeräte laden
sie trotzdem immer ganz normalen

Aufbau einer HTML-Code, der jedoch auf Webservern


nicht in dieser Form gespeichert ist.
Zum Erzeugen dynamischer Seiten
benötigt man ein Programm, das auf dem
Web-Server läuft und die Web-Seiten je-

Community weils frisch auf Anfrage der Benutzer hin


erzeugt. Im Web sehr weit verbreitet sind
hierfür Programme, die in der Sprache
PHP verfasst sind. Die weite Verbreitung
hat sicher damit zu tun, dass PHP sich
von Uwe Debacher und Bernd Kretschmer über ein Modul sehr gut in den Web-Ser-
ver Apache integriert und so zum Be-
standteil des Webservers wird.
Grundlagen zur Arbeit mit PHP und MySQL Der vorliegende Text beschreibt am
Beispiel eines Gästebuchs in der WebSite,
wie man mit PHP und der Datenbank
MySQL dynamisch Web-Seiten erzeugen
kann.
Immer mehr Anbieter von Web-Spei-
cherplatz ermöglichen ihren Kunden die
Nutzung von PHP und MySQL. Falls Ihr
WebSite-Hoster dies erlaubt, können Sie
Kundenbindung spielt gerade im eCommerce Da für diese meist interaktiven Dienste die Beispiele aus diesem Text auch auf
eine immer größere [Link] diese Bindung wie Chat-Bereiche, Diskussionsforen dessen Web-Server nachvollziehen.
oder einfach Gästebücher einfache
aufzubauen und zu stärken, versuchen immer HTML-Seiten nicht ausreichen, bindet Formulare in HTML
mehr Web-Anbieter, Communities aufzubauen man Programmcode ein und greift auf Während Nutzer im bisherigen Beispiel
und ihren Kunden auf den Webseiten Dienst- Datenbanken zu. Genau dies erlaubt nur Seiten anfordern konnten, die ihnen
leistungen anzubieten, die über das eigentliche PHP („PHP Hypertext Preprocessor“, der Webserver dann lieferte, müssen
ursprünglich „Personal Home Page“), Nutzer bei einem Gästebuch auch Daten
Produkt hinausgehen. im Idealfall in Zusammenarbeit mit der eingeben können. Für solche Formulare
Datenbank MySQL. kennt HTML den Form-Tag.

Linux Enterprise Special PHP 85


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 86

Solutions Aufbau einer Community


<FORM ACTION=”[Link]” METHOD=”get”>
<INPUT TYPE=”text” NAME=”name” SIZE=
”Size” MAXLENGTH=”Länge”>
<INPUT TYPE=”submit” VALUE=”Absenden”>
<INPUT TYPE=”reset” VALUE=”Verwerfen”>
</FORM>

Der Einleitungstag gibt ein Pro-


gramm an, das die Eingabedaten auswer-
tet, in diesem Fall ein Programm namens
[Link]. Zusätzlich müssen Sie an-
geben, wie dieses Programm die Daten
erhält.
Dazu gibt es die Möglichkeiten get
und post. Bei der Methode get hängt der
Browser die Daten einfach an die URL
des Auswertprogrammes an.

[Link]?name=Meier

Bei der Methode post sehen Sie die


Daten nicht, da eine Art Dialog erfolgt.
Bei der Programmentwicklung ist die Abb. 1: Dynamische Seiten mit PHP
Methode get praktischer, da Sie besser se-
hen können, welche Daten Sie über das
Netz schicken. Im endgültigen Pro- auch ein Reset-Knopf, mit dem Benutzer auf Ihrem Webserver und rufen Sie das
gramm ist post sinnvoller, da die URL- alle Eingabefelder zurücksetzen können. Formular im Browser auf; das Ergebnis
Zeile übersichtlicher bleibt. Eingabefelder vom Typ Text können sollte mit Abbildung 2 übereinstimmen.
Die zweite Zeile definiert ein Einga- immer nur eine einzige Textzeile aufneh- Wenn Sie als Action im Formular-Tag
befeld mit dem Namen name und der men. Für ein Gästebuch benötigt man für eine Mailadresse angegeben haben, kön-
Größe Size. Diese Angabe betrifft nur die freie Eingaben ein mehrzeiliges Textfeld. nen Sie Ihr Formular leicht testen: erfas-
Darstellung auf dem Bildschirm. Die Ma- PHP bietet dafür den Tag Textarea. sen Sie Eingaben und klicken dann auf
ximalzahl der Zeichen, die Benutzer ein- Mit ein paar Kommentaren und et- Absenden, damit Ihr Browser eine Mail
geben können, legt man mit Maxlength was Anordnung der Elemente kann das an die angegebene Adresse erzeugt.
fest. Formular für ein Gästebuch folgender- Ansonsten müssen Sie mit dem Test
Normalerweise besitzen Formulare maßen aussehen: des Formulares warten, bis Sie das Pro-
mehr als ein Eingabefeld. Die einzelnen gramm zur Auswertung erstellt haben.
Felder unterscheiden sich durch ihre Na- HTML><HEAD><TITLE>G&auml;stebuch Eingabe</TITLE>
men. </HEAD><BODY>
< Formulare mit PHP auswerten
Wichtig für jedes Formular ist ein <CENTER><H1> G&auml;stebuch - Eingabe</H1></CENTER> Nachdem Sie ein Formular erstellt ha-
<FORM ACTION=”[Link]” METHOD=”get”>
Knopf zum Abschicken. Dazu dient der ben, können Sie dessen Daten mit PHP
Ihr Name: <br>
Typ submit. Drücken Benutzer diesen auswerten. Als einfachste Auswertung
<INPUT TYPE=“text“ NAME=“name“ SIZE=“30“ MAX-
Knopf, liest der Browser die Daten im könnte man die übermittelten Daten in
LENGTH=“45“>
Formular aus und übergibt sie an das Aus- <p>E-Mail:<br>
eine Webseite integrieren.
wertprogramm. Üblich in Formularen ist <INPUT TYPE=“text“ NAME=“mail“ SIZE=“30“ MAXLENGTH=“45“> Dazu erstellen Sie die folgende PHP-
<p>Ihr Text:<br> Seite und speichern sie unter dem Namen
<TEXTAREA name=“kommentar“ 1ROWS=“6“ COLS=“30“> [Link] auf Ihrem Server:
Tipp
</TEXTAREA><p>
Für Testzwecke und E-Mail Formulare im Web ganz
<INPUT TYPE=“submit“ VALUE=“Absenden“>
praktisch ist die Möglichkeit, eine E-Mail zu erzeu- <HTML><HEAD><TITLE>G&auml;stebuch -
<INPUT TYPE=“reset“ VALUE=“Verwerfen“>
gen. Dazu geben Sie statt eines Programmnamens Auswertung</TITLE></HEAD><BODY>
</FORM>
mailto: gefolgt von einer E-Mail Adresse an: <CENTER><H1> G&auml;stebuch - Auswertung</H1></CENTER>
</BODY></HTML>
<FORM ACTION=”[Link]
Sie haben folgende Daten eingegeben:<p>
METHOD=”post”>
<?
Um die Datei zu testen, speichern Sie echo „Name: $name<br>“;
sie unter dem Namen [Link] echo „E-Mail: $mail<p>“;

86 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 87

Aufbau einer Community Solutions


• <=Kleiner oder gleich
• > Größer
• >=Größer oder gleich

Die Bedingung können Sie umkehren


bzw. verneinen, indem Sie das Zeichen „!“
voranstellen.
Wenn Sie die Bedingungen testen wol-
len, erweitern Sie einfach das Script aus Lis-
ting 1.
Im oberen Teil des Scripts sehen Sie die
Fallunterscheidungen. Ein Ausdruck wie
!$name ist dann wahr, wenn der Name leer
ist, Benutzer also nichts in das Formular
eingegeben haben.
Wenn das Programm eine fehlerhafte
Eingabe entdeckt, hängt es eine Fehlermel-
dung an die Variable $fehler an, Die erste
Zeile des Scriptes leert dazu den Inhalt der
Variablen.

Listing 1
<HTML><HEAD><TITLE>G&auml;stebuch - Auswertung</TITLE>
Abb. 2: Das Formular im Browser </HEAD><BODY>
<CENTER><H1> G&auml;stebuch - Auswertung</H1></CENTER>
<?
$fehler=“„;
if (!$name):
echo „Text: $kommentar“; if (Bedingung):
$fehler=$fehler . “Fehler: Bitte geben Sie Ihren
?> Befehle;
Namen an!<p>“;
endif;
endif;
</BODY></HTML>
Auch eine zweiseitige Auswahl ist if (!$kommentar):
möglich: $fehler=$fehler . “Fehler: Einen leeren Eintrag
PHP hat automatisch für jeden Feld- akzeptieren wir nicht.<p>“;
endif;
namen aus dem Formular eine gleichna- if (Bedingung):
Befehle; if (!$mail):
mige Variable angelegt und dieser Varia-
else: $fehler=$fehler . “Fehler: Bitte geben Sie Ihre
blen den Feldinhalt zugewiesen. Sie E-Mail Adresse an!<p>“;
Befehle
brauchen sich also nicht um diese Aus- else:
endif;
wertung der Formulare zu kümmern, die if (!strpos($mail, ‘@’)):
Daten stehen zu Ihrer Verfügung. $fehler=$fehler . “Die angegebene Mail-Adresse
Wenn Sie jetzt Ihr Formular erneut Wollen Sie mehr als zwei Fälle unter- kann nicht stimmen<p>“;
ausfüllen und auf „Absenden“ klicken, scheiden, so ist auch folgende Erweite- endif;
dann erstellt Apache die soeben definier- rung vorhanden: endif;
te Antwortseite, die Sie dann in Ihrem
Browser sehen. elseif (Bedingung): if ($fehler):
Befehle; echo “<b>Fehler:</b><p>$fehler“;
Um bei diesem Vorgang nicht alles
else:
mögliche zu speichern, sollte man im
echo “Sie haben folgende Daten eingegeben:<p>“;
Auswert-Programm alle Eingaben auf Bedingungen muss man immer in echo “Name: $name<br>“;
Plausibilität prüfen. Hier im Beispiel soll Klammern setzen. In der Bedingung kön- echo “E-Mail: $mail<p>“;
geprüft werden, ob alle drei Felder ausge- nen folgende Vergleichsoperatoren auf- echo “Text: $kommentar“;
füllt sind und ob die Mail-Adresse ein At- tauchen: endif;
Zeichen @ enthält. ?>
Für bedingte Anweisungen und Fal- • ==Gleich
lunterscheidungen besitzt PHP folgende • != Ungleich </BODY></HTML>
Syntax: • < Kleiner

Linux Enterprise Special PHP 87


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 88

Solutions Aufbau einer Community


Die Überprüfung der Mailadresse auf die Sie im Beispiel davor bereits kennenge- tems zunächst an einer einzelnen Person
das Vorhandensein des At-Zeichens ist lernt haben. hing und nicht mehr so schnell voran kam,
nur dann notwendig, wenn sie nicht so- Für eine sinnvolle Funktionalität müs- fand sich eine Gruppe von Programmie-
wieso schon leer ist. Die PHP Funktion ste das Programm die Eingaben speichern rern, die die Datenbank unter dem Namen
strpos ermittelt die Position des ersten können. Dazu kann man die freie Daten- MySQL ganz neu, aber befehlskompatibel
Auftretens vom At-Zeichen in der Maila- bank MySQL nutzen. zu mSQL entwickelte. Diese Programmie-
dresse. Wenn das Zeichen nicht vor- rer haben in der Zwischenzeit die kommer-
kommt, ist die angegebene Bedingung MySQL zielle Firma MySQL AB gegründet, die die
nicht erfüllt und das Script erweitert den SQL steht für Structured Query Language, Datenbank im Sinne von Open Source
Fehlertext. strukturierte Abfragesprache. Diese weit weiterentwickelt und von Dienstleistun-
Am Ende prüft das Script, ob die Varia- verbreitete und standardisierte Sprache gen und Anwendungsprogrammierung im
ble $fehler einen Wert erhalten hat. Enthält wird auch von proprietären Datenbanken Umfeld der Datenbank lebt.
diese Variable einen Wert, war die Eingabe wie Microsoft Access unterstützt. Eine Bevor Sie mit MySQL konkret arbei-
fehlerhaft und das Script gibt den Fehlertext Untermenge der möglichen Befehle brach- ten können, benötigen Sie eine Daten-
aus. Ist der Inhalt der Variablen leer geblie- te mSQL (Mini SQL) auf viele Linux-Ser- bank, auf die Sie und Ihr Webserver Zu-
ben, kommt das Programm zu den Zeilen, ver. Nachdem die Entwicklung dieses Sys- griff haben. Innerhalb einer Datenbank

mysql_setpermission
Die Datenbank MySQL verfügt über ein recht ausgefeiltes Berechtigungssystem, Für das Anlegen einer neuen Datenbank mit Benutzer-Rechten bietet sich der Menü-
das Erst-Nutzern anfangs oft Probleme bereitet. Seine Benutzerverwaltung ist na- punkt 2 an. In dem folgenden Dialog sind Benutzereingaben fett hervorgehoben.
hezu unabhängig von der des Linux-Systems.
Nach der Installation hat nur der Systemverwalter root Zugriff auf die Datenbank, Which database would you like to add: community
ein Passwort ist nicht gesetzt. The new database community will be created

Diese Rechteverwaltung arbeitet mit der Datenbank mysql, die die Installation an-
What username is to be created: wwwrun
legt. Innerhalb dieser Datenbank sind vor allem drei Tabellen wichtig:
Username = wwwrun
• db – die Datenbanken im System Would you like to set a password for wwwrun [y/n]: n
• host – die Rechner mit Rechten We won’t set a password so the user doesn’t have to use it
• user – die Benutzer We now need to know from what host(s) the user will connect.
Keep in mind that % means ‘from any host’ ...
Bitte entnehmen Sie Details dieser Tabellen der mitgelieferten Dokumentation. Für
The host please: localhost
den normalen Betrieb richten Sie die Rechte mit dem Tool mysql_setpermissions
Would you like to add another host [yes/no]: yes
ein:
Okay, give us the host please: %
/usr/bin/mysql_setpermission -u root
Would you like to add another host [yes/no]: no
Zunächst fragt Sie das Programm nach dem Passwort und dann ein zeichenorien- Okay we keep it with this ...
tiertes Menü nach Ihren Wünschen: The following host(s) will be used: localhost,%.
###########################################################
Password for user root to connect to MySQL:
################################################## That was it ... here is an overview of what you gave to me:
## Welcome to the permission setter 1.2 for MySQL. The database name : community
## made by Luuk de Boer The username : wwwrun
################################################## The host(s) : localhost,%
What would you like to do: ###########################################################
1. Set password for a user. Are you pretty sure you would like to implement this [yes/no]: yes
2. Add a database + user privilege for that database. Okay ... let’s go then ..
- user can do all except all admin functions
Everything is inserted and mysql privileges have been reloaded.
3. Add user privilege for an existing database.
- user can do all except all admin functions
4. Add user privilege for an existing database. Als Host sollten Sie immer localhost angeben, da Sie sonst nicht über den Webser-
- user can do all except all admin functions + no create/drop ver zugreifen können. Wollen Sie auch den Zugriff über einzelne Klienten ermög-
5. Add user privilege for an existing database. lichen, eventuell über einen ODBC-Treiber und Access, so müssen Sie alle Rechner
- user can do only selects (no update/delete/insert etc.) angeben, im einfachsten Fall über das Jokerzeichen %. Falls Ihr Server ständig vom
0. exit this program Internet aus erreichbar ist, schafft das Jokerzeichen Sicherheitsrisiken. In diesem
Make your choice [1,2,3,4,5,0]: Fall sollten Sie die Rechner besser konkret angeben.

88 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 89

Aufbau einer Community Solutions


können Sie beliebig viele Tabellen mit nen Sie die Tabelle direkt mit dem Front steckt in der Variablen $abfrage. Wenn
den eigentlichen Daten anlegen. Das An- end-Programm mysql anlegen. Sie können Sie Übersichtlichkeit zu schätzen wissen,
legen einer Datenbank ist nicht ganz tri- die Tabelle aber auch mit PHP anlegen. sollten Sie sie schrittweise aufbauen.
vial, da MySQL eine sehr detaillierte Eine Tabelle anlegen können Sie in Zusätzlich vorgesehen in der Tabelle
Rechteverwaltung besitzt. Im Idealfall MySQL mit dem Befehl CREATE (die sind die Felder id und datum, die beide im
legt Ihr Provider oder Ihr Systemadmi- Dokumentation nennt Befehle Clause). Formular nicht auftauchen. In dem Feld
nistrator für Sie eine Datenbank mit den Diese Clause haben grundsätzlich fol-
passenden Rechten an. Sollten Sie selber genden Aufbau:
der Systemadministrator sein, so hilft Ih-
nen das mitgelieferte Programm mysql_ CREATE TABLE tabellen_name ( Listing 3
setpermission, eine Datenbank einzu- feld_name1 feld_typ [option], <HTML><HEAD><TITLE>G&auml;stebuch -
feld_name2 feld_typ [option], Datenbankeintrag</TITLE></HEAD><BODY>
richten und mit sinnvollen Zugriffsrech-
feld_name3 feld_typ [option] ); <CENTER><H1> G&auml;stebuch -
ten auszustatten. Eine einführende Be-
Datenbankeintrag</H1></CENTER>
schreibung zu diesem Programm finden <?
in einem extra Kasten. Für jedes Datenfeld müssen Sie einen $fehler=“„;
Der weitere Text geht davon aus, dass Feldnamen angeben, einen Datentyp für if (!$name):
Sie eine Datenbank mit dem Namen com- das Feld und bei Bedarf zusätzliche Op- $fehler=$fehler .
munity zur Verfügung haben. Sollte Ihre tionen. “Fehler: Bitte geben Sie Ihren Namen an!<p>“;
Datenbank einen anderen Namen besit- MySQL kennt fast dreißig Datenty- endif;
zen, so müssen Sie die Programme ent- pen, für das Gästebuch relevant sind da- if (!$kommentar):
sprechend anpassen. von: $fehler=$fehler .
“Fehler: Einen leeren Eintrag akzeptieren wir nicht.<p>“;
endif;
Erzeugen einer MySQL-Tabelle mit PHP •CHAR(Länge): Zeichenketten, letztend-
if (!$mail):
Bevor Sie Ihr Gästebuch um eine Daten- lich Strings (max. 255 Zeichen)
$fehler=$fehler .
bankanbindung erweitern können, benö- •INT: ganze Zahlen
“Fehler: Bitte geben Sie Ihre E-Mail Adresse an!<p>“;
tigen Sie eine Tabelle innerhalb der Daten- •TEXT: Text, maximale Länge 65535 else:
bank community. Wenn Sie direkten (2^16 - 1) Zeichen if (!strpos($mail, ‘@’)):
Zugriff auf den Server haben, dann kön- $fehler=$fehler .
Als Optionen sind für das Beispiel “Die angegebene Mail-Adresse kann nicht stimmen<p>“;
wichtig: endif;

Listing 2 •NOT NULL: Das Feld darf nicht leer


endif;

<HTML><HEAD><TITLE>G&auml;stebuch - Anlegen der


bleiben if ($fehler):
Datenbank</TITLE></HEAD><BODY>
echo “<b>Fehler:</b><p>$fehler“;
<CENTER><H1> G&auml;stebuch - •PRIMARY KEY: Primärschlüssel, Haupt-
else:
Anlegen der Datenbank</H1></CENTER> sortierkriterium für die Datenbank
$datum=date(„d.m.Y“);
<? •AUTO_INCREMENT: Die Daten-
mysql_connect(„localhost“);
mysql_connect(“localhost“); bank erhöht diesen Wert automatisch, $abfrage=“INSERT INTO gaestebuch VALUES(NULL, „;
$abfrage=“CREATE TABLE gaestebuch („; geht nur für Primärschlüssel $abfrage=$abfrage . “‘$datum’,“;
$abfrage=$abfrage . “id INT NOT NULL AUTO_
$abfrage=$abfrage . “‘$name’, „;
INCREMENT PRIMARY KEY,“; Generell können Sie jede Abfrage per $abfrage=$abfrage . “‘$mail’,“;
$abfrage=$abfrage . “ datum CHAR(10),“;
PHP an die Datenbank weitergeben. Die $abfrage=$abfrage . “‘$kommentar’);“;
$abfrage=$abfrage . “ name CHAR(45),“;
Syntax dafür lautet: echo “$abfrage<p>“;
$abfrage=$abfrage . “ email CHAR(45),“;
$result=mysql_db_query(“community“, $abfrage);
$abfrage=$abfrage . “ kommentar TEXT)“;
$result=mysql_db_query(Datenbank, Abfrage); $error=mysql_error();
$result=mysql_db_query(“community“, $abfrage);
if ($error):
$error=mysql_error();
echo “Fehler: $error“;
if ($error): Die Variable $result bekommt den
else:
echo “Fehler: $error“; Wert false, wenn es zu einem Fehler ge-
echo “Ihre Eingaben wurden gespeichert“;
else: kommen ist, ansonsten bietet sie Zugriff endif;
echo “Datenbank erfolgreich angelegt“; auf das Ergebnis der Abfrage. mysql_close();
endif; Damit können Sie jetzt ein Script ge- endif;
mysql_close(); mäß Listing 2 erstellen und unter dem
?>
Namen [Link] auf Ihrem Webser- ?>
ver ablegen.
</BODY></HTML>
Die eigentliche Datenbankanfrage, </BODY></HTML>
oder hier besser Datenbankanweisung

Linux Enterprise Special PHP 89


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 90

Solutions Aufbau einer Community


Datum können Sie das Eingabedatum für Ausgabe aller Datensätze $result=mysql_db_query(„community“, $abfrage);
den Datensatz speichern. Die id ist als Sie oder Ihre Benutzer haben nun immer
eindeutiges Kennzeichen für den Daten- mehr Datensätze in Ihre Datenbank ein- Im einfachsten Fall ermittlen Sie erst
satz gedacht, die Datenbank erhöht die- getragen. Jetzt benötigen Sie noch einen einmal, wieviele Einträge Ihre Daten-
ses Feld automatisch mit jeder Eingabe. Weg, um diese Datensätze wieder anzu- bank hat. Bei allen Abfragen, die sich auf
Wenn Sie die Datenbank erfolgreich zeigen. die vorher gestellte Datenbankabfrage
angelegt haben, dann können Sie begin- Tabelleninhalte kann man in MySQL beziehen, müssen Sie die dabei benutzte
nen, Test-Datensätze einzugeben. mit dem SQL-Befehl SELECT abfragen. Variable $result mit angeben.
Diese Clause hat grundsätzlich folgen-
Eingabe von MySQL-Daten mit PHP den Aufbau: $anzahl = mysql_numrows($result);
Zur Eingabe von Daten benutzen Sie die
SQL Clause INSERT, am einfachsten in SELECT feld1, feld2, ... FROM tabellen_name WHERE bedingung Nun brauchen Sie nur noch in einer
der Form INSERT INTO tabellen_name Wiederholungs-Struktur die vorhande-
VALUES (wert1, wert2,..), wobei Sie die nen Datensätze abzufragen und auf dem
Daten für Textfelder in einfache Hoch- Bildschirm darzustellen. Eine einfache
kommata setzen müssen. Bedingungen der Wiederholung hat folgenden Aufbau:
Erweitern Sie nun Ihr Script aus-
[Link] gemäß Listing 3. Abfrage angeben for ($i=0;$i<10;$i++)
Auch dieses Script baut die eigentli- echo $i;
che Datenbankabfrage wieder schritt-
weise auf, um überlange und unüber- Sie können hier festlegen, welche Fel- Hinter dem Schlüsselwort for geben
sichtliche Zeilen zu vermeiden. der der passenden Datensätze Sie benöti- Sie in einer Klammer den Startwert, die
Wenn Sie jetzt erneut Ihr Formular gen. Wenn Sie alle Felder der Datensätze Endbedingung und die Schrittweite an,
aufrufen, einen Datensatz eingeben und benötigen, können Sie hier das Jokerzei- jeweils durch ein Semikolon voneinander
auf Absenden drücken, sollte Ihr Script chen „*“ verwenden. Mit dem WHERE- getrennt. Nach der Klammer folgt dann
melden, dass es den Datensatz erfolg- Teil können Sie Bedingungen angeben, der auszuführende Befehl. Wollen Sie
reich gespeichert hat, zumindest wenn er dann liefert die Datenbank nur die zu- innerhalb einer Wiederholung mehrere
vollständig war. treffenden Datensätze. Denkbar wäre Befehle ausführen, müssen Sie diese mit
hier etwa folgende Abfrage: einer geschweiften Klammer zusammen-
fassen.
Listing 4 SELECT * FROM gaestebuch WHERE name=’Meier’ Ein einzelnes Attribut, wie z.B. name,
eines bestimmten Datensatzes (hier des-
<HTML><HEAD><TITLE>G&auml;stebuch -
Im vorliegenden Beispiel wollen Sie jenigen mit der laufenden Nummer 5)
Ausgabe</TITLE></HEAD><BODY>
<CENTER><H1> G&auml;stebuch - Ausgabe</H1></CENTER>
alle Datensätze abfragen, dann können fragen Sie ab mit:
<? Sie den WHERE-Teil einfach weglassen:
mysql_connect(“localhost“); $name=mysql_result($result, 5, „name“);
$abfrage=“SELECT * FROM gaestebuch“; SELECT * FROM gaestebuch
$result=mysql_db_query(“community“, $abfrage); Wenn Sie dies alles zusammenfassen
$anzahl = mysql_numrows($result); Diesen SQL-Befehl können Sie nun in ergibt sich Listing 4. Speichern Sie das
echo “$anzahl Eintr&auml;ge<p>“; Ihr PHP-Skript einbinden. Dabei müssen Script unter dem Namen [Link] ab
for ($i=0;$i<$anzahl;$i++) { Sie beachten, dass das Ergebnis Ihrer An- und rufen es über den Browser auf.
$id=mysql_result($result, $i, “id“);
frage eine Tabelle ist, die Sie später Experimentieren Sie ruhig etwas mit
$datum=mysql_result($result, $i,“datum“);
schrittweise einlesen wollen. Sie sichern der Ausgabe der Datensätze herum.
$name=mysql_result($result, $i, “name“);
daher den Rückgabewert der Daten-
$email=mysql_result($result, $i,“email“);
$kommentar=mysql_result($result, $i, “kommentar“);
bankabfrage in einer Variablen $result, Fazit
echo “Datensatz $id: „; über die Sie jederzeit auf die einzelnen Mit PHP und MySQL kann man relativ
echo “<a href=\“[Link] Datensätze zugreifen können. schnell interaktive Elemente in Websei-
meinte am $datum<p>“; ten einbauen. Die hier gezeigten Beispiele
echo “$kommentar<p><hr><p>“; $abfrage=“SELECT * FROM gaestebuch“; können dazu als Grundgerüst dienen. Al-
} le hier vorgestellten Listings der Autoren
mysql_close(); Tipp sowie einige Erweiterungen können Sie
?> Achten Sie bitte beim echo-Befehl darauf, dass Sie von der Web-Site des Franzis-Buchs „Li-
Hochkommata innerhalb von HTML-Befehlen in der
nux im Windows-Netz“ unter der Adres-
</BODY></HTML> Form \“ schreiben, damit PHP sie nicht als Ende des
se [Link]/php/ finden und be-
Echo-Textes betrachtet.
ziehen.

90 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 91

Groupware Solutions

Teamarbeit
Die hier beschriebenen Applikationen
weisen alle einen beeindruckenden Funk-
tionsumfang auf. Auch nur eine davon
hier komplett zu beschreiben, würde den
Rahmen sprengen. Nachfolgend sind des-

im Netz
halb nur einzelne Aspekte beschrieben –
ein umfassendes Urteil lässt sich daraus
nicht ableiten.
Betrachtet wurden hier nur Groupwa-
re-Systeme, die unter einer Open-Source-
von Albrecht Günther Lizenz veröffentlicht werden. Die bekann-
teste dieser Art ist die General Public
Groupware-Tools in PHP Licence, kurz GPL (siehe hierzu die Web-
seite der GNU Foundation [Link].
org).

Außer Konkurrenz
Viele Open-Source-Applikationen suchen
die Nähe zum Begriff „Groupware“. Legt
man jedoch die oben genannten Kriterien
Aufgrund der mächtigen Funktionen zur Da- Was ist Groupware? zugrunde, dann wird deutlich, dass viele
tenbankanbindung eignet sich PHP hervorra- Auch wenn das Wort „Groupware“ häu- Applikationen diese Anforderungen nur
fig zitiert wird: Es ist nicht leicht, eine ver- zum kleinen Teil erfüllen. So gibt es bei-
gend für dynamische Applikationen, die über bindliche Definition dafür zu finden. Die spielsweise einige gute Kalender im Netz
das Internet bedient [Link] dem Be- zunächst wichtigste Eigenschaft von ([Link]/~cknudsen/webcalendar
reich der Content Management Systeme Groupware besteht darin, Informationen oder [Link]
nimmt auch die Groupware einen breiten und Daten für mehrere Anwender zu or- net), die allerdings weitergehende Funk-
ganisieren, darzustellen und zu verwalten. tionen vermissen lassen. Andere Soft-
Raum in der Anwendungspalette ein. Der große Vorteil einer Groupware unter ware-Programme bieten die gewünschten
PHP ist, dass sie sich auf verschiedene Be- Funktionen, ihnen mangelt es jedoch an
triebssysteme portieren lässt und in Bezug der Gruppenfähigkeit (z.B. Phorecast -
auf die Voraussetzungen beim User an- [Link]
spruchslos ist: Dieser benötigt nichts wei- Schließlich finden sich auch Beispiele
teres, als einen Browser. wie Eridu ([Link]) oder BHC-
Welche Anforderungen sind an eine Intranet ([Link]
Groupware zu stellen? Zu nennen ist hier net), die nach einem durchaus eindrucks-
zunächst eine Verwaltung der Anwender - vollen Start seit geraumer Zeit nichts mehr
möglichst in verschiedenen Hierarchiebe- veröffentlicht haben. Den Autoren scheint
nen. So können beispielsweise Mitarbei- schlichtweg die Puste ausgegangen zu sein.
ter, Vorgesetzte oder Systemadministrato- Andere Systeme bieten eine umfang-
ren jeweils verschiedene Rechte zu reiche Vorschau auf Ihrer Homepage. Die
Ansichten und Aktionen zugeteilt bekom- genannten Features sind jedoch zum größ-
men. Weitergehende Systeme bieten eine ten Teil in der Entwicklung und können
Rechtefreigabe pro Anwendung, Datei, hier nicht berücksichtigt werden. So hat
Termin oder Notiz an, je nachdem auch beispielsweise das Projekt Horde (www.
mit Lese- und/oder Schreibrechten. Eine [Link]) einen ansehnlichen Katalog
Groupware sollte neben einem gruppen- von geplanten Projekten in petto, von de-
basierten Terminkalender auch ein nen allerdings erst eines dem Entwick-
Adressbuch beinhalten und über eine ge- lungsstadium entwachsen ist – hierbei
meinsame Dateiablage sowie ein Informa- handelt es sich um einen komfortablen
tions- oder Planungssystem verfügen. Die- eMail-Client.
ses kann von einfachen To-do-Listen bis Eine weitere Kategorie von Tools
hin zum ausgeklügelten Aufgabensystem brachte den Autor in einen kleinen Gewis-
innerhalb eines Projektmanagements rei- senskonflikt: Dabei handelt es sich um
chen. Projektmanagementsysteme, die zum Teil

Linux Enterprise Special PHP 91


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 92

Solutions Groupware
werden, erst dann kann man in der Edit-
Maske die zusätzlichen Parameter editie-
ren. Einige der Twig-Module ließen sich
nur auf Gruppenebene bedienen, zum Bei-
spiel die Bookmarkverwaltung. Sehr
komfortabel angelegt ist die Übernahme
von Kontakten aus fremden Adressbü-
chern, hier existieren Importroutinen für
sechs Programme. Es fehlen jedoch die für
die Groupware wichtigen Module wie die
gemeinsame Dateiablage oder ein Projekt-
management. In letzter Zeit ist es etwas
still um die Entwicklung von Twig gewor-
den. Bei den letzten Releases handelt es
sich lediglich um Bugfixes.
Abb. 1: Zentrales Element von Twig ist ein umfangreicher Mail-Client
PHProjekt
Ein Newcomer unter den Groupware-Lö-
sungen ist PHProjekt aus deutschen Lan-
den. Obwohl erst vor einem halben Jahr
veröffentlicht, erfreut es sich reger Auf-
merksamkeit. Die Setup-Routine führt
den Anwender durch sämtliche Stationen
der Installation und verzichtet auf ein ma-
nuelles Editieren von Konfigurationsda-
teien. Das Prinzip der Anwendung, mög-
lichst viele Informationen auf einen Blick
zu bekommen, zeigt sich gleich beim ers-
ten Aufruf: Tagestermine, To-dos, Noti-
zen, Umfragen, aktuelle Projekte und of-
fene Anfragen durch den Request-Tracker
sind auf der Hauptseite aufgelistet. Unter-
halb der Menüleiste kann man seine
„Stempeluhr“ betätigen, um später die
angefallenen Stunden auf der Zeitkarte
einzelnen Projekten zuzuweisen.
Abb. 2: Mit PHProjekt erhält man viele Informationen auf einen Blick Einige Kleinigkeiten stören das sonst
positive Gesamtbild: so ist das Bemer-
kungsfeld des Kalenders etwas klein gera-
gute Gruppenfunktionen beinhalten. Twig bereits ein „alter Hase“: Schon 1998 ten. Eine Verknüpfung zu Kontakten und
Doch das Fehlen anderer Komponenten erschien die erste öffentliche Version von Projekten ist erst in Vorbereitung. Dafür
und die Tatsache, dass die vorgestellten Twig (= The Web Information Gateway), sind die Möglichkeiten, in den Terminka-
Groupware-Lösungen überwiegend ein der als einziger Kandidat auch für einen lendern von Kollegen und anderen Usern
Projektplanungsmodul besitzen, führte Teilbetrieb eine Installation ohne Daten- zu lesen und auch zu schreiben, sehr viel-
zur Einordnung in die Kategorie „außer bank erlaubt. Die Installation gestaltet fältig.
Konkurrenz“. Wer sich hier trotzdem um- sich jedoch recht langwierig: Laut Instal- Leider fehlt ein Modul zur Verwaltung
tun möchte, der sei beispielsweise auf lationsanweisung sind bis zu zehn ver- eingetroffener eMails (lediglich das Senden
Achievo ([Link]) und Double schiedene Konfigurationsdateien zu edi- ist möglich), so dass man hier auf seinen ge-
Choco Latte ([Link] tieren. Zentrales Element von Twig ist ein wohnten Mailreader zurückgreifen wird.
verwiesen. umfangreicher Mail-Client, und neben ei- Die Dateiablage bietet die Möglich-
nem Terminkalender und einem Kontakt- keit, Dokumente nur ausgewählten Usern
Twig Manager können auch Newsgroups gele- zugänglich zu machen und jeweils Bemer-
Gemessen am Alter anderer PHP-Tools sen werden. Etwas umständlich ist die kungen den Dateien hinzuzufügen.
(alle anderen hier vorgestellten Groupwa- Eingabe von wiederkehrenden Terminen: Das ausführliche Hilfesysstem liegt in
re-Versionen sind jünger als ein Jahr), ist Der Einzel-Termin muss zuerst angelegt Deutsch und drei weiteren Sprachen vor.

92 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 93

Groupware Solutions
lich mehr als die anderen Kandidaten.
Auch ein umfangreiches Fehlermanage-
ment ist enthalten.
Etwas irritierend ist die Möglichkeit,
beim Dateiupload den Autor manuell ein-
tragen zu können, anschließend wird
jedoch ein nicht vorhandener Eintrag zu-
rückgewiesen. Eine automatische Über-
nahme des Nutzers wäre hier einfacher ge-
wesen. Die englische Hilfefunktion ist
leider etwas dünn geraten. Eine Java-Ver-
sion der Anwendung ist seit längerer Zeit
in Vorbereitung. Tutos ist das richtige
Werkzeug für Teams, die die Organisation
Ihrer Arbeit über Projekte definieren.

Phpgroupware
Eine große Entwicklergemeinde steht hin-
Abb. 3: Im Projektmanagement ist Tutos anderen Groupware-Lösungen überlegen
ter Phpgroupware: Gleich 46 Entwickler
listet der Eintrag bei Sourceforge auf.
Phpgroupware versteht sich eher als „Ap-
Tutos Zu fast jedem Eintrag in einem Modul plication-Framework“, also als Contai-
Tutos steht für „The Ultimate Team Orga- gibt es einen Link, der zur Beschreibung ner für verschiedene Module einer Group-
nisation Software“. Das Programm rich- des Eintrags führt, so kann man sich ware-Anwendung. Die Zusammenarbeit
tet sich stark am Projektmanagement aus. schnell Zusatzinformationen verschaf- so vieler Entwickler bringt auch einen ver-
So können Notizen und Dokumente nur fen. Etwas gewöhnungsbedürftig ist die mehrten Abstimmungsbedarf mit sich:
über das ihnen zugewiesene Projekt Benutzerführung – so taucht die Linkleis- Zum Zeitpunkt der Artikelerstellung hat
erreicht werden, was eine gesammelte te zuweilen am unteren Rand der Seite der Projektmanager ein „Feature-Freeze“
Übersicht erschwert. Sehr praktisch ist auf, zu der man sich erst hinscrollen muss. verfügt, um vorhandene Bugs auszumer-
die Möglichkeit, gleich mehrere Re- Zu den Einträgen in den meisten Modu- zen.
ssourcen auf einen Termin buchen zu kön- len gelangt man erst mittels einer Such- Als einziger Kandidat verwendet
nen. Auf einen möglichen Konflikt in der maske. Ob Statistiken, Timelines, Ar- Phpgroupware Templates – deshalb kann
Terminplanung oder der Ressourcennut- beitspakete oder Historien: In Sachen das Aussehen der Anwendung je nach
zung wird man jedoch nicht hingewiesen. Projektmanagement bietet Tutos wesent- Gusto variiert werden. Der Terminkalen-

PHProjekt Tutos phpgroupware Twig


URL [Link] [Link] [Link] [Link]

Aktuelle 2.0.2 20010408 0.9.9pl1 2.6.2


Version
Demo [Link]/ [Link] [Link]/[Link] [Link]
demo [Link]
Download [Link]/ [Link] [Link]/[Link]? [Link]
download/ [Link] tutos/[Link].bz2 filename=[Link] [Link]
Größe 302 kB 338 kB 998 kB 664 kB

Sprachen 16 8 10 17

PHP3/PHP4 PHP4 PHP4 PHP3/PHP4 PHP3/PHP4

Unterstützte Mysql, Postgres, oracle, infor- MySQL, Postgres MySQL, Postgres Mysql, postgres, interbase, oracle, sybase,
mix mssql, dbase
Datenbanken
Hilfesystem de, en, fr, sp en en en

Lizenz GPL GPL GPL GPL

Tabelle 1: Groupware-Lösungen im Vergleich

Linux Enterprise Special PHP 93


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 94

Solutions Groupware
der ist übersichtlich und bietet alle nöti-
gen Features. Allerdings werden bis auf
die Tagesansicht alle Termine in einer Lis-
tenform angeboten, eigene und fremde
Termine werden gemischt aufgeführt.
Der eMail-Reader ist durchdacht struk-
turiert und lässt kaum Wünsche offen.
Wie ebenfalls bei Twig können zusätzlich
zu einzelnen V-Cards Kontaktlisten frem-
der Adressbücher importiert werden. Im
Filemanager lassen sich ASCII-Dateien
direkt editieren. Einige der Module sind
eher für Entwickler gedacht (cvs, headli-
nes) oder bislang nur für das US-Gebiet
anwendbar, wie beispielsweise das Wet-
ter. Die übersichtliche Hilfefunktion ist
leider nur in Englisch verfügbar. Insge-
samt zählt Phpgroupware jedoch zu den
interessantesten Kandidaten und man
darf mit Recht auf die Version 1.0 ge-
spannt sein. Abb. 4: Phpgroupware versteht sich eher als „Application-Framework“

Fazit
Systemadministratoren sollten in Zu- PHProjekt Tutos Phpgroupware Twig
kunft den reflexartigen Griff zu den
allseits bekannten kommerziellen Stan- Terminplaner ja ja ja ja

dardprodukten unterdrücken: Die vorge-


Adressbuch ja ja ja ja
stellten Groupware-Applikationen sind
alle gut geeignet, um die in Gruppen anfal- Forum ja nein nein nein
lende Arbeit zu organisieren. Aufgrund
der Open-Source-Lizenz dürfen alle Ap- Email senden/empfangen ja/nein nein/nein ja/ja ja/ja

plikationen nach den Wünschen der User ja ja nein nein


Projekt-management
angepasst oder erweitert werden. Ledig-
lich in einigen Modulen zeigt sich die Chat ja nein ja nein
unterschiedliche Gewichtung der Pro-
Dateiablage ja ja ja nein
gramme: Während bei Tutos oder Twig
der Kommunikationsteil recht dünn aus- ja ja
Bookmarks
gefallen ist, bieten Phpgroupware und
PHProjekt mit einem Forum, einem Chat- Usenet nein nein ja ja
oder Umfragesystem mehr Möglichkei-
Umfragen ja nein ja nein
ten. Dafür ist der Mailclient bei Twig sehr
komfortabel und robust, PHProjekt weist ja nein ja nein
Foren
hier lediglich ein Modul zum Senden auf.
Eine Dateiablage fehlt bei Twig völlig. Es To-do-Listen ja ja ja ja
verzichtet ebenfalls auf ein Projektma-
Trouble ticket system ja ja ja nein
nagement, dieses wiederum ist bei Tutos
sehr ausgeklügelt. PHProjekt bietet oben- Notizen ja nein ja ja
drein die Möglichkeit, über die Zeitkarte
erfasste Arbeitsstunden auf Projekte zu Bookmark Verwaltung ja nein ja ja
buchen.
Projekt-management ja ja ja nein
Ein Besuch der jeweiligen Demoseiten
vermittelt Interessenten recht schnell einen Weitere Module Zeitkartensystem, Installations- FTP & Napster client,
Eindruck, welche Groupware für die indi- Volltextsuche übersicht headlines (US)
viduellen Bedürfnisse am besten geeignet
ist. Tabelle 2: Moduleausstattung der Groupware-Lösungen

94 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 95

Voice Portal Solutions

Mit PHP
ner integrierten Entwicklungsumgebung,
die eine komplexe Basistechnologie zur
Entwicklung von Webapplikationen be-
reitstellt. Mit ihrem Kernprodukt Mag-
uma PHP4 Enterprise Edition zielt die

gut Wetter
Maguma AG genau auf diese Bedürfnisse
ab. Wie die meisten Open Source Projekte
läuft auch PHP besonders stabil. Mit der
am 22. Mai 2000 freigegebenen Version
PHP 4.0 wandelte sich PHP außerdem in

machen eine umfangreiche Middleware-Technik.


Diese eignet sich auch bestens für die Ver-
wendung komplexer Skripte in mittleren
und größeren Projekten – mit den Solu-
tions der Maguma AG zum Beispiel in den
Bereichen Mobile Internet und Voice-
von Martin Drahorad
Technologien. Zusätzlich profitieren die
Entwickler von einer verkürzten Time-to-
Market, umfassender Connectivity, ver-
besserter Anbindung an die vordefinierte
Maguma erstellt mit IBM Voice Portal für Unternehmenslogik, Portabilität und er-
Wetterinformationen im Südtiroler Bürgernetz höhter Leistungsstärke.

15 internationale PHP-Pioniere arbeiten


an der Maguma PHP 4 Enterprise Edition
Das im Mai 2000 von Tobias Ratschiller
in Südtirol gegründete Software-Unter-
nehmen Maguma AG hat sich daher ganz
der Open Source Skriptsprache PHP ver-
schrieben. Bereits ein Jahr nach Firmen-
gründung blickt der in der Open Source
Gemeinde seit Jahren weltweit als heraus-
ragende PHP-Koryphäe bekannte Rat-
schiller auf zahlreiche Erfolge zurück: 15
internationale PHP-Pioniere zählt er be-
reits zu seiner hochkarätigen Mann-
schaft, die bis zum Jahresende noch durch
weitere zehn Experten verstärkt werden
soll. Außerdem wurden neben der zwei-
ten Finanzierungsrunde die Entwicklung
Der Gedanke, dynamische Websites auf PHP- Das Development Kit ermöglicht eine der Basistechnologie abgeschlossen und
Basis zu entwickeln, ist nicht neu:Die Open schnellere Entwicklung hochwertiger diverse Patente auf die Technologie ange-
komplexer Web-Applikationen in PHP – meldet. Die Markteinführung der Mag-
Source-Skriptsprache wird einer Studie von und das um bis zu 50 Prozent schneller, als uma PHP4 Enterprise Edition ist für An-
Netcraft aus dem Jahr 2001 zufolge bereits in die Programmierung mit Hilfe einer der fang 2002 geplant. Beta-Versionen sind
über sechs Prozent aller Webdomains verwen- klassischen Programmier- oder Skript- jedoch bereits in verschiedenen Projekten
det – Tendenz [Link] dagegen ist das sprachen in Anspruch nehmen würde. im Einsatz.
Mittelfristig wird dieses Leistungsspek-
Angebot spezieller Tools und professionellen trum außerdem dazu beitragen, die Ein- Pilotprojekt Südtiroler Bürgernetz Voice
Supports für den effizienten Einsatz in Unter- satzbereiche von PHP weiter auszuwei- Portal
nehmen:Hierfür steht die Entwicklungsumge- ten. Als erstes Anwendungsbeispiel für die
bung „PHP 4 Enterprise Edition“, die derzeit Für den professionellen Einsatz von PHP4 Voice Edition gilt das in Zu-
PHP im Unternehmensumfeld bedarf es sammenarbeit mit IBM erstellte Südtiro-
von der Maguma AG, Bozen, programmiert nach Meinung des Beratungs- und ler Bürgernetz Voice Portal, das im Au-
wird. Marktforschungsinstituts TechMetrix ei- gust 2001 live geschaltet wurde: Die

Linux Enterprise Special PHP 95


LE_PHP (73-98) 23.08.2001 10:50 Uhr Seite 96

Solutions Voice Portal


Südtiroler können jetzt aktuelle Wetter- Partnerschaften mit spezialisierten einer typischen PHP-Anwendung konn-
und Verkehrsinformationen aus dem Technologiepartnern te dank des Maguma PHP4EE-Cache
Internet abrufen – und das ganz ohne Zu- Aufgrund von Partnerschaften mit renom- um 200 bis 400 Prozent gesteigert wer-
gang zum World Wide Web. Der Nutzer mierten, auf PHP-Technologien speziali- den.
hat einfach per Telefon oder Handy Zu- sierten Technologiepartnern wie Zend Es existiert eine Bibliothek für oft
griff auf die Informationen aus den Da- Technologies und NuSphere bietet die in PHP-basierten Unternehmensanwen-
tenbanken im Internet. Das Voice Portal Maguma AG eine fest integrierte, ready- dungen genutzte Funktionen wie Daten-
ist das erste Projekt, bei dem die Techno- to-run (betriebsbereite) Umgebung für bank-Anbindung, SQL-Unterstützung,
logieexpertise der Maguma AG mit der PHP-Anwendungen im Unternehmens- User-Management, Zugangskontrolle,
Sprachtechnologie von IBM Voice Sys- umfeld. Damit komplexe Web-Anwen- Session-Management sowie eine Temp-
tems zusammengeführt wurde: Maguma dungen schneller als bisher entwickelt wer- late-Maschine. Durch die Komponenten
PHP4 Enterprise Edition macht den IBM den können, stellt Maguma PHP4EE Architektur, die auf PHP PEAR (PHP
Voice Server fit für den Einsatz im Inter- Extension and Application Respository)
net. Dabei vereinfacht die Maguma-Soft- basiert, wird die Wiederverwendbarkeit
ware den Aufbau komplexer dynami- Komfort für die der Programm-Module sehr gut unter-
scher Websites und beschleunigt deren stützt.
Entwicklung um bis zu 50 Prozent. Die PHP-Entwicklung
Spracherkennung und Sprachsynthese Unternehmensportale der nächsten Ge-
wird hingegen komplett vom IBM WebS- neration
phere Voice Server übernommen. Für den spezielle Tools für den gesamten Imple- Neben diesen – für die Entwicklung von
Content zeichnet das Südtiroler Bürger- mentierungs- und Entwicklungszyklus be- Web-Anwendungen geschaffenen – Tools,
netz, für die Audioproduktion das Me- reit, den mit allen Features ausgestatteten bietet Maguma PHP4EE weitere Features,
dienunternehmen Orange5 verantwort- Editor Maguma PHP4EE Studio, der sich die von Unternehmensportalen der näch-
lich. In Zukunft soll das Voice Portal um ganz konkret an die Kundenbedürfnisse sten Generation benötigt werden: Hierzu
zusätzliche Inhalte aus dem Südtiroler anpassen lässt. Diese Software bringt den gehört das User-Management, die Portal-
Bürgenetz – wie z.B. Auskunftsdienste aus anderen Programmierumgebungen Architektur, Schnittstellen zu Applika-
oder Zugänge zu behördlichen Daten- bekannten Komfort in die PHP-Entwick- tionsservern sowie Plattform-unabhängi-
banken – erweitert werden. lung: auf der Basis eines grafischen Klas- ge Ausgabekanäle.
sen- und Variablen-Browsers, einer Die Komponentenarchitektur der
Das Produkt unter der Lupe Code-Ergänzung und Funktionsüber- PHP4 Enterprise Edition ermöglicht es
Maguma PHP4EE bringt PHP in die sicht, befehlssensitiver PHP-Hilfe und ei- Maguma, die Produktsuite auf die
Unternehmen: Die Entwicklungsumge- ner Syntaxanzeige. Studio bietet zudem Bedürfnisse spezifischer Anwendungs-
bung mit Funktionen für komplexe eine Schnittstelle zum Entwicklungsmo- felder zuzuschneiden. So ist beispiels-
Unternehmensanwendungen erlaubt eine dul von Maguma PHP4EE sowie modern- weise die PHP4 Voice Edition vorgese-
schnelle Entwicklung mittlerer und gro- ste Projekt-Management-Funktionalitä- hen, welche die Entwicklung von
ßer komplexer Applikationen auf der Ba- ten, eine Versionskontrolle für den Voice-Anwendungen vereinfachen soll.
sis eines Integrated Development Envi- Quellcode sowie einen integrierten Debug- Ebenfalls geplant ist die PHP4 Integra-
ronments (IDE). Maguma PHP4EE setzt ger und Profiler für PHP-Anwendungen. tion Edition zur Erstellung von Unter-
sich aus vier Modulen zusammen: einer in- nehmensportalen, die auf IBM Web
tegrierten Entwicklungsumgebung (IDE) Die Deployment-Plattform für die Sphere basieren.
für schnelle Anwendungsentwicklung sichere Übertragung von Anwendungen Für die PHP-Produktlinie verant-
(RAD), einer Runtime Library und einer Eine Deployment-Plattform für die si- wortlich zeichnet der Geschäftsbereich
Laufzeitumgebung zur Publikation und chere Übertragung von Anwendungen Maguma Developer Solutions. Das Team
Überwachung der Applikationen auf dem auf den Maguma PHP4EE-Server sowie aus international bekannten PHP-Exper-
Server. Die Komponenten werden in einer deren Überwachung auf dem Server. Sie ten hat es sich zum Ziel gesetzt, den An-
speziellen „Arbeitsanwendung“ zusam- umfasst eine webbasierte Management- sprüchen professioneller PHP-Entwick-
mengefügt, wobei die RAD-Features der Schnittstelle für die PHP-Umgebung, ein ler voll und ganz zu entsprechen.
IDE zum Einsatz kommen. Anschließend Kontrollsystem für Versionen und eine
wird diese Anwendung in der Run Datenbank. Die Datenbankschnittstelle
time-Umgebung publiziert. PHP4EE
unterstützt den Web-Entwickler wäh-
basiert auf phpMyAdmin, dem bekann-
testen Management-Tool für MySQL,
Links
rend des gesamten Entwicklungszyklus das ursprünglich von Tobias Ratschiller [Link]/
mit Funktionen, welche die Entwicklung geschrieben wurde. Maguma PHP4EE [Link]/index_d.htm
und Bereitstellung von Unternehmensan- wurde im Hinblick auf Geschwindigkeit
wendungen erleichtern. und Sicherheit optimiert – die Leistung

96 Linux Enterprise Special PHP


LE_PHP (73-98) 23.08.2001 14:15 Uhr Seite 97

Zahlungsmodul Solutions
wurde, färben wir die Beschriftung des ent-

Zahlungsmodul von Jens Gräfe


sprechenden Feldes rot. Diese if-Bedin-
gung wenden wir nun auf alle anderen For-
mularfelder an. Ausnahme hierbei ist die
Postleitzahl, da diese nur Zahlen von 0-9
enthalten sollte. Außerdem ist es wichtig,
die Feldlänge im Formular auf eine ver-
nünftige Zeichenlänge zu begrenzen.
Benutzerdaten aus Formularen validieren Das Formularfeld eMail Adresse bietet
uns die Möglichkeit einer noch genaueren
und speichern Prüfung. Wir wissen, dass eine gültige
eMail-Adresse mindestens folgende Merk-
Im folgenden möchten wir ein kleines Projekt vorstellen, welches mit geringfügigen Modifikatio- male besitzen muss:
nen zur Formularauswertung auf der eigenen WebSite genutzt werden kann.
•mindestens 1 Zeichen vor dem @ (User-
name)
Ziel des Projektes ist eine genaue Überprü- mular so lange selbst aufruft, bis wir end- •das Trennungszeichen @
fung der Usereingaben, sowie die Abspei- gültig mit den gemachten Angaben zufrie- •einen Domainnamen mit der Mindest-
cherung derselben in einer Datenbank. An- den sind. Erst danach verwenden wir die länge von 2 Zeichen
schließend soll der User per eMail darüber Eingaben zum Zwecke der Speicherung •den Punkt „.“ als Trennungszeichen zwi-
informiert werden. Einsatzbereiche dieses weiter. schen Domainname und Domain
Modules wären zum Beispiel kleinere
Shopprojekte oder eine einfache Kunden- Die Umsetzung Die Bildung des regulären Ausdruckes
datenbank. Dieses Projekt bietet keines- Die Eingabefelder Name, Vorname, ect., wird hier um einiges schwieriger:
falls eine komplette Shoplösung, sondern welche uns einen Einsatz von regulären
soll Ansätze zur Fortführung und Weiter- Ausdrücken ermöglichen, prüfen wir so eregi(^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-
entwicklung auf der eigenen WebSite ge- weit als möglich. ]+)*$, $email)

ben.
Ausgangspunkt ist ein HTML-Formu- if ((strlen($name) > 0) and
Wer mit Perl programmiert, wird sich
lar. In dieses Formular integrieren wir un- (eregi(„^[-a-z]+(\.[-a-z]+)*$“,$name))){ direkt zurechtfinden, da die Verwendung
sere Prüfroutinen. Die Eingaben des Users $ok = 1; von regulären Ausdrücken in PHP an den
werden so lange an dieses Formular über- } POSIX-Standard angelehnt ist. Eine ge-
geben, bis unsere definierten Prüfbedin- else {$cname = „<font color=red>“; nauere Hilfe bietet das PHP Manual im
gungen erfüllt sind. Für die Steuerung un- $ok = 0;} Kapitel LVI (Pattern Syntax). Der Downlo-
seres Formulares deklarieren wir zwei ad des PHP-Manuals ist unter www. php-
globale Variablen. Die Variable $check In dieser Bedingung prüfen wir das [Link]/manual/[Link] möglich.
verhindert, dass der User beim ersten Auf- Feld Name auf eine Zeichenlänge größer 0. Außerdem sind im Internet eine Vielzahl
ruf der Seite mit Fehlermeldungen über- Weiterhin gestatten wir nur die Eingabe an praktischen Beispielen und Hilfen ver-
häuft wird. Die Variable $ok ist unsere von Buchstaben, Bindestrich und Leerzei- fügbar (siehe Links am Ende des Artikels).
„Statusvariable“. Sie wird am Anfang der chen. Wenn alle Bedingungen erfüllt sind, Reguläre Ausdrücke sind ein mächtiges
Prüfroutine auf „1“ gesetzt und erhält den wird die Variable $ok auf 1 gesetzt. Anson- Werkzeug, dessen Grundlagen jeder Ent-
Wert „0“, wenn Eingaben nicht ordnungs- sten wird im Formular die Beschriftung des wickler in Ansätzen kenne sollte. Deshalb
gemäß ausgefüllt sind. Erst wenn die Vari- Formularfeldes rot eingefärbt und der Va- auch an dieser Stelle einige kurzgefasste
able am Ende der Prüfroutine noch auf „1“ riablen $ok der Wert 0 zugewiesen. Anstel- Hilfestellungen. Da reguläre Ausdrücke
steht, werden die übergebenen Daten le des rot eingefärbten Textes können auch ein sehr komplexes Thema sind, erheben
weiterverarbeitet. Die Verwendung von Grafiken oder andere Fehlerausgaben be- wir keinen Anspruch auf Vollständigkeit,
PHP ermöglicht es uns, dass sich das For- nutzt werden. da dies den Rahmen unseres Artikels
sprengen würde.
Reguläre Ausdrücke Folgende PHP-Funktionen unterstüt-
Quellcode Die Verwendung der Funktion eregi er-
spart uns die Unterscheidung zwischen
zen die Verwendung regulärer Ausdrücke:

Der Quellcode zum Groß-und Kleinschreibung. Im Formular- •preg_match (sucht einen regulären Aus-
Artikel befindet sich auf feld Name sind alle Buchstaben sowie der druck)
der beiliegenden CD. Bindestrich und der Punkt erlaubt. Sobald •preg_replace (sucht und ersetzt einen re-
ein anderes oder kein Zeichen gefunden gulären Ausdruck)

Linux Enterprise Special PHP 97


LE_PHP (73-98) 23.08.2001 14:15 Uhr Seite 98

Solutions Zahlungsmodul
•preg_split (zerteilt einen String anhand ei- ren() (Siehe Listing auf der CD). Diese bank über Port 3306 anzusprechen und per
nes regulären Ausdrucks) Funktion erweitert unser Zahlungsmodul SELECT-Abfrage auszulesen. Nachdem
•preg_grep (liefert ein Array zurück auf um die Möglichkeit der Prüfung von Kre- wir nun eine gültige Verbindungs-ID erhal-
das der reguläre Ausdruck zutrifft) ditkartennummern. Weiterhin prüfen wir ten haben, speichern wir die Daten. Der
•ereg (sucht Übereinstimmung) mit der Funktion check_datum, ob das Einfachheit halber nutzen wir die Autoin-
•ereg_replace (ersetzt einen regulären Aus- Gültigkeitsdatum der Karte im zulässigen crement- Funktion der Datenbank. Der ge-
druck) Bereich liegt. Für kleinere Unternehmen nerierte Wert wird automatisch als Vor-
•split (zerlegt eine Zeichenkette anhand ei- bietet sich hier eine, wenn auch nicht hun- gangsnummer verwendet. Die Funktion
nes regulären Ausdrucks in ein Array) dertprozentig sichere Möglichkeit, Fakes mysql_query liefert im Erfolgsfall TRUE
mit Kreditkarten zu verhindern. Die Funk- zurück. Somit erhalten wir die gewünschte
Alle Funktionen, die mit preg anfangen, tionen erwarten als Parameter die Kredit- Vollzugsmeldung. Nun kommen wir zum
lehnen sich an die Perl-kompatiblen regulä- kartennummer, das Kreditkarteninstitut letzten Schritt, der Erstellung der Bestäti-
ren Ausdrücke an. Zu beachten ist, dass und das Gültigkeitsdatum der Kreditkarte. gungsmail.
diese mit Slashes ( /regulärer Ausdruck/ ) Anhand des Kreditinstituts validieren wir
begrenzt werden müssen. Nun einige Bei- die ersten Stellen der Kreditkartennummer, Bestätigungsmail generieren
spiele zur Verwendung regulärer Aus- um das Berechnungsverfahren ordnungs- Hier greifen wir auf die von PHP zur Verfü-
drücke. Mit dem Zeichen „^“ kennzeich- gemäß anwenden zu können. Die Prüfung gung gestellte Mail-Funktion zurück:
net man einen Wortbeginn. Das Wortende der Kreditkartennummer nutzt das bei
lässt sich durch das Zeichen „$“ festlegen. Kreditkarten verwendete Modulo 10 Ver- Mail($empfänger, $betreff, $nachricht,
preg_match /^[a-z]/ würde wahr zurücklie- fahren. Das heißt, dass die − nach einer be- „From: webmaster@$SERVER_NAME\nReply-To:
fern, wenn der Wert mit einem Kleinbuch- stimmten Berechnungsformel − ermittelte webmaster@$SERVER_NAME“);
staben beginnen würde. Falls eine Zahl Quersumme ohne Rest durch 10 teilbar
oder ein Sonderzeichen am Anfang stehen, sein muss. Das Datum lässt sich durch ei- Beim Aufruf der Mail-Funktion müs-
wäre die Bedingung nicht erfüllt. nen definierten Bereich von maximal 24 sen drei Parameter (Empfänger, Betreff,
Preg_Match würde demzufolge unwahr Monaten prüfen. Die Funktion bedient Nachricht) übergeben werden. Der vierte
zurückgeben. Mittels eines Bindestriches sich des aktuellen Systemdatums (mittels Parameter ist optional, aber sehr nützlich.
können Wertebereiche festgelegt werden. strftime) und prüft dieses gegen das angege- Hier können zusätzliche Angaben wie
Ein Ausdruck, der zum Beispiel auf die Ein- bene Gültigkeitsdatum. Ist das angegebene Standardantwortadresse oder Kopieem-
gabe von hexadezimalen Zahlen prüft, Datum kleiner als das aktuelle Datum oder fänger deklariert werden.
würde wie folgt aussehen: [a-f0-9]. Es dürf- größer als das aktuelle Datum plus 24 Mo- Der Nutzer erhält eine Bestätigung des
ten nur die Zahlen von 0 bis 9 und die Zei- nate, liefert die Funktion falsch zurück. Vorgangs, in der seine persönlichen Daten
chen a bis f auftreten, damit die Prüfung Sollte alles zu unserer Zufriedenheit ausge- enthalten sind. Die Zahlungsweise lassen
wahr zurückgibt. füllt sein, steht die Variable $ok auf 1, wie es wir außer acht, da eMails im Klartext über
Der folgende Ausdruck prüft auf Zif- am Anfang der Prüfroutine eingestellt wur- das Internet übertragen werden und somit
fern und Ziffernfolgen: ^[1-9][0-9]*$. Das de, und es wird eine Quittungsseite ausge- keinen Schutz bieten. Falls das Zahlungs-
erste Zeichen darf nicht 0 sein. Hier kom- geben, auf der der Nutzer alle seine Einga- modul in einem Warenshop Verwendung
men die oben genannten Wortanfangs- und ben noch einmal prüfen kann. Bestätigt der findet, könnte man ebenfalls die bestellten
-endezeichen zur Verwendung. Nachfol- User seine Eingaben, werden die übergebe- Positionen in der Mail bestätigen.
gende Symbole stehen für genau fünf belie- nen Werte in die Datenbank geschrieben.
bige Zeichen: ^.{5}$. Ein weiteres Beispiel Sollte die Datenbankabfrage erfolgreich Auswertung der Bestellungen
wäre ab*. Hier passen Zeichenketten, die ausgeführt werden, informieren wir den Der Betreiber des Systems kann nun auf die
ein a und eine beliebige Anzahl von b ent- Nutzer auf einer Antwortseite. Für die Da- in der Datenbank abgelegten Werte mit ei-
halten, also a, ab, abb, abbbbbbbb usw. tenbankoperation stellen wir mittels nem Administrationstool zugreifen. Über
mysql_connect eine gültige Verbindung zur dieses kann, je nach Bedarf, ein Arbeitsab-
...zurück zu unserem Formular Datenbank her. Auch hier eine Warnung: lauf erstellt werden, mit dem eine komfor-
Unser Formular ruft sich selbst auf, solange Sollte, aus welchen Gründen auch immer, table Bearbeitung der eingegangenen Be-
die Variable $ok am Ende der Prüfung den der Apache Webserver oder genauer gesagt stellung möglich wird. Hier sollte auf eine
Wert 1 besitzt. Wir bieten dem Nutzer die das PHP-Modul desselben ausfallen, wird geschützte Verbindung (Stichwort SSL)
Möglichkeit, aus verschiedenen Zahlungs- der PHP Quellcode ungeparst ausgegeben. zum Webserver geachtet werden.
wegen (Bankeinzug, Kreditkarte, Rech- Es empfiehlt sich daher, die Benutzerdaten Der Autor ist Geschäftsführer der sub-
nung) auszuwählen. Je nach Wahl des Nut- für den Datenbankconnect außerhalb des sist GmbH, Dresden, einem Anbieter von
zers erwarten wir dementsprechend für den Webserver erreichbaren Pfades eBusiness- und Intranetlösungen, mit
Eingaben in den relevanten Feldern. Unser (standardmäßig alles unter .../htdocs) ab- Schwerpunkt Datenbankentwicklung.
Script enthält als Besonderheit die einge- zulegen. Ansonsten ist es ein Leichtes, mit Jens Gräfe ist unter jensg@[Link] er-
bundene Funktion kreditkarten_validie- den Benutzerinformationen die Daten- reichbar.

98 Linux Enterprise Special PHP

Das könnte Ihnen auch gefallen