Alles rund um Magento!

Mime-Type-Problem mit PHP Autoload

Als ich mir heute mit PHP Autoload (phpab) meine Autoload-Datei neu generieren ließ, war ich bass erstaunt. Statt der üblichen 700 Klassen waren plötzlich nur noch 15 Dateien enthalten.

Nach ein bisschen Debuggen kam ich dann recht schnell dahinter, dass die Ursache in der Klasse \TheSeer\DirectoryScanner\PHPFilterIterator liegt:

public function accept() {
    $finfo = new \finfo(FILEINFO_MIME);
    return strpos($finfo->file($this->current()->getPathname()), 'text/x-php') === 0;
}

Dort wird nämlich der Mime-Type der Datei überprüft und nur Dateien mit Mime-Type text/x-php werden überhaupt nach Klassen durchsucht. Meine Dateien haben lustigerweise aber zum Großteil text/x-c++ – zumindest wenn ich mir das unter Windows anschaue. In meiner virtuellen Maschine haben die selben Dateien, die dann über vboxsf eingebunden sind, den korrekten Mime-Type.

Klar – ich kann das erstmal umgehen, indem im PHPFilterIterator ein return true einbaue; aber schön ist anders. Hat jemand einen Tipp wie man den Mime-Type einer Datei ändern kann oder noch interessanter: wie das Problem überhaupt entstanden sein könnte? Da es in der Linux-VM korrekt angezeigt wird ist ja vermutlich irgendwas an meinem Windows kaputtkonfiguriert…

Grep für Application-Logs

Bei der Fehlersuche bieten einem die Application-Logs oftmals einen guten Einstiegspunkt. Doch die Suche darin kann zum Teil recht mühsam sein. Vor allem wenn man nicht nach der Fehlermeldung selbst suchen will, sondern zum Beispiel alle Fehler haben will, die einen bestimmten Methodenaufruf im Stacktrace haben. Und dann wollte ich auch nicht nur die Zeile haben, sondern den ganzen Log-Eintrag, inklusive Message und komplettem Stacktrace.

Ich habe mir dafür ein kleines PHP-Skript geschrieben. Vielleicht findet es ja sonst jemand nützlich:

<?php
// loggrep.php 2011-12-08
if (2 !== $argc && 3 !== $argc) {
    echo "USAGE: {$argv[0]} <pcre-pattern> <file>\n";
    exit(1);
}
 
$filename = 'php://stdin';
if (isset($argv[2])) {
    $filename = $argv[2];
}
$fp = fopen($filename, 'r');
 
// "2011-11-22T02:16:34+01:00 - "
$startPattern = '#^\d{4}(-\d{2}){2}T\d{2}(:\d{2}){2}\+\d{2}:\d{2} - #';
$searchPattern = $argv[1];
 
$found = false;
 
while ($line = fgets($fp)) {
    if (preg_match($startPattern, $line)) {
        if (true === $found) {
            foreach ($buffer as $bufferedLine) {
                echo $bufferedLine;
            }
        }
 
        $buffer = array();
        $found = false;
    }
 
    if (preg_match($searchPattern, $line)) {
        $found = true;
    }
 
    $buffer[] = $line;
}

Der Aufruf sieht dann so aus:

$ php loggrep "#Mage_Core_Block_Template#" exception.log

Wichtig ist, dass der Suchbegriff mit PCRE-Syntax (inklusive Delimiter) angegeben wird.

Update 08.11.2011

Jetzt neu: Falls keine Datei angegeben wird, kann das Skript auch von STDIN lesen. Damit kann man auch einfach in gepackten Dateien suchen:

$ zcat exception.log.1.gz | php loggrep "#Mage_Core_Block_Template#"

IPC 2011 – Tag 2

Da wir gestern noch bis spät geschäftliche Besprechungen hatten, haben wir die Keynote heute morgen leider verpasst. Wir sind daher pünktlich für den zweiten Kaffee des Tages vor dem zweiten Slot in der Rheingoldhalle angekommen :)

