Alles rund um Magento!

Archive 2011

Vorsicht bei der Verwendung von isset() mit Arrays

Manchmal sucht man Fehler, die man wieder und wieder überliest, weil man die falschen Annahmen getroffen hat und der Code oberflächlich richtig aussieht. Erfahrungsgemäß gibt es dann ein paar “übliche Verdächtige”, die man sich genauer anschaut. Zuweisungen im if-Statement, Vergleiche ohne Typprüfung, empty() und isset() sind dabei immer heiße Kandidaten.

Wenn man die Handbuch-Seite zu isset() durchliest, klingt es, als wäre es problemlos möglich auch die Existenz von Array-Keys zu prüfen. Sogar ein schönes Beispiel gibt es dazu:

< ?php
 
$a = array ('test' => 1, 'hello' => NULL, 'pie' => array('a' => 'apple'));
 
var_dump(isset($a['test']));            // TRUE
var_dump(isset($a['foo']));             // FALSE
var_dump(isset($a['hello']));           // FALSE
 
// The key 'hello' equals NULL so is considered unset
// If you want to check for NULL key values then try: 
var_dump(array_key_exists('hello', $a)); // TRUE
 
// Checking deeper array values
var_dump(isset($a['pie']['a']));        // TRUE
var_dump(isset($a['pie']['b']));        // FALSE
var_dump(isset($a['cake']['a']['b']));  // FALSE
 
?>

Doch ganz so einfach ist es leider nicht.

weiterlesen »

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#"

Der Guru ist zurück

Nicht nur Virtualbox kennt den Guru, sondern auch bei Valve scheint er bekannt zu sein:

New is always better – Google passt Suchalgorithmus an

“New is always better – it’s a rule”, bekannte Serienheld Barney Stinson, als er wieder einmal seine Abneigung gegenüber der Monogamie begründen wollte. Doch diese Aussage scheint auch bei den Entwicklern im Hause Google angekommen zu sein, denn diese haben mal wieder den Suchalgorithmus der weltweit wichtigsten Suchmaschine angepasst und wollen diesmal vor allem aktuellere Ergebnisse in den Vordergrund stellen.

Im hauseigenen Blog erklären die Entwickler, dass diese Änderung sowohl Seiten über aktuelle als auch wiederkehrende Ereignisse wie beispielsweise die olympischen Spiele betrifft. Die Idee dahinter: Sucht jemand im Mai 2012 nach dem Begriff „Olympische Spiele“, so sollen dem User nicht die Auflistung der Leichtathletik-Medaillengewinner von 1956, sondern möglichst viele Informationen zu den Spielen 2012 in London als Ergebnisse weit oben in den SERPs präsentiert werden.

Betroffen werden vor allem viele alte Foreneinträge sein. Jedem ist es sicherlich schon einmal passiert, dass er bei einer Suche zu einem aktuellen Software-Problem zunächst Forendiskussionen aus dem Jahr 2003 zu Gesicht bekam, deren Lösungsansätze in der schnelllebigen IT-Welt natürlich mittlerweile unbrauchbar waren. Dies soll nun der Vergangenheit angehören.

Nach dem vor allem auf relevante und userfreundliche Inhalte abzielenden Panda-Updates, hat sich Google nur also dem Problemfeld „Aktualität“ angenommen. Das besondere: Die Google-Entwickler schätzen, dass 35% aller Suchanfragen betroffen sein werden. Eine deutlich höhere Anzahl als bei Panda.

Für Webseiteninhaber und Betreibern von Online Shops heißt dies nun, ebenfalls verstärkt auf neue Inhalte zu setzen. Ideal eignen sich dafür integrierte Blogs oder News-Ticker, die aktuelle und relevante Ereignisse oder Aktionen rund um die Webpräsenz behandeln und Google zeigen, dass auf diesen Seiten neue Inhalte zu finden sind. In Magento-Shops ist die Einbindung solcher Features relativ einfach möglich, wird allerdings bisher erst in wenigen Fällen genutzt. Auch der dynamische Bereich von Social Media wird dadurch weiter gefördert werden, denn es ist zu vermuten, dass Google auch diesen Faktor in seine Aktualitätsberechnungen berücksichtigen wird. In Kombination werden Social Media und aktuelle Inhalte sicher eine große Rolle unter den von Google berücksichtigten Ranking-Faktoren einnehmen und sollten deshalb auch verstärkt gepusht werden.

Magento Fatal error: Call to undefined method Mage_Core_Model_Config_Element::getName()

Fatal error: Call to undefined method Mage_Core_Model_Config_Element::getName() in …/lib/Varien/Simplexml/Element.php on line 390

Das Problem ist warscheinlich eine veraltete PHP-Version. In dem aktuellen Fall ist Magento 1.4.0.1 im Einsatz. Magento setzt die Funktion SimpleXMLElement::getName vorraus, welche erst seit (PHP 5 >= 5.1.3) implementiert ist.
Die Lösung bei einem “Shared Host” wäre eine nette Mail an den Support mit der Bitte um Umstellung auf die aktuelle Version. Ein Wunder das Magento überhaupt läuft.

 

Magento-Module – goldenes Kalb oder die Büchse der Pandora?

Eines der größten Argumente für Open-Source-Systeme wie Magento sind verfügbare Module, welche die Funktionalität des Grundsystems um Lösungen für wiederkehrende Aufgabenstellungen erweitern. Magento bietet auf seiner Plattform Connect sowohl unentgeltliche als auch kostenpflichtige Module an. Das Installieren wird dem Shop-Betreiber durch den Magento Connect Manager auch sehr einfach gemacht, ein neues Modul ist in Nullkommanichts installiert und vollführt von nun an seinen Dienst. Doch gerade die mit der geringen Komplexität einhergehende niedrige Hemmschwelle beim Integrieren neuer Module kann zu großen Problemen führen. Die meisten Betreiber von Magento-Online-Shops gehen mit der Installation von Modulen deutlich zu unkritisch, teilweise naiv um und sollten die Extensions deutlich häufiger hinterfragen. Die Liste der Problematiken, die durch Module heraufbeschworen werden können, ist relativ lang:

weiterlesen »

IPC 2011 – Tag 3

Heute morgen gab es keine Keynote zu verpassen, daher starteten wir direkt mit der Aufforderung von Kore Nordmann und Tobias Schlitt (Qafoo) “Make your project SOLID!”. Die beiden stellten die von Martin C. Fowler (Uncle Bob) geprägten SOLID-Prinzipien vor. Wer Clean Code gelesen hat und sich bereits mit Clean Code Development beschäftigt hat, dürfte wenig Neues erfahren haben. Für alle anderen eine gute Zusammenfassung und Einführung in das Thema.

weiterlesen »

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 »

VirtualBox Guru Meditation

Wenn der VirtualBox Guru mal meditiert…

VirtualBox Guru Meditation

VirtualBox Guru Meditation

… heißt das, dass die VM abgestürzt ist. Schön, dass diese Fehlermeldung schon so alt ist und eine Tradition hat, das sie sogar einen eigenen Wikipedia-Artikel hat.

« Vorherige Einträge

Page optimized by WP Minify WordPress Plugin