| search | |
Die PHP-Funktion phpinfo() liefert eine Fülle von Information über die aktuelle Konfiguration des Interpreters. Das typische Testprogramm sieht so aus:
<?php phpinfo(); ?>
Die Ausgabe von phpinfo() sagt unter anderem, wo PHP seine Konfigurationsdatei php.ini sucht. Steht hier nur php.ini , hat PHP keine Datei gefunden und arbeitet mit Default-Einstellungen (diese entsprechen etwa denen aus der php.ini-dist ); weniger irreführend ist die Ausgabe von echo get_cfg_var('cfg_file_path') , sie ist in diesem Fall einfach leer.
Bei der Kompilierung von PHP kann mit der Direktive --with-config-file-path=/dir ein Verzeichnis definiert werden; default-mäßig erwartet PHP die php.ini unter Unix in /usr/local/lib und unter Windows im Windows-Verzeichnis. Dorthin kopiert man die mitgelieferte php.ini-dist und benennt sie in php.ini um.
Ab der Version 4.3.0 kann bei der Kompilierung von PHP mit der Direktive --with-config-file-scan-dir=PATH ein zusätzliches Verzeichnis definiert werden, in dem zusätzliche php.ini Dateien liegen können. Wurde PHP mit dieser Option kompiliert und liegen php.ini Dateien in diesem Verzeichnis, haben die Einstellungen Vorrang gegenüber der vorher gefundenen php.ini.
Neben der php.ini und den .htaccess -Dateien gibt es unter Windows auch die Möglichkeit, in der Registry PHP-Konfigurations-Einstellungen vorzunehmen - ob dies der Übersichtlichkeit dienlich ist, sei dahingestellt... Die Einstellungen wirken sich als 'local value' (siehe phpinfo() ) auf bestimmte Verzeichnisse sowie deren Unterverzeichnisse aus.
Regedit öffnen
Den Schlüssel HKEY_LOCAL_MACHINE\SOFTWARE öffnen
Den Schlüssel PHP anlegen
Den Schlüssel Per Directory Values anlegen
Einen Schlüssel für das Laufwerk anlegen, in dem sich das Document Root befindet, z.B. C oder D (ohne ' :\ '!)
Einen Schlüssel für das Document-Root-Verzeichnis anlegen, z.B. ' www '
(Für jedes Unterverzeichnis einen weiteren Unterschlüssel anlegen, z.B. ' php ')
Einen neuen "Zeichenfolgenwert" anlegen, z.B ' auto_prepend_file '
Dem neuen Eintrag einen Wert zuweisen, z.B. ' prepend.php '
Der vollständige Schlüssel aus obigem Beispiel sollte nun so aussehen: HKEY_LOCAL_MACHINE\SOFTWARE\PHP\Per Directory Values\C\www\php -> auto_prepend_file = 'prepend.php' . Anmerkung: Egal ob der Eintrag ein bool'scher Wert, Integer oder String ist, der Schlüssel muss immer vom Typ "Zeichenfolgenwert" (engl. "string") sein.
Die Unterscheidung hat nur in der Modulversion von PHP einen Sinn:
Der Master Value ist der Wert, der in der php.ini eingetragen ist. Diese Datei wird nur beim Neustart des PHP-Interpreters (beim Modul also beim Neustart des Webservers) eingelesen und beachtet. Diese Werte gelten überall auf dem Server, wenn kein besonderer local value definiert ist.
Der Local Value ist der Wert, der in diesem Verzeichnis gilt. Er kann in einem Apache <Directory> -Block oder in einer .htaccess -Datei eingetragen sein. In ersterem Fall wird er beim Neustart des Servers neu gelesen, in letzterem Fall wird er bei jedem Zugriff neu gelesen und beachtet.
Sicherheitsrelevante Konfigurationseinträge sind nicht über .htaccess -Dateien steuerbar, sondern nur über Einträge in <Directory> oder <Location> -Blocks in der zentralen Konfigurationsdatei. Sonst wären sie auch sinnlos, da die .htaccess -Dateien ja durch den Anwender kontrolliert werden.
Welche Werte wo definiert werden dürfen, ist im offiziellen PHP-Manual offiziellen PHP-Manual im Detail beschrieben.
Wenn CGI-PHP eingesetzt wird, bekommt der Interpreter den Pfad zum PHP-Script in der CGI-Variablen $_SERVER['PATH_INFO'] übergeben. Der Aufruf eines PHP-Scriptes erfolgt also mit Hilfe einer URL der Form
http://www.example.com/cgi-bin/php/somedir/somescript.php
Der PHP-Interpreter wird dabei unter der URL http://www.example.com/cgi-bin/php erreicht und die Variable $_SERVER['PATH_INFO'] erhält den Wert /somedir/somescript.php . Der PHP-Interpreter greift sich den Wert der Konfigurationsvariablen document_root aus der php.ini und setzt den Dateinamen des Scriptes aus dieser Variablen und $_SERVER['PATH_INFO'] zusammen.
Dies ist natürlich gefährlich, denn ein böswillger Anwender könnte jetzt anfangen, Scripte wie folgt aufzurufen:
http://www.example.com/cgi-bin/php/../../../../../etc/passwd
Der PHP-Interpreter würde nun anfangen, die passwd-Datei als Script zu laden und auszuführen, d.h. die Passwort-Datei auszugeben. Auf diese Weise kann man prinzipiell auf jede Datei im System zugreifen, sofern diese durch den Benutzer lesbar ist, unter dessen UID der Interpreter abläuft.
Übersetzt man CGI-PHP mit der Konfigurationsoption enable-force-cgi-redirect , funktioniert dies nicht mehr. PHP startet in diesem Fall nur noch, wenn die CGI-Umgebungsvariable $_SERVER['REDIRECT_STATUS'] gesetzt ist (der Wert der Variablen ist egal). Der Apache Server setzt diese Variable, wenn der Zugriff auf das CGI-Verzeichnis die Folge eines eines serverinternen Redirect ist. Üblicherweise konfiguriert man seinen Webserver dann so:
Action php-script /cgi-bin/php AddHandler php-script .php
Die Direktive AddHandler bildet die Endung .php auf den Handler php-script (der Name ist frei wählbar, solange er eindeutig ist) ab. Die Direktive Action deklariert eine externe Aktion, die durch ein CGI-Programm realisiert wird. In Kombination bewirken beide Direktiven, dass alle Zugriffe auf Dateien mit der Endung .php auf das CGI-Programm /cgi-bin/php redirected werden. Dies erzeugt als Nebenwirkung genau die benötigte $_SERVER['REDIRECT_STATUS'] -Variable.
Die beiden Apache-Konfigurationsdirektiven bewirken, dass Dateien mit der Endung .php im PHP-Interpreter landen und die Abfrage auf die $_SERVER['REDIRECT_STATUS'] -Variable bewirkt, dass ein direkter Aufruf des PHP-Interpreters mit einem manipulierten $_SERVER['PATH_INFO'] nicht mehr möglich ist. In Kombination stellen beide Mechanismen ein vernünftiges Maß an Sicherheit her.
PHP berechnet nun den Wert der Variablen $_SERVER['PHP_SELF'] auf andere Weise, falls enable-force-cgi-redirect in Kraft ist: In diesem Fall enthält die Variable wirklich nur den Namen des Scriptes ohne den Pfad zum PHP-Interpreter. Ist der Interpreter jedoch ohne diese Einstellung übersetzt worden, ist der Name des PHP-Interpreters Bestandteil von $_SERVER['PHP_SELF'] . Dies ist ein Hinweis auf ein schweres Sicherheitsproblem. Der Interpreter sollte ausgetauscht werden durch eine Version, die mit enable-force-cgi-redirect übersetzt wurde.
Manche Webserver sind nicht in der Lage, Endungen auf CGI-Programme zu mappen (beim Netscape Server kann man dies mit Hilfe eines Plugin-Modules nachrüsten) oder sie erzeugen keine $_SERVER['REDIRECT_STATUS'] -Variable, wenn sie ein solches Mapping vorgenommen haben. In diesem Fall muss man ohne enable-force-cgi-redirect arbeiten und mit dem Sicherheitsloch leben oder - besser - den Webserver wechseln.
Die Funktion set_time_limit() bzw. die Konfigurationsanweisung max_execution_time in der php.ini wirkt nicht auf die absolute Laufzeit des Scriptes, sondern sie begrenzt die verbrauchte CPU-Zeit eines Scriptes. In
set_time_limit(1);
sleep(10);
print("hallo");
verbraucht die sleep() -Funktion zwar reale Zeit, aber keine CPU-Zeit. Daher wird das Zeitlimit von einer Sekunde hier auch nicht wirksam und der Text wird noch gedruckt.
Prinzipiell kann man Dateien mit beliebigen Endungen durch PHP verarbeiten lassen, also auch die Endung .html . Normalerweise braucht man hierzu Zugriff auf die Apache-Konfigurations-Datei httpd.conf (wenn der Provider es nicht unterbunden hat, reicht aber auch ein Eintrag in einer .htaccess -Datei, die man einfach in sein Home-Directory stellt). Auf diese Weise lassen sich auch prima in PHP3 geschriebene Anwendungen bei einem Provider betreiben, der nur noch PHP4 anbietet (die Kompatibilität beträgt praktisch 100%, siehe Anhang B. des PHP Manuals ).
Je nachdem, ob PHP in der Modul- oder der CGI-Version zum Einsatz kommt, unterscheiden sich die Konfigurationsanweisungen. Bei PHP4 ist das Modul die häufigere Art, hier sieht die Zeile meist so aus:
AddType application/x-httpd-php .php .php4 .html
Mehrere Dateiendungen schreibt man einfach durch Leerzeichen getrennt hintereinander. Beim Massenhoster 1&1 (PureTec, S+P, sowie deren Reseller) ist bei AddType eine etwas andere Syntax notwendig: AddType x-mapp-php4 .php .html
Diese Konfigurationsanweisungen können in der httpd.conf entweder in Section 2 ('Main' server configuration) stehen, in <VirtualHost>-Containern (Section 3), wo sie nur für den entsprechenden Domain-/Hostnamen gelten, oder in <Directory>-Containern, wo sie nur für ein bestimmtes Verzeichnis und dessen Unterverzeichnisse gelten. Auch in .htaccess -Dateien sind sie möglich, sie gelten dann ebenfalls für nur für ein Verzeichnis bzw. dessen Unterverzeichnisse.
Betreibt man PHP nicht als Webserver-Modul, sondern als CGI (z.B. PHP3 parallel zu PHP4), sieht der Eintrag folgendermaßen aus:
AddType application/x-httpd-php3 .php3 .html Action application/x-httpd-php3 /cgi-bin/php // Für Windows ScriptAlias /php3/ "/path-to-php-dir/" AddType application/x-httpd-php3 .php3 Action application/x-httpd-php3 "/php3/php.exe"
Solange die Modulversion von PHP verwendet wird und in den verarbeiteten Dateien keine PHP PIs (SGML Processing Instructions, die PHP einschalten: <?php usw.) vorkommen, ist der Mehraufwand in CPU-Belastung und Zeitverbrauch kaum meßbar. Bei der CGI-Version entspricht der Mehraufwand dem Ausliefern jeder HTML-Seite durch ein CGI-Programm. Das kann beträchtlich sein.
Wichtig: Bei Änderungen an der httpd.conf ist ein Neustart des Apache notwendig (Linux: apachectl restart ), um sie wirksam werden zu lassen.
Eine besondere Funktion kann man der Dateiendung .phps zukommen lassen, PHP stellt dann den Quellcode der Datei mit farbig hervorgehobenen Tags dar:
AddType application/x-httpd-php-source .phps
Man kann seine PHP-Dateien kopieren und als .phps speichern, dies hat jedoch Nachteile: es wird der doppelte Speicherplatz verbraucht, und bei Änderungen an der Datei muss die Kopie auch aktualisiert werden. Unter Unix/Linux kann man einen symbolischen Link auf die Datei anlegen, um dies zu vermeiden ( ln -s file.php file.phps ). Allerdings muss dies für jede Datei getan werden; will man alle Dateien mit der Endung .php auch als .phps abrufen können, bastelt man mit dem Apache-Modul mod_rewrite (oder auch mod_alias ) eine Regel, die diese Requests abfängt und an ein PHP-Skript weiterleitet. Im Manual bei der Funktion highlight_file() findet man ein Beispiel, wie man Source Highlighting auch auf recht elegante Art mittels ForceType erreichen kann.
PHP verwendet die globale Konfigurationdatei php.ini . Die Ausgabe von phpinfo() sagt, wo PHP diese Datei sucht. Findet PHP keine php.ini , arbeitet es mit Default-Werten, die sich kaum von denen aus der php.ini-dist unterscheiden. Ob bzw. welche Konfigurationsdatei verwendet wird, läßt sich mittels
echo get_cfg_var("cfg_file_path");
herausfinden. Neben der php.ini gibt es aber noch andere Möglichkeiten, die PHP-Konfiguration zu beeinflussen:
Diese Einstellungen wirken sich auf den ganzen Server (oder virtuelle Hosts oder sog. Container) aus (nur bei PHP als Apache-Modul):
# String- und Integerwerte
# php_value variable wert
php_value max_execution_time 60
# Booleanwerte
# php_flag variable on|off
php_flag track_vars on
# Geschützte Werte, die nur in der zentralen
# Apache-Konfig gesetzt werden dürfen.
# php_admin_value variable wert
# php_admin_flag variable on|off
php_flag und php_value können wie oben beschrieben verwendet werden. Diese Einstellungen wirken sich auf alle PHP-Scripts im aktuellen und allen Unterverzeichnissen aus (nur bei PHP als Apache-Modul).
Mit ini_set() kann man zur Laufzeit des Scripts die PHP-Konfiguration manipulieren:
ini_set("max_execution_time", "60");
phpinfo();
Wie man sehen kann, wurde die maximale Ausführungszeit für dieses eine Script verdoppelt (gegenüber der Default-Einstellung).
Diese drei Einstellmöglichkeiten betreffen jeweils den sog. "Local Value", im Gegensatz zum "Master Value", der ausschließlich in der php.ini definiert wird. Effektiv zur Anwendung kommt der "Local Value". Eine Übersicht über die Werte erhält man mit phpinfo() .
Hinweis: Bei Änderungen an den Dateien httpd.conf und php.ini muss bei der Modulversion von PHP der Apache neu gestartet werden, um die Änderungen wirksam werden zu lassen.
Fragen zur Webserver-Konfiguration, soweit sie nicht unmittelbar etwas mit PHP zu tun haben, werden am besten in der dafür vorgesehenen Newsgroup de.comm.infosystems.www.servers behandelt. Für diese Newsgroup existiert auch eine kleine FAQ , die vielleicht die ein oder andere Frage schon im Vorfeld klären hilft.
Die einfachste Möglichkeit, Konfigurationsvariablen zu ändern, ist, diese in der php.ini einzutragen (siehe hierzu php-ini ). Dies ist aber nicht immer möglich bzw. gewünscht. Entweder weil man keinen Zugriff auf die php.ini hat oder weil man serverunabhängig programmieren möchte. Deshalb gibt es die Möglichkeit, Konfigurationsvariablen zur Scriptlaufzeit zu ändern. Eine volle Übersicht über die verfügbaren Variablen gibt es auf der Manual-Seite der Funktion ini_set() .Besondere Aufmerksamkeit verdient hier die dritte Spalte der Tabellen. Variablen, die mit PHP_INI_ALL gekennzeichnet sind, lassen sich mit der Funktion ini_set() innerhalb eines Scriptes ändern oder in einer .htaccess -Datei setzen. So kann man zum Beispiel innerhalb eines Scriptes und unabhängig vom Server-Betriebssystem den Include-Path anpassen:
$include_path[] = ".";
$include_path[] = "pear/";
ini_set("include_path", implode(strpos($_SERVER['SERVER_SOFTWARE'], 'Win')
? ';'
: ':',
$include_path
));
Mit PHP_INI_PERDIR gekennzeichnete Variablen lassen sich ausschließlich mittels einer .htaccess -Datei setzen. So ist auf manchen Servern per default session.use_trans_sid deaktiviert. Folgende .htaccess -Datei aktiviert dies:
<IfModule mod_php4.c> php_value session.use_trans_sid 1</IfModule>
Um mit PHP_INI_SYSTEM gekennzeichnete Variablen zu ändern, benötigt man Zugriff auf die php.ini.