„PHP“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[ungesichtete Version][ungesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Revert auf Version von Benutzer:Norro (27. Nov. 2007, 19:51). Grund: keine Verbesserung des Artikels
Zeile 116: Zeile 116:
== Mängel ==
== Mängel ==


PHP ist zeitweise etwas ungesteuert gewachsen. So funktioniert der Zugriff auf eine Datenbank mittels der [[MySQL]]-Funktionen anders als über [[ODBC]]; noch deutlicher wird dies beispielsweise bei Inkonsistenzen der Funktionen zur [[String]]-Verarbeitung. Viele Funktionen existieren unter mehreren Namen und zusammenhängende Funktionen wurden oft sehr unterschiedlich benannt. Zwar unterstützt PHP bereits seit Version 3 grundlegend [[Objektorientierte Programmierung|objektorientiertes]] Programmieren (in den Versionen 4 und 5 verbessert und erweitert), aber die gesamte Standardbibliothek von PHP 4 und der Großteil derer von PHP 5 sind noch prozedural angelegt. Auch bei objektorientierten Sprachen übliche Features wie [[Kapselung]] der Daten (z. B. private Variablen), [[Destruktor]]en oder Fehlerbehandlung per [[Exception]]s sind erst in PHP 5 hinzugekommen.
'''Höhö alles weg^^'''
Die Funktionen <code>register_shutdown_function()</code>, <code>set_error_handler()</code> und <code>error_reporting()</code> in PHP 4 können diese wichtigen Sprachkonstrukte nicht ersetzen.

Die aktuelle Version PHP 5 mit der neuen [[Zend Engine]] 2 ist seit dem 13. Juli 2004 verfügbar. Um die Missstände aus der vorherigen Version zu beheben, wurden Änderungen am Verhalten von PHP selbst nötig. So sind Objekt-Variablen in PHP 5 wie bei den meisten Sprachen nur noch eine [[Referenz (Programmierung)|Referenz]] auf das Objekt und nicht wie in PHP 3 und 4 das Objekt selbst. In PHP 5 wurden außerdem wichtige [[Objektorientierte Programmierung|OOP]]-Features wie z.&nbsp;B. [[Destruktor]]en und die Festlegung der Sichtbarkeit einer (Klassen-)Eigenschaft (public, private oder protected) ergänzt. Einige wichtige Teile der Standardbibliothek wie etwa die [[Document Object Model|DOM]]-[[Programmierschnittstelle|API]] sind seit PHP 5 objektorientiert. In PHP 5.1 wurde mit [[PHP Data Objects]] (PDO) eine neue objektorientierte Erweiterung aufgenommen, die einen einheitlichen Zugriff auf die verschiedenen SQL-Datenbanken ermöglicht.

Bemängelt wird aber noch immer der auch in der Version 5 unzureichende Support von [[Unicode]] (vgl. [[Byte Order Mark]]), da der Standard[[zeichensatz]] in PHP [[ISO 8859-1]] ist. Bisher bietet PHP nur einige Funktionen, bei denen ein Zeichensatz (darunter auch [[UTF-8]]) angegeben werden kann, sowie Funktionen zur Konvertierung von und nach UTF-8, aber noch keine durchgehende Unterstützung. Für viele Probleme sorgen auch die „magic quotes“- und „autoglobals“-Mechanismen, die je nach Serverkonfiguration aktiviert oder deaktiviert sind. Ursprünglich waren sie als Bequemlichkeits-Feature und zusätzliches „Sicherheitsnetz“ für Anfänger gedacht, aber ein portables Skript muss mit allen möglichen Konfigurationen umgehen können, wodurch sich der Effekt ins Gegenteil verkehrt. Oft verlangen Skripte deswegen eine bestimmte Konfiguration. Wenn ein anderes Skript auf dem gleichen Server laufen soll und eine andere Konfiguration verlangt, so gibt es insbesondere bei kostenlosen [[Webhosting|Webhostern]] Probleme, da diese eine Konfigurationsänderung für ein ''einzelnes'' Skript via <code>ini_set()</code> nicht erlauben. Siehe dazu auch die englischsprachige PHP-Dokumentation<ref>PHP Docs: ''[http://www.php.net/security.magicquotes Magic Quotes]'' (englisch)</ref>.

Um mit diesem Missstand aufzuräumen, kündigte [[Andi Gutmans]] (zusammen mit Zeev Suraski einer der Entwickler der Zend Engine) umfassende [[Unicode]]-Unterstützung auf Basis von [[ICU (Typographie)|ICU]] für die nächste große Version (6.0) an. In der Präsentation von Andrei Zmievski<ref>PHP-Conference 2005: ''[http://www.gravitonic.com/downloads/talks/intlphpcon2005/php_unicode.pdf Präsentation von Andrei Zmievski]'' (PDF)</ref> von der PHP-Conference 2005 wird die Implementierung anhand vieler Beispiele erklärt. Unter anderem werden Konstrukte wie <code>strlen($str)</code> oder <code>$str{1}</code> problemlos mit [[Unicode]] funktionieren. Eine Diskussion über mögliche Änderungen in PHP 6 findet sich auf der Mailingliste php.internals<ref>PHP-Mailingliste: ''[http://news.php.net/php.internals/start/17883 Diskussion über mögliche Änderungen in PHP 6]'' (englisch)</ref>.

Threading fehlt in PHP völlig und einige wenige PHP-Module sind nicht threadsicher. Ebenso fehlen Namensräume, was dementsprechend lange Funktionsnamen notwendig macht. Derzeit sind über 5000 Funktionen in einem einzigen Namensraum vereint (Stand April 2007). Standardmäßig wird eine Datei mit PHP-Code bei der ersten Ausführung auch nicht in Bytecode übersetzt und abgespeichert, was bei jedem Auslesen dieser Datei ein komplettes [[Parser|Parsen]] notwendig macht.

Da Arrays in PHP das Array-Konzept mit dem Dictionary-Konzept (Map in [[Java (Programmiersprache)|Java]]) vermengen, muss hier besondere Obacht gegeben werden. Weiterhin sind gerade Stringvergleiche in PHP eine beliebte Fehlerquelle, da häufig nicht der Operator für typsichere Vergleiche verwendet wird, womit vor allem bei PHP-Anfängern Probleme auftreten, wenn numerische Werte mit Strings verglichen werden sollen.

In PHP ist es nicht möglich, eine förmliche Deklaration von Variablen zu erzwingen. Variablen werden vielmehr automatisch angelegt, wenn sie erstmals verwendet werden. Das ist zwar bequem, hat aber zur Folge, dass insbesondere Tippfehler bei Variablennamen zu nur schwer auffindbaren Programmfehlern führen können. Dieser Mangel kann während der Entwicklung durch die Aktivierung der Warnung bei der Benutzung nicht initialisierter Variablen (<code>E_NOTICE</code>) abgeschwächt werden, da der Programmierer so auf das Problem hingewiesen wird.

=== Variablenmanipulation ===

Bei den [[Globale Variable|Globalen Variablen]] (→[[Variable (Programmierung)#Gültigkeitsbereich von Variablen (Scope)|Geltungsbereich von Variablen]]) existiert unter bestimmten Konfigurationen (bei bestimmter programmierweise, siehe folgendes) eine erhebliche Sicherheitslücke, die durch die Variablenvorbelegung von PHP zustande kommt. Über die [[URL]] einer Seite können Variablen geändert werden, wenn diese nicht ordnungsgemäß vor der ersten Benutzung initialisiert werden.
<nowiki>http://example.com/beispiel.php?variable1=test&variable2=irgend_ein_wert</nowiki>
Durch diesen Aufruf erhält ''variable1'' den Wert ‚test‘ und ''variable2'' entsprechend ‚irgend_ein_wert‘. Vorhandene Variablen, die im PHP-Skript verwendet werden, könnten überschrieben werden. Um diese Art von Manipulation zu verhindern, sollte die automatische Variablenvorbelegung mit <code>register_globals=off</code> in der PHP-Konfiguration abgeschaltet werden (seit PHP 4.2.0 standardmäßig). Auf die per URL übergebenen Variablen kann dann seit PHP 4.1.0 mit den „Superglobals“ zugegriffen werden.
<code>$_GET['variable1'] ''oder'' $_POST['variable1'] ''(je nach Übertragungsart)''
$HTTP_GET_VARS['variable1'] ''oder'' $HTTP_POST_VARS['variable1'] ''(bei PHP-Versionen vor 4.1.0)''</code>
Zu den [http://www.php.net/reserved.variables Superglobals] zählen eine Reihe „assoziativer Arrays“ die im ganzen PHP-Code zur Verfügung stehen und die diverse Informationen speichern (Informationen vom Nutzer, dem Server und der Serverumgebung). Die Inhalte der Arrays <code>$_GET</code>, <code>$_POST</code> und <code>$_COOKIE</code> sind seit PHP 4.1.0 zusätzlich in <code>$_REQUEST</code> zusammengefasst (http://www.php.net/language.variables.predefined).

''Anmerkung: Seit der Version 5.0 können die $HTTP_*_VARS deaktiviert werden (<code>register_long_arrays=Off</code>)

Allerdings kann man im gewissen Rahmen eine Manipulation verhindern, falls z.&nbsp;B. bei einem Forum ausschließlich ein Integerwert benötigt wird. In diesem Falle kann man überprüfen, ob der übergebene Wert ein Integer ist, und ggf. abbrechen. Eine andere Möglichkeit wäre es, den Integerwert am Anfang einen Standardwert zuzuweisen. Somit wird die manipulierte Variable überschrieben und man schließt somit die Sicherheitslücke.


== Lizenz und Bezug ==
== Lizenz und Bezug ==

Version vom 29. November 2007, 14:30 Uhr

PHP
Datei:PHP Logo.svg
Serverseitig interpretierte Skriptsprache
Basisdaten
Erscheinungsjahr: 1995
Designer: Rasmus Lerdorf[1]
Entwickler: The PHP Group
Aktuelle Version: 5.2.5 (8. November 2007)
4.4.7  (2. Mai 2007)
Typisierung: schwach, dynamisch
Beeinflusst von: C++, Perl[2], C[2], Java[2], Tcl[3], HTML, JavaScript
Betriebssystem: plattformunabhängig
Lizenz: PHP License
www.php.net

PHP (rekursives Backronym für „PHP: Hypertext Preprocessor“, ursprünglich „Personal Home Page Tools“) ist eine Skriptsprache mit einer an C bzw. C++ angelehnten Syntax, die hauptsächlich zur Erstellung von dynamischen Webseiten oder Webanwendungen verwendet wird[4]. PHP ist Open-Source-Software.

PHP zeichnet sich besonders durch die leichte Erlernbarkeit, die breite Datenbankunterstützung und Internet-Protokolleinbindung sowie die Verfügbarkeit zahlreicher, zusätzlicher Funktionsbibliotheken aus. Es existieren beispielsweise Programmbibliotheken, um Bilder und Grafiken zur Einbindung in Webseiten dynamisch zu generieren.

Geschichte

PHP wurde 1995 von Rasmus Lerdorf entwickelt. Der Begriff stand damals noch für Personal Home Page Tools und war ursprünglich eine Sammlung von Perl-Skripten, die Rasmus Lerdorf zur Protokollierung der Zugriffe auf seinen Online-Lebenslauf geschrieben hatte. Bald schuf Lerdorf jedoch eine größere Umsetzung in C. In dieser Programmiersprache wird PHP heute noch entwickelt. Das schließlich veröffentlichte PHP/FI (FI stand für Form Interpreter) war Perl sehr ähnlich, wenn auch viel eingeschränkter, einfacher, und ziemlich inkonsistent.

PHP 3 wurde von Andi Gutmans und Zeev Suraski neu geschrieben, da das inzwischen erschienene PHP/FI 2 ihrer Meinung nach für eCommerce zu schwach war. Auch die Bedeutung der Abkürzung „PHP“ wurde hierbei geändert. Lerdorf kooperierte mit Gutmans und Suraski, und so wurde die Entwicklung von PHP/FI eingestellt. Obwohl PHP 3 für den professionellen Einsatz noch keine allzu große Funktionsvielfalt bot bzw. einige Schwächen aufwies, brachte es die Verbreitung von PHP bedeutend voran. Die von Gutmans und Suraski gegründete Firma Zend Technologies Ltd. entwickelte in der Folge die Zend Engine 1, die den Kern der PHP-4-Standardimplementierung bildet. Der Name „Zend“ ist aus den beiden Vornamen der Entwickler Zeev und Andi gebildet. Mit PHP 4 wurden die Ausführungsgeschwindigkeit komplexer Applikationen und die Sicherheit bei Verwendung globaler Variablen verbessert. Eingeführt wurden die Unterstützung für viele weitere Webserver, das Sessionmanagement, die Ausgabepufferung sowie viele neue Sprachkonstrukte.

Da das World Wide Web Ende der 1990er-Jahre stark wuchs, bestand großer Bedarf an Skriptsprachen, mit denen sich dynamische Webseiten realisieren lassen. PHP wurde für die Webentwicklung mit der Zeit populärer als der vorherige De-facto-Standard Perl, weil es durch seine Spezialisierung als einfacher erlernbar gilt.

Meilensteine

  • PHP 1.0 erschienen am 8. Juni 1995
  • PHP 2.0.0 bzw. PHP/FI, erschienen am 12. November 1997
  • PHP 3.0.0, erschienen am 6. Juni 1998
  • PHP 4.0.0, erschienen am 22. Mai 2000
  • PHP 5.0.0, erschienen am 13. Juli 2004
    • Erstmals ist durch viele hinzugefügte Sprachkonstrukte ernsthaftes objektorientiertes Programmieren möglich.
    • Exceptions hinzugefügt
    • Reflections API
    • MySQLi (MySQL improved, objektorientiert und auf aktuelle MySQL-Versionen zugeschnitten)
    • SQLite (vollständig client-basiertes, dem SQL Standard zu 95 % entsprechendes Datenbanksystem)
    • SimpleXML (einfacher XML-Parser, Änderungen von Einträgen sind möglich, aber es können keine neuen hinzugefügt oder gelöscht werden)
    • DOM-Unterstützung (objektorientiert)
  • PHP 5.1.0, erschienen am 24. November 2005
    • Datenbankabstraktionsschicht hinzugefügt (PDO)
  • PHP 5.2.0, erschienen am 2. November 2006
    • schnellere und effizientere Speicherverwaltung
    • Filter-Erweiterung hinzugefügt (Filtern und Verifizieren von Benutzereingaben)
    • JSON hinzugefügt (Serialisierung von PHP-Variablen, nützlich im Zusammenspiel mit Ajax)
    • ZIP (Auslesen und Erstellen von ZIP-Archiven) hinzugefügt
    • objektorientierte Datum-Erweiterung (DateTime und DateTimeZone) hinzugefügt

Ausblick

Zurzeit wird die Version 6.0 entwickelt. Bisher bekannte Änderungen sind zum einen die Entfernung von „Altlasten“ wie Register Globals, Magic Quotes und dem Safe Mode zum anderen die Unterstützung von Unicode. Neuerungen wie Namensräume, "late static binding"[5] und ein neuer, nativer MySQL Treiber waren eigentlich für die Version 6 geplant, sollen nun aber schon in PHP 5.3 eingeführt werden.

Am 13. Juli 2007 hat das Entwickler-Team angekündigt, die Unterstützung für PHP4 bis zum August 2008 einzustellen. Da es zum Zeitpunkt dieser Ankündigung im Feld noch zahlreiche PHP4-Installationen gibt, sind verantwortungsvolle Entwickler und Administratoren zur baldigen Migration ihrer PHP-Anwendungen gezwungen.

Allgemein

Darstellung der Funktionsweise von PHP

PHP ist ein System, das PHP-Code server-seitig verarbeitet. Das bedeutet, dass der Quelltext – im Gegensatz zu JavaScript, das in der Regel Client-seitig interpretiert wird – nicht an den Browser übermittelt wird, sondern an einen Interpreter auf dem Webserver. Erst dessen Ausgabe wird an den Browser geschickt. In den meisten Fällen ist dies ein HTML-Dokument, wobei es mit PHP aber auch möglich ist, andere Dateitypen, wie z. B. Bilder oder PDF-Dateien, zu generieren.

Mit PHP lassen sich wie mit Perl auch Skripte schreiben, die nichts mit dem WWW zu tun haben. Die GTK-Erweiterung stellt sogar eine Programmierschnittstelle für eine grafische Oberfläche zur Verfügung, für die weder ein Webserver noch ein Browser benötigt werden. Verglichen mit „Allzweck“-Skriptsprachen wie Python, Ruby und Perl waren in einer ersten Version die Schnittstellen für die grafische Oberfläche und zu anderen Betriebssystemfunktionen aber spärlich und wurden kaum verwendet. Die aktuell entwickelte PHP-GTK-Version 2 strebt hingegen eine Abdeckung der GTK-API von 95 % an[6], wodurch sich PHP zu einer vielversprechenden Skriptsprache zur Entwicklung plattformunabhängiger Applikationen fortentwickeln könnte. Gegenwärtig spielt PHP seine Stärken vor allem beim Einsatz auf Webservern aus.

Um eine PHP-Datei im Rahmen einer Webanwendung ausführen zu können, benötigt man ein System, das mit den in der Datei enthaltenen Anweisungen umgehen kann. Aus diesem Grund wird durch eine Schnittstelle (beispielsweise ISAPI oder CGI) der Interpreter von einem Server-Daemon bzw. Server-Dienst (z. B. Apache oder IIS) ausgeführt. Die Kombination von Linux/Windows als Betriebssystem, Apache als Webserver, MySQL-Server als Datenbank und PHP wird LAMP bzw. WAMP genannt. Fertige LAMP- und WAMP-Pakete, die das einzelne Laden und Konfigurieren von Paketen aus dem WWW unnötig machen, werden u. a. im Projekt XAMPP entwickelt, wobei es inzwischen Versionen für Linux, Solaris, Windows und Mac OS X gibt.

Die Vorteile der server-seitigen Ausführung sind, dass beim Client (Browser) keine speziellen Fähigkeiten erforderlich sind oder Inkompatibilitäten auftreten können, wie es beispielsweise bei JavaScript und den verschiedenen Browsern der Fall ist. Außerdem bleibt der PHP-Quelltext der Seite auf dem Server, und nur die generierten Daten sind für den Besucher einsehbar. Gleiches gilt für andere Ressourcen wie z. B. Datenbanken, die daher auch keine direkte Verbindung zum Client benötigen.

Nachteilig ist, dass jede Aktion des Benutzers erst bei einem erneuten Aufruf der Seite erfasst werden kann. Da PHP normalerweise in einer Webserver-Umgebung läuft, unterliegt es auch dem zustandslosen HTTP. Außerdem wird jede PHP-Seite vom Server interpretiert, wodurch dessen Belastung steigt. Diese Vor- und Nachteile sind nicht PHP-spezifisch, sondern treten bei grundsätzlich jeder Web-Anwendung auf. Zusätzlich liest, prüft und übersetzt der Interpreter den Quelltext bei jedem Aufruf erneut. Dies mindert die Reaktionsgeschwindigkeit des Servers und erhöht nochmals die Last. Um dem entgegenzuwirken, stehen verschiedene Byte-Code-Caches zur Verfügung, diese speichern eine zur Ausführung vorbereitete Version des Programmes zwischen und beschleunigt somit den Zugriff auf diese Datei beim nächsten Aufruf. (siehe auch Abschnitt Performance)

Code-Beispiel

Einfaches PHP-Skript (gibt „Hallo Welt!“ aus):

<?php
  echo "Hallo Welt!";
?>

Anmerkung: Das „echo“ kann auch durch „print“ ersetzt werden, und es können auch einfache Anführungszeichen (') statt doppelten (") verwendet werden. Die Unterscheidung der einfachen von den doppelten Anführungszeichen entscheidet darüber, ob in der Zeichenkette auftauchende Variablennamen unverändert zu übernehmen oder durch den entsprechenden Variableninhalt zu ersetzen sind. Außerdem wird die Bearbeitung von Escape-Sequenzen hierdurch gesteuert

Das Skript in HTML integriert (gibt ebenfalls „Hallo Welt!“ auf der Webseite aus):

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
 <html>
   <head>
    <title>Hallo-Welt-Beispiel</title>
   </head>
   <body>
     <?php 
       echo "Hallo Welt!";
     ?>
   </body>
 </html>

Mängel

PHP ist zeitweise etwas ungesteuert gewachsen. So funktioniert der Zugriff auf eine Datenbank mittels der MySQL-Funktionen anders als über ODBC; noch deutlicher wird dies beispielsweise bei Inkonsistenzen der Funktionen zur String-Verarbeitung. Viele Funktionen existieren unter mehreren Namen und zusammenhängende Funktionen wurden oft sehr unterschiedlich benannt. Zwar unterstützt PHP bereits seit Version 3 grundlegend objektorientiertes Programmieren (in den Versionen 4 und 5 verbessert und erweitert), aber die gesamte Standardbibliothek von PHP 4 und der Großteil derer von PHP 5 sind noch prozedural angelegt. Auch bei objektorientierten Sprachen übliche Features wie Kapselung der Daten (z. B. private Variablen), Destruktoren oder Fehlerbehandlung per Exceptions sind erst in PHP 5 hinzugekommen. Die Funktionen register_shutdown_function(), set_error_handler() und error_reporting() in PHP 4 können diese wichtigen Sprachkonstrukte nicht ersetzen.

Die aktuelle Version PHP 5 mit der neuen Zend Engine 2 ist seit dem 13. Juli 2004 verfügbar. Um die Missstände aus der vorherigen Version zu beheben, wurden Änderungen am Verhalten von PHP selbst nötig. So sind Objekt-Variablen in PHP 5 wie bei den meisten Sprachen nur noch eine Referenz auf das Objekt und nicht wie in PHP 3 und 4 das Objekt selbst. In PHP 5 wurden außerdem wichtige OOP-Features wie z. B. Destruktoren und die Festlegung der Sichtbarkeit einer (Klassen-)Eigenschaft (public, private oder protected) ergänzt. Einige wichtige Teile der Standardbibliothek wie etwa die DOM-API sind seit PHP 5 objektorientiert. In PHP 5.1 wurde mit PHP Data Objects (PDO) eine neue objektorientierte Erweiterung aufgenommen, die einen einheitlichen Zugriff auf die verschiedenen SQL-Datenbanken ermöglicht.

Bemängelt wird aber noch immer der auch in der Version 5 unzureichende Support von Unicode (vgl. Byte Order Mark), da der Standardzeichensatz in PHP ISO 8859-1 ist. Bisher bietet PHP nur einige Funktionen, bei denen ein Zeichensatz (darunter auch UTF-8) angegeben werden kann, sowie Funktionen zur Konvertierung von und nach UTF-8, aber noch keine durchgehende Unterstützung. Für viele Probleme sorgen auch die „magic quotes“- und „autoglobals“-Mechanismen, die je nach Serverkonfiguration aktiviert oder deaktiviert sind. Ursprünglich waren sie als Bequemlichkeits-Feature und zusätzliches „Sicherheitsnetz“ für Anfänger gedacht, aber ein portables Skript muss mit allen möglichen Konfigurationen umgehen können, wodurch sich der Effekt ins Gegenteil verkehrt. Oft verlangen Skripte deswegen eine bestimmte Konfiguration. Wenn ein anderes Skript auf dem gleichen Server laufen soll und eine andere Konfiguration verlangt, so gibt es insbesondere bei kostenlosen Webhostern Probleme, da diese eine Konfigurationsänderung für ein einzelnes Skript via ini_set() nicht erlauben. Siehe dazu auch die englischsprachige PHP-Dokumentation[7].

Um mit diesem Missstand aufzuräumen, kündigte Andi Gutmans (zusammen mit Zeev Suraski einer der Entwickler der Zend Engine) umfassende Unicode-Unterstützung auf Basis von ICU für die nächste große Version (6.0) an. In der Präsentation von Andrei Zmievski[8] von der PHP-Conference 2005 wird die Implementierung anhand vieler Beispiele erklärt. Unter anderem werden Konstrukte wie strlen($str) oder $str{1} problemlos mit Unicode funktionieren. Eine Diskussion über mögliche Änderungen in PHP 6 findet sich auf der Mailingliste php.internals[9].

Threading fehlt in PHP völlig und einige wenige PHP-Module sind nicht threadsicher. Ebenso fehlen Namensräume, was dementsprechend lange Funktionsnamen notwendig macht. Derzeit sind über 5000 Funktionen in einem einzigen Namensraum vereint (Stand April 2007). Standardmäßig wird eine Datei mit PHP-Code bei der ersten Ausführung auch nicht in Bytecode übersetzt und abgespeichert, was bei jedem Auslesen dieser Datei ein komplettes Parsen notwendig macht.

Da Arrays in PHP das Array-Konzept mit dem Dictionary-Konzept (Map in Java) vermengen, muss hier besondere Obacht gegeben werden. Weiterhin sind gerade Stringvergleiche in PHP eine beliebte Fehlerquelle, da häufig nicht der Operator für typsichere Vergleiche verwendet wird, womit vor allem bei PHP-Anfängern Probleme auftreten, wenn numerische Werte mit Strings verglichen werden sollen.

In PHP ist es nicht möglich, eine förmliche Deklaration von Variablen zu erzwingen. Variablen werden vielmehr automatisch angelegt, wenn sie erstmals verwendet werden. Das ist zwar bequem, hat aber zur Folge, dass insbesondere Tippfehler bei Variablennamen zu nur schwer auffindbaren Programmfehlern führen können. Dieser Mangel kann während der Entwicklung durch die Aktivierung der Warnung bei der Benutzung nicht initialisierter Variablen (E_NOTICE) abgeschwächt werden, da der Programmierer so auf das Problem hingewiesen wird.

Variablenmanipulation

Bei den Globalen Variablen (→Geltungsbereich von Variablen) existiert unter bestimmten Konfigurationen (bei bestimmter programmierweise, siehe folgendes) eine erhebliche Sicherheitslücke, die durch die Variablenvorbelegung von PHP zustande kommt. Über die URL einer Seite können Variablen geändert werden, wenn diese nicht ordnungsgemäß vor der ersten Benutzung initialisiert werden.

http://example.com/beispiel.php?variable1=test&variable2=irgend_ein_wert

Durch diesen Aufruf erhält variable1 den Wert ‚test‘ und variable2 entsprechend ‚irgend_ein_wert‘. Vorhandene Variablen, die im PHP-Skript verwendet werden, könnten überschrieben werden. Um diese Art von Manipulation zu verhindern, sollte die automatische Variablenvorbelegung mit register_globals=off in der PHP-Konfiguration abgeschaltet werden (seit PHP 4.2.0 standardmäßig). Auf die per URL übergebenen Variablen kann dann seit PHP 4.1.0 mit den „Superglobals“ zugegriffen werden.

$_GET['variable1'] oder $_POST['variable1'] (je nach Übertragungsart)

$HTTP_GET_VARS['variable1'] oder $HTTP_POST_VARS['variable1'] (bei PHP-Versionen vor 4.1.0)

Zu den Superglobals zählen eine Reihe „assoziativer Arrays“ die im ganzen PHP-Code zur Verfügung stehen und die diverse Informationen speichern (Informationen vom Nutzer, dem Server und der Serverumgebung). Die Inhalte der Arrays $_GET, $_POST und $_COOKIE sind seit PHP 4.1.0 zusätzlich in $_REQUEST zusammengefasst (http://www.php.net/language.variables.predefined).

Anmerkung: Seit der Version 5.0 können die $HTTP_*_VARS deaktiviert werden (register_long_arrays=Off)

Allerdings kann man im gewissen Rahmen eine Manipulation verhindern, falls z. B. bei einem Forum ausschließlich ein Integerwert benötigt wird. In diesem Falle kann man überprüfen, ob der übergebene Wert ein Integer ist, und ggf. abbrechen. Eine andere Möglichkeit wäre es, den Integerwert am Anfang einen Standardwert zuzuweisen. Somit wird die manipulierte Variable überschrieben und man schließt somit die Sicherheitslücke.

Lizenz und Bezug

PHP 3 wurde unter der GNU General Public License (GPL) vertrieben. Seit Version 4 wird PHP unter der PHP License vertrieben, da der neue Parser, die Zend Engine, von den Machern unter einer nicht GPL-kompatiblen Lizenz veröffentlicht wird. Die PHP-Lizenz ist eine Softwarelizenz, die die freie Verwendung und Veränderung der Quelltexte erlaubt. Die Software kann somit kostenlos aus dem Internet geladen werden; daneben ist PHP auch schon bei einigen Betriebssystemen (z. B. bei allen relevanten Linux-Distributionen oder Mac OS X) im Lieferumfang enthalten.

Performance

Setzt man PHP als CGI-Programm ein, ist die Performance nicht optimal. Für jeden HTTP-Request startet der Webserver eine neue Instanz des PHP-Interpreters, welche jedes Mal den Quelltext des aufgerufenen Skriptes neu übersetzt. Um den Start der Interpreter-Instanzen zu sparen, setzt man PHP üblicherweise als Servermodul, d. h. Teil der Webserver-Prozesse, oder über FastCGI ein. Da bei kleinen Skripten das Starten des PHP-Interpreters bei weitem am meisten Zeit verbraucht, führt diese Maßnahme zu einer drastischen Leistungssteigerung.

Bei umfangreichen Projekten mit viel PHP-Quelltext kann es sich lohnen, auch das Neuübersetzen des Skriptes zu vermeiden. Dazu verwendet man einen sog. Opcode-Cache. Anders als bei Java ist es bei PHP nicht standardmäßig vorgesehen, die aus dem PHP-Quelltext erzeugten Opcodes zu speichern und später auszuführen. Die für PHP verfügbaren Opcode-Caches sind Erweiterungen, die man von Hand einbinden muss.

Beispiel für diese Caches sind Turck-mmCache, der nicht mehr weiterentwickelt wird, und dessen Nachfolger eAccelerator, der Alternative PHP Cache, der IonCube-Accelerator (alles Open Source und Freeware) sowie der kommerzielle Zend Optimizer.

Der Leistungsgewinn hängt von der Art der Skripte ab. Je geringer die eigentliche Laufzeit des Skriptes im Vergleich mit dem Umfang des Quellcodes ist, desto mehr lohnt sich der Einsatz solcher Opcode-Caches. Die von den Anbietern angegebenen Leistungssteigerungen sind als Maximalwerte zu verstehen. [10]

Weiterhin kann man die Leistung von PHP dadurch steigern, dass man umfangreiche Teile des Quellcodes in separate Dateien auslagert und nur bei Bedarf einbindet. Dafür stellt PHP 5 mit „Autoloading“ eine geeignete Methode bereit [11]. Auch ohne Opcode-Caches spart man so das Übersetzen von Teilen des Quellcodes.

In einem kürzlich veröffentlichten Datenbank-Contest[12] der Zeitschrift c't ist – vielleicht etwas überraschend – eine Lösungsvariante mit MySQL, welche PHP als Frontend nutzt, unter Linux mit der besten Performance (gegenüber Varianten in Java, C++ und anderen Sprachen) als Sieger hervorgegangen. Dabei wurde der oben erwähnte Alternative PHP Cache (APC) eingesetzt. Allerdings ging es bei dem Test um die Datenbank und nicht um die eingesetzte Skriptsprache.

Laut dem großen Computer Language Shootout [13] wie auch im großen Win32 Computer Language Shootout [14] liegt PHP bei Standardproblemen in Sachen Laufzeit und Ressourcenverbrauch in den meisten Benchmarks leicht bis deutlich hinter anderen populären Scriptsprachen wie Python, oder Perl.

Schutzsysteme für PHP-Installationen

Suhosin [2] ist ein fortgeschrittenes Schutzsystem für PHP-Installationen. Es wurde entworfen, um den Server und die Benutzer vor bekannten und unbekannten Fehlern in PHP-Anwendungen und im PHP-Kern zu schützen.

Verbreitete PHP-Applikationen

Es gibt verschiedene, sehr weit verbreitete Applikationen, die in PHP geschrieben wurden. Hier eine kleine Auswahl.

Literatur

Gedruckte Werke zu PHP veralten aufgrund der permanenten Weiterentwicklungen von PHP schnell. Die aktuellen Informationen und Dokumentationen findet man auf der offiziellen Website php.net.

Wiktionary: PHP – Bedeutungserklärungen, Wortherkunft, Synonyme, Übersetzungen
Wikibooks: Websiteentwicklung: PHP – Lern- und Lehrmaterialien

Dies ist eine kleine Auswahl von Links zu PHP. Eine ausführliche Linksammlung findet sich im Open Directory Project.

Zeitschriften

Quellen

  1. lerdorf.com. (englisch, abgerufen am 31. Mai 2021).
  2. a b c PHP: Preface - Manual. (abgerufen am 25. August 2016).
  3. Rasmus Lerdorf | PHP on Hormones. 29. Juli 2013 (abgerufen am 19. März 2016).
  4. Rasmus Lerdorf: "PHP's design goal from the very beginning is very simple. To solve the common web problem. That's it." [1]
  5. http://blog.webteam.at/2007/uber-ein-neues-halbes-feature-in-php-53/, "Einführung in late static binding"
  6. http://gtk.php.net (Englisch), 17. Juni 2007
  7. PHP Docs: Magic Quotes (englisch)
  8. PHP-Conference 2005: Präsentation von Andrei Zmievski (PDF)
  9. PHP-Mailingliste: Diskussion über mögliche Änderungen in PHP 6 (englisch)
  10. Jean-François Bustarret: Benchmarking PHP accelerators, 11. Juli 2006
  11. The PHP Group: PHP: Autoloading – Manual, 11. Juli 2006
  12. c't: Datenbank Contest
  13. http://shootout.alioth.debian.org
  14. http://dada.perl.it/shootout/