preload
Mrz 22

PHP Unconference

Allgemeines, PHP   von Thomas Sommerfeld Kommentieren »

Die etwas andere PHP-Konferenz
Als kleinen Kontrast zu den „konventionellen“ PHP- (oder allgemeiner Web-) Konferenzen, die ja mittlerweile mehrfach im Jahr stattfinden gibt es seit 2007 jedes Jahr im September die PHP-Unconference. Auf dieser Konferenz gibt es kein feststehendes Programm mit x Speakern, sondern „nur“ einen losen Rahmen. Es gibt einen definierten Zeitrahmen (in diesem Jahr findet die Unconference am 24. und 25. September in Hamburg statt) und eine Liste an Themen, die aber von den Besuchern im Vorfeld vorgeschlagen wurden. Aus diesen Vorschlägen bestimmen dann wiederum die Besucher die interessantesten Themen und diese werden dann in den Sessions abgehalten. Die Vortragenden sind teilweise „normale“ PHP-User wie Du und ich, aber auch die Koryphäen der Szene sind vertreten.
Der ganze Spaß kostet gerade mal 30,– Euro und wenn Hamburg nicht gerade am anderen Ende von Deutschland liegen würde, wäre ich auf jeden Fall dabei 🙂 Aber da wohl noch einige andere genauso denken, ist aktuell die erste internationale Unconference in Planung, die dann Ende 2010 auf Mallorca stattfinden soll.
Weitere Infos gibt es unter www.php-unconference.de/ und europe.phpunconference.org/.

Jan 29

Viele kennen wahrscheinlich die Server2Go-Umgebung von Timo Haberkern, mit der man eine komplette PHP- (und MySQL-) gestützte Website auf CD oder USB-Stick kopieren kann und dann auf (fast) jedem Windowsrechner einfach ohne Installation starten kann. An dieser Stelle auch nochmals herzlichen Dank an Timo für dieses tolle Projekt!
Einziger Wermutstropfen ist die Unterstützung anderer Browser als dem Internet Explorer. Man kann zwar in der pms_config.ini andere Browser einstellen, die auch automatisch gestartet werden, aber speziell bei der aktuellsten Version wird die Umgebung bei anderen Browsern meist nach 2 oder 3 Klicks geschlossen und der Apache-Server ist dann nicht mehr verfügbar. Ob es sich um einen Absturz handelt, kann man von „außen“ nicht erkennen. Offensichtlich erkennt aber das Server2Go-Modul den laufenden Browser nicht und fährt dann automatisch herunter. Dies kann man durch Ändern der Option KeepRunningAfterBrowserClose umstellen. Setzt man diese Option in der pms_config.ini auf den Wert 1

KeepRunningAfterBrowserClose = 1

ist die gesamte Umgebung auch mit Firefox oder Firefox Portable stabil lauffähig. Speziell beim Einsatz des Firefox Portable, den man dann ebenfalls auf den USB-Stick kopiert, kann man somit eine definierte Umgebung schaffen, die man nach seinen Wünschen einstellen kann.

Jan 21

Der Apache-Webserver kann so konfiguriert werden, dass Seiten standardmäßig mit einem bestimmten Charset ausgeliefert werden. Damit kann dann eine PHP-Seite, die eigentlich im UTF-8-Format gespeichert wurde, auf einmal als ISO-Seite erscheinen und dann natürlich mit fehlerhaften Umlauten, sofern diese nicht als HTML-Entities geschrieben wurden. Um das zu umgehen, kann man mit ini_set zu Beginn seiner Skripte den eigenen, gewünschten Charset angeben. Mit einem

ini_set("default_charset", "UTF-8");

wird die Seite dann auch garantiert als UTF-8-Seite ausgegeben, unabhängig von der Webserver-Konfiguration.
Besonders bei gehosteten Webpaketen bietet sich ein solches Vorgehen an, da man in diesem Fall ja meist keine Kontrolle über die Konfiguration hat.

Sep 11

Da das PECL-Package APC (Alternative PHP Cache) bisher bei mehreren parallelen Uploads unzuverlässige Fortschritts-Werte liefert (getestet mit Version 3.0), wurde bisher auf eine Perl-Lösung ausgewichen. Schöner wäre es allerdings, eine reine PHP-Lösung zu haben. Glücklicherweise gibt es noch ein weiteres PECL-Package namens uploadprogress, das mit Version 1.0 nun erstmals als stabile Version vorliegt. Die uploadprogress-Extension für php funktioniert auch bei mehreren parallelen Uploads und lässt sich recht einfach installieren…