Den ersten Vortrag des Tages bildete somit “Zend Framework 2: State of the Art”. Enrico Zimuel (Zend) gab einen groben Überblick zu den Veränderungen und Neuerungen in ZF2 und zur aktuellen Zeitplanung: eine erste Beta soll noch im Oktober veröffentlicht werden. Das Autoloading in ZF2 wurde grundlegend erweitert. Zwar unterstützt der Autoloader nach wie vor die alte include-path-basierte Methode, zusätzlich kann man Namespaces mit Verzeichnissen verknüpfen woraufhin der Loader Klassen dieser Namespaces direkt aus dem spezifizierten Verzeichnis lädt. Das bringt laut den Zend-Benchmarks mit Opcode-Cache bis zu 40% Performancegewinn. Bis zu 60% schneller ist der Loader mit einer statischen Classmap. Dabei wird das gleiche Prinzip wie bei Arne Blankerts Autoload verwendet. Dependency Injection wird über Container, Interfaces und Setter ermöglicht, die auch über Annotationen konfigurierbar sind. Beispiele dazu finden sich auf Ralph Schindlers Git-Repository. Ebenfalls neu sein wird der EventManager sowie das eventgetriebene MVC-Framework, dass sich auch modular erweitern lassen soll.

weiterlesen »

IPC 2011 – Tag 1

Juhu, es ist wieder so weit: Konferenz! :) Nach viel zu frühem Aufstehen (7 Uhr) ging es heute morgen auf nach Mainz zur IPC 2011. Dort konnte ich beweisen, dass die Android-Navigation den nächsten McDonalds besser findet als angebissenes Obst. Zur Rheingoldhalle konten beide Navigationssysteme gleich gut navigieren.

Auf der Konferenz angekommen gab Johannes Schlüter (Oracle) zunächst ein Update bezüglich PHP 5.4. Dabei wurde unter anderem auf Traits, die neue Array-Syntax und den internen PHP-Dev-Webserver eingegangen. Verbunden war das Ganze mit der eindringlichen Aufforderung die Nightly-Builds zu testen um solche Bugs wie in PHP 5.3.7 und andere zu vermeiden. PHP würde zwar von einer Test-Suite getestet, doch “unbeabsichtigte” (sprich: nicht im Sinne der PHP-Entwickler) Verwendungen von Funktionen würden von dieser Test-Suite eben nicht erfasst, was auch zum aktuellen Problem mit der is_a()-Funktion führe.

weiterlesen »

Startschwierigkeiten PHP-CLI auf Windows mit cURL

Schon seit längerem nervt mich, dass das PHP-CLI auf meinem Windows-Rechner etwa drei Sekunden braucht, bevor es überhaupt anfängt irgendetwas zu tun:

PS C:\> measure-command { php -v }
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 2
Milliseconds      : 844
Ticks             : 28442966
TotalDays         : 3,2920099537037E-05
TotalHours        : 0,000790082388888889
TotalMinutes      : 0,0474049433333333
TotalSeconds      : 2,8442966
TotalMilliseconds : 2844,2966

Beim letzten googlen kam irgendwie nichts brauchbares raus (wahrscheinlich hatte ich die falschen Keywords). Heute war’s wieder so lästig, dass ich einen neuen Versuch unternommen habe und siehe da: diesmal hatte ich Glück. Als Schuldige wurde von Mehreren die MySQL- und die cURL-Extension genannt. Da ich MySQL auf jeden Fall für meine Unittests brauche, habe ich erstmal nur die cURL-Extension deaktiviert, mit durchschlagendem Erfolg:

PS C:\> measure-command { php -v }
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 48
Ticks             : 485263
TotalDays         : 5,61646990740741E-07
TotalHours        : 1,34795277777778E-05
TotalMinutes      : 0,000808771666666667
TotalSeconds      : 0,0485263
TotalMilliseconds : 48,5263

Statt 2,85 Sekunden braucht PHP auf einmal nur noch 0,05 Sekunden um die Version auszugeben. Das ist ein Unterschied von Faktor 57! So, jetzt kann ich entspannt weiterarbeiten :)

PHP Konsole für Eclipse

Um kurz mal etwas auszuprobieren ist es manchmal praktisch eine interaktive PHP Konsole direkt in der IDE zu haben. Dies kann man bei installiertem CLI PHP schnell und problemlos in Eclipse als “External Tool” einbauen:

Page optimized by WP Minify WordPress Plugin