HipHop – Convert PHP to C++

Vor kurzem habe ich durch Zufall auf dem Entwickler Blog von Facebook einen Artikel darüber gelesen, dass ein Entwickler (Haiping Zhao) ein Programm geschrieben hat, dass aus PHP C++ Code erstellt. Ein wenig habe ich auch damit herum gespielt und getestet. Die Ergebnisse möchte ich natürlich festhalten. HipHop – Convert PHP to C++ weiterlesen

PHP: UTF-8 und header()

Warning: Cannot modify header information - headers already sent by (output started at index.php:1) in index.php on line 13

Diese Fehlermeldung zeigt sich, wenn man eine in UTF-8 konvertierte PHP Datei hat und mit der Funktion header() selbigen Ändern möchte.
Das Problem entsteht, wenn ein BOM (Byte Order Mask) am Anfang der Datei steht. In Editoren, die UTF-8 nicht unterstützen erscheint dann zum Beispiel ein „“ (entspricht Bytefolge: EF BB BF).
Der PHP-Parser kann diese Bytefolge nicht interpretieren und gibt sie schlichtweg aus bevor auch nur irgend etwas anderes ausgegeben werden kann.
Da in UTF-8 dieser BOM zwar erlaubt, aber nicht nötig ist kann man ihn einfach entfernen. Ermöglichen tut das zum Beispiel Notepad++ ([Format]->[Formatieren zu UTF-8 ohne BOM]).
Mit PHP ab Version 6 soll dieses „Problem“ gelöst werden.
Mehr zum Thema Byte Order Mask.

APC & Smarty unter Windows

Da ich jetzt endlich APC unter Windows zum laufen bekommen habe musste ich feststellen das unter Windows (nicht unter Linux) Probleme mit dem Cache entstehen, wenn man Smarty (2.x) verwendet.
Wie es in Smarty 3 wird, weiß ich nicht – eventuell werde ich das aber noch testen.
Folgender Fehler wurde bei mir geworfen, wenn der Smarty eigene Cache ausgeschaltet ist:

Fatal error: Call to undefined function smarty_core_write_file() in ...\lib\smarty\internal...

Für mich reicht es vorerst, den AP-Cache unter der Windowsmaschine zu deaktivieren, da ich APC derzeit nur für Dateiuploads benötige.
In der php.ini also die Einstellung „apc.cache_by_default“ auf 0 (Off) gesetzt.

...
[APC]
apc.enabled=1
apc.cache_by_default = 0
...

Sollte ich elegantere Lösungen finden, werde ich diese hier natürlich auch veröffentlichen.
UPDATE: Hier eine elegantere Lösung…

Große MySQL Datenbanken einspielen/splitten/teilen

Ich wollte heute eine etwas größere Datenbank via phpMyAdmin importieren. Daraus haben sich zwei Probleme ergeben.

  1. Uploads dürfen maximal 16mb groß sein
  2. PHP hat nur 32mb Arbeitsspeicher zur Verfügung

Auf der Suche nach diversen Lösungen hab ich den Lösungsansatz verfolgt, meine database.sql in mehrere Dateien zu teilen/splitten. Das ist händisch natürlich sehr viel Aufwand – also habe ich nach einem gutem altem batch-script oder dergleichen gesucht. Diverse Programme habe ich auch gefunden, aber keins hat mich von der Funktion her überzeugt.
Wie immer bin ich durch Zufall über die entsprechende Software gestolpert: BigDump
BigDump ist ein kleines PHP-Script welches man via FTP mitsamt der dump.sql in einen Ordner hoch lädt. Vorher öffnet man natürlich das kleine Script und ändert die Parameter für die Datenbank. Eigentlich Selbsterklärend:

// Database configuration
$db_server   = 'localhost';
$db_name     = 'datenbankname';
$db_username = 'username';
$db_password = 'superstrenggeheimespw';

$db_name definiert den Namen der Datenbank in die wir den Dump spielen. $db_username und $db_password beinhalten den Username und das Passwort (wer hät’s gedacht) und $db_server den Host. In der Regel bleibt der auch auf localhost stehen. Ausnahmen sind dem Administrator in der Regel bekannt.
Der Rest ist einfach. Das Script über den Webbrowser aufrufen und aus der Liste der einzuspielenden Dumps den, den man hoch geladen hat auswählen und Stück für Stück einlesen lassen.
Danach sollte man die PHP-Datei aus Sicherheitsgründen unbedingt wieder löschen oder anderweitig mit einem Passwort schützen (z.B. mit htaccess).

„IHTML“ Mit PHP ein Bild in HTML darstellen

Für alle die zu viel Zeit haben:
Ich hab mir die Frage gestellt ob es möglich ist, ein Bild in HTML darzustellen. Sprich: Für jeden Pixel eine DIV-Box erstellen und in der entsprechenden Farbe einzufärben. Natürlich kann man das. Aber kann das auch mit PHP realisiert werden? Natürlich…!
Hier findet ihr das Orginalbild und hier das Bild in HTML dargestellt. Natürlich ohne Qualitätsverlust.
Die Orginal PHP Datei stell ich nicht online da diese Methode doch ein wenig Rechenintensiv ist.
Hier der PHP Code direkt mit entsprechendem HTML dazu:

<html>
<head>
<title>img2html</title>
<style type="text/css">
<!--
.pixel {
width:1px;
height:1px;
float:left;
}
.row {
clear:both;
}
-->
</style>
</head>
<body>
<?php
    $image = new imagick("dialog_ok.png");
    $width = $image->getImageWidth();
    $height = $image->getImageHeight();
    $row = 1;
    $pixel = 1;
    for($row; $row < = $height; $row++) {
        $pixel = 1;
        for($pixel; $pixel <= $width; $pixel++) {
            $tmp = $image->getImagePixelColor($pixel, $row);
            $color[$row][$pixel] = $tmp->getColor();
        }
    }
    foreach($color as $key => $row) {
        print "		<div class=\"row\">\n";
        foreach($row as $key => $row) {
            print "			<div class=\"pixel\" style=\"background-color:rgb(".$row['r'].", ".$row['g'].", ".$row['b'].");\"></div>\n";
    }
    print "		</div>\n";
}
?>
</body>
</html>

Vorraussetzungen hierfür:
– PHP
– Imagick
Sollte tatsächlich jemand dieses Script in den Produktiveinsatz bringen: Ein kleiner Vermerk Seite im Quellcode währe nett!