PHP

Welche php.ini ist die Richtige?

In Xampp für Windows ist mehr als eine php.ini enthalten! Welche ist die richtige für mich?

Erstellt in eurem Webroot (meist auch htdocs genannt) eine leere Datei, wobei der Name egal ist. Öffnet diese mit einem Editor eurer Wahl und fügt folgendes ein:

<?PHP
phpinfo();
?>

Speicher dies und rufe die Datei über einen Browser auf. Unter XAMPP für gewöhnlich http://localhost/dateiname.php. Auf der Seite sucht nun nach “Loaded Configuration File”, dahinter steht der Pfad zur php.ini die verwendet wird.

execution_time

Die max_execution_time ist in der Standard Konfiguration auf 30 gesetzt und bewirkt das PHP-Scripte maximal 30 Sekunden ausgeführt werden können.

Dies kann hinderlich sein, wenn man z.B. über phpMyAdmin einen größeren Dump einspielen möchte. Die Einstellung kann in der php.ini geändert werden.

max_execution_time = 1200

(nicht vergessen den Apache, nach der Änderung, neu zu starten).

php.ini

Die php.ini ist mehrmals zu finden, aber benutzt wird diejenige im Verzeichnis

  • XAMPP für Windows = c:\xampp\apache\bin\
  • XAMPP für Linux = /opt/lampp/etc/

Das php.ini Verzeichnis ist auch über phpinfo() im Auswahlmenü des XAMPP Willkommenscreen abzulesen.

register_globals oder "Wieso überträgt mein Formular keine Daten?"

Ein typisches Problem älterer Scripte ist, da sie das seit PHP 4.2 standardmässig deaktivierte register_globals verwenden.

Was heißt das genau?

Wenn über ein Formular oder über die URL direkt Daten übertragen werden, so landen diese in bestimmten Variablen in PHP. Ist register_globals aktiviert, so kann man diese direkt aus dem globalen Geltungsbereich ansprechen. Ein Beispiel: http://www.domain.tld/index.php?page=news. Dies überträgt an das Script index.php den Bezeichner page mit dem Inhalt “news”. Soweit so gut, aber was heißt das für das Script? Sollte register_globals aktiviert sein, so kann man direkt die globale Variable page nutzen, aber auch die “superglobale Variable” $_GET, welche ein Array über alle per GET übertragenen Inhalte beinhaltet.

echo $page;
echo $_GET['page'];

Ist register_globals allerdings deaktiviert, so entfällt erste Möglichkeit und der übertragene Inhalt kann nur über $_GET[’page’] angesprochen werden. Es gibt noch andere Methoden, die aber bei der ersten Problemlösung nicht weiterhelfen.

Das Problem ist nun, dass viele ältere Programme oder aufmerksame Programmierer gerade die erste Variante verwenden, weil sie lange Zeit gang und gäbe waren und zudem eben erst ab PHP 4.2 register_globals standardmässig deaktiviert ist. Ebenso aktivieren dies viele Webhoster, um ihren Kunden die Kompatibilität zu den alten Scripten zu erhalten. Es ist jedoch veraltet und sollte, speziell in Hinblick auf PHP 6, bei dem diese Option nicht mehr existieren wird, nicht mehr verwendet werden.

Was kann ich also tun, wenn ich so ein Script noch besitze?

  • das Script entsprechend umschreiben (ist zu bevorzugen)
  • in der php.ini den Eintrag auf “register_globals = On” setzen
  • der Einsatz von import_request_variables() (Notnagel)

Das genannte gilt ebenfalls für die Daten, die per Formular übertragen werden ($_POST[’bezeichner’]), per Cookie ($_COOKIE[’bezeichner’]) und Sessionvariablen ($_SESSION[’bezeichner’]).

Wer noch mehr dazu wissen will, kann sich hier informieren:

mySQLi

Um mySQLi zu aktivieren, muss folgende Zeile zur php.ini (siehe auch den vorstehenden Beitrag) hinzugefügt werden:

Im Absatz Dynamic Extension:

extension=php_mysqli.dll

Diese Zeile ist merkwürdigerweise in XAMPP 1.4.16 nicht als auskommentierte Vorlage vorhanden, also genauso eintragen wie oben angegeben. Die DLL-Dateien sind schon am richtigen Platz, hier braucht sich also um nichts gekümmert werden.

Mail

Eines der grössten Mysterien scheint ja das Versenden von Mails zu sein ;-) Grundsätzlich muss man hier erst einmal zwischen Windows und *nix unterscheiden.

  • Unter *nix benutzt die Funktion mail() das auf dem System installierte Sendmail. Dieses kümmert sich dann, sofern korrekt konfiguriert, um den weiteren Versand der Mail.
  • Unter Windows verschickt PHP in der Standardkonfiguration selbst die Mail per SMTP. Der Relay-Server der benutzt wird, wird aus der “php.ini” ausgelesen:
SMTP = localhost
smtp_port = 25
;sendmail_from = me@example.com

Allerdings kann sich PHP nicht am Mailserver anmelden, heutzutage ein Muss bei den meisten Servern, so dass der Versand oft scheitert. Tatsächlich kann man auch unter Windows die Sendmail-Schnittstelle benutzen und beim XAMPP für Windows ist auch ein solches dabei. Dieses Sendmail verschickt dann die Mail über ein vorhandenes Mailkonto wie z.B. bei GMX. Wichtig ist nur, dass der Mailanbieter den Versand über SMTP zulässt.

Die Konfiguration ist eigentlich ganz einfach. Gehen wir mal von folgenden Daten aus:

  • Name: John Doe
  • EMail: john.doe@example.com
  • SMTP-Server: mail.example.com
  • User: john.doe@example.com
  • Passwort: geheim
  1. Im ersten Schritt öffnen wir die Datei “\xampp\sendmail\sendmail.ini”:
    smtp_server=mail.example.com
    auth_username=john.doe@example.com
    auth_password=geheim
    force_sender=john.doe@example.com

    Alle anderen Werte lassen wir erst einmal deaktiviert (”;”).

  2. Im zweiten Schritt offnen wir die Datei “\xampp\apache\bin\php.ini”:
    sendmail_path = "\xampp\sendmail\sendmail.exe -t"

    (Das Semikolon “;” wegmachen).

  3. Im dritten Schritt noch den Apache neu starten, damit die Änderung übernommen wird.

Jetzt können wir untere erste Mail verschicken:

<?php
$to      = 'jane.doe@example.com';
$subject = 'Testmail';
$message = 'Hallo, dies ist ein Test.';
$headers = 'From: John Doe <john.doe@example.com>';
mail($to, $subject, $message, $headers);
?>

Fertige PHP-Scripte konfiguriert man jetzt einfach dahingehend, dass sie das interne mail() oder Sendmail benutzen.

Sollte jetzt doch noch keine Mail versendet werden, kann man in der Datei \xampp\sendmail\sendmail.ini noch einen oder beide der folgenden Punkte aktivieren (das Semikolon “;” wegmachen):

error_logfile=error.log
debug_logfile=debug.log

Damit landen dann Fehlermeldungen und/oder die ganze Mail plus der Kommunikation mit dem Mailserver in den jeweiligen Dateien.

Abschliessend noch ein Hinweis auf die zwei PEAR-Pakete:

Mit diesen kann man in eigenen Scripten Mails direkt über SMTP (sammt Anmeldung am Relay-Server) verschicken.

Funktionen abschalten

In PHP können gezielt einzelne Funktionen abgestellt werden. Dies dient unter Anderen der Sicherheit. Will man z.B. die Funktion exec() abstellen, dann ist in der php.ini folgende Zeile einzufügen.

disable_functions = exec

Es können auch mehrere Funktionen auf einmal abgestellt werden. Dazu schreibt man sie hintereinander durch ein Komma getrennt.

disable_functions = exec, passthru, system, fopen
 
php.txt · Zuletzt geändert: 2009/11/18 11:36 von magna
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki