preload
Feb 03

Nehmen wir mal an, wir möchten einen bestimmten Bereich innerhalb einer HTML-Seite per Ajax-Request nachladen. Das kann z.B. sein, um den Inhalt dieses Bereichs zu aktualisieren, da er zwischenzeitlich an anderer Stelle geändert wurde.

Nahmen wir weiter an, wir setzen den Ajax-Request refresh.php ab – der soll den neuen Inhalt für den oben genannten zu aktualisierenden Bereich liefern. In diesem Fall spielt uns der Internet Explorer einen Streich: beim ersten Aufruf klappt die Aktualisierung ganz prima. Da er aber anschließend im Cache liegt, findet bei allen anderen Aufrufen der Aktualisierung kein eigentlicher Request mehr statt, sondern es wird lediglich das geladen, was im Cache liegt. Unschön.

Die Lösung ist zum Glück relativ einfach: einfach eine Zufallszahl an die refresh.php hängen!
Beispiel:

new Ajax.Request("refresh.php?random=" + Math.random(), ...);

Damit klappt’s.

Jan 17

Mit der PHP.ini-Direktive post_max_size lässt sich festlegen, welchen Umfang im Maximalfall ein per POST abgeschicktes Formular haben darf. Besonders im Zusammenspiel mit der Direktive max_file_size, die wiederum bestimmt, welche maximale Dateigröße bei einem Upload akzeptiert wird, ist post_max_size gelegentlich anzupassen.
Im Druckerei-Umfeld werden nun wiederum des öfteren sehr große Dateien transferiert, so dass hier die Angabe auch entsprechend weit nach oben zu schrauben ist. Zumindest auf einem 32-Bit-System kommt man hier aber auch schnell an die Grenze. Bei einer Angabe von mehr als 2 GB übermittelt PHP auf einmal nämlich überhaupt keine Daten mehr bei einem POST. Das $_POST-Array ist leer, auch wenn das Formular nur minimale Daten enthielt. Ob man doch einen Wert größer als 2.048 MB erreichen kann, evtl. durch Anpassungen bei weiteren Direktiven, konnte ich bisher noch nicht herausfinden.

Tagged with:
Jun 23

PHP funktioniert ja recht gut im Zusammenspiel mit der Oracle-Datenabnk. Lediglich bei der Installation des Oracle-Clients muss man aufpassen. Vielfach ist wahrscheinlich noch ein Oracle 10g Client im Einsatz, den man zur Verbindung zwischen Webserver und Oracleserver verwenden möchte. Wenn man allerdings dann bei PHP 5.x (auch bei der aktuellen 5.3.2) die php_oci8.dll Extension aktivieren möchte, lässt sich der Apache 2.2 danach nicht mehr starten. Es erscheint eine Meldung im Eventviewer, dass die php5ts.dll einen Fehler verursacht.

Faulting application httpd.exe, version 2.2.3.0, faulting module php5ts.dll, version 5.3.2.0, fault address 0x000980d6.

Offensichtlich hat der Oracle-Client nicht alle erwarteten Schnittstellen implementiert. Abhilfe schafft die Installation des OracleXE-Clients, mit dem die Anbindung problemlos gelingt.

Tagged with:
Jun 19

Um statistische Daten grafisch darzustellen gibt es mittlerweile ja verschiedene Bibliotheken, allen voran ist hier wohl die JpGraph-Bibliothek zu nennen, die viele Wünsche der Statistikfreunde erfüllt. Gerade für kleinere Auswertungen gibt es aber auch eine weitere, recht einfache Möglichkeit. Google stellt hier mit der Google Chart API eine recht umfangreiche Schnittstelle zur Verfügung, der man per Post oder Get ein paar Werte unterschiebt und schon bekommt man das fertige Bild zurück.
Für interessierte Einsteiger habe ich ein Beispiel zur Google Chart API erstellt, das eine Möglichkeit aufzeigt, die Daten sowohl in einer tabellarischen Form als auch als Grafik darzustellen. Natürlich kann man das Beispiel auch direkt online betrachten.
Man muss klar sagen, dass es einige Einschränkungen gibt, z.B. die Beschränkung der Bildgröße auf 300.000 Pixel oder dass nur Werte zwischen 0 und 100 zulässig sind (was durch eine Skalierung erreicht wird), aber für viele Fälle reicht es eben doch aus und die Einbindung geht sehr schnell und einfach.
Weitergehende Informationen zur API finden sich bei der Beschreibung der Google Chart Tools.

Tagged with:
Mrz 22

PHP Unconference

Allgemeines, PHP   von Thomas Sommerfeld 1 Kommentar »

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.