Weiterlesen

Sep 03

Um die Extension mcrypt zu aktivieren, genügt es nicht, in Datei php.ini anzugeben, dass die Extension geladen werden soll:

extension=php_mcrypt.dll

Damit die Extension geladen werden kann, muss zuerst libmcrypt installiert werden. Dazu wird die Datei libmcrypt.dll im Windows-Verzeichnis in das Unterverzeichnis system32 kopiert. Die Bibliothek ist auf SourceForge.net verfügbar:

Download: mcrypt bei SourceForge.net herunterladen

Aug 27

In vielen PHP-Anwendungen findet man immer wieder mal die Funktion, eine Datei herunterzuladen, die nicht im Document-Root des Servers liegt. Hierzu wird dann ein kleines download-Skript erstellt, das in der Regel den gewünschten Dateinamen als Parameter erhält und dann die Datei direkt zum Browser ausgibt. Bequemerweise stellt PHP dafür die Funktion readfile zur Verfügung. Ein typischer Codeblock sieht dann ungefähr so aus:

if (isset($_GET["file"])) {
   $sFileName = $_GET["file"];
   // check for invalid file paths and preceed with file archive directory
   $sFile = getFullFileName($sSubDir);
   if (file_exists($sFile)) {
     header("Content-type: application/x-download");
     header("Content-Disposition: attachment; filename=$sFileName");
     header("Content-Transfer-Encoding: binary");
     header('Content-Length: ' . filesize($sFile));
     ob_clean();
     flush();
     readfile($sFile);
   }
}

Wichtig ist dabei die Verwendung von ob_clean() und flush() nach dem Senden der Header-Angaben. Ansonsten werden speziell Dateien mit Binärdaten nicht korrekt übermittelt und lassen sich dann beim Empfänger ggf. nicht öffnen.

Aug 07

Es ist schon mehrfach aufgetreten, dass Seiten, die mittels exec() Programme ausführen, urplötzlich hängen. Eine genauere Analyse ergab, dass dieses Problem auftritt, wenn der Server den ersten Request noch nicht abgearbeitet hat, jedoch der Benutzer im Browser schon wieder auf einen Link geklickt hat. Ruft der zweite Request auch exec() auf, hängt der Server. Es handelt sich dabei weder um ein Problem des Servers (bspw. Apache, IIS, Tomcat, usw.) noch um ein Problem des mit exec() ausgeführten Programms (bspw. GhostScript, ImageMagick, sonstige.com, usw.exe).

Das Problem liegt in diesem Fall bei PHP. Da die Session noch in Verwendung ist, während der nächste Request bereits versucht, einen zweiten Prozess mit der selben Session zu öffnen, hängt der Server, falls das ganze während der Ausführung von exec() stattfindet. Die Lösung dieses Problems ist es, die Session vor dem Aufruf von exec() zu schließen und sie direkt im Anschluss wieder zu starten:

<?php
  ...
  session_write_close();
  exec($sCommand);
  session_start();
  ...
?>

Durch das Schließen der Session kommt es nicht mehr zum Hängen des Servers. Das erneute Öffnen nach dem Aufruf von exec() garantiert, dass alle vor Beendigung des Skriptes erfolgenden Session-Zugriffe korrekt ablaufen.

Links zu diesem Problem:

Aug 05

Ein Datum kann, abhängig von der Maske, in der es angegeben werden muss, richtig sein, also bspw. 11.11.1998 oder 2004-04-05. Ein korrekt formatiertes Datum muss aber nicht zwangsweise auch existieren, wie bspw. 2009-02-31, also der 31. Februar 2009. Hierfür kann die PHP-Funktion checkdate($iMonth, $iDay, $iYear) verwendet werden, die ein gregorianisches Datum auf Gültigkeit prüft. Bevor die Funktion aufgerufen werden kann, muss die Datums-Zeichenkette in ihre einzelnen Teile zerlegt werden, also bspw. wie folgt:

<?php
  $iYear = intval(...);
  $iMonth = intval(...);
  $iDay = intval(...);
?>

Nun lässt sich mit checkdate einfach prüfen, ob das Datum wirklich gültig ist:

<?php
  $bDateIsValid = checkdate($iMonth, $iDay, $iYear);
?>

Zu beachten ist, dass checkdate laut Definition Integerwerte erwartet.