Installation Lighttpd mit PHP-FPM und MySQL

Lighttpd a.k.a. Lighty ist die schlanke Variante eines Webservers. Er hält sich mit Loggings zurück und verzichtet auf nützliche aber performance-killende Gimmicks wie das Parsen von .htaccess-Dateien usw.
Dadurch ist er gerade für umfangreiche Webauftritte die ideale Lösung.

Diese Anleitung zeigt am Beispiel eines Ubuntu 12.04-Servers, wie man den Lighty installiert, konfiguriert und mit den nötigen Modulen wie PHP-FPM, Rewrite-Funktionen und MySQL-Unterstützung versieht.

Weiterlesen»

Eclipse kann Update-Sites nicht erreichen

Wer – wie ich und viele andere – auf Eclipse als Entwicklungs-IDE setzt, wird früher oder später auch auf die Tücken und kleinen Stolperfallen der Freeware-Lösung stoßen.

Eine davon – wenn man Google und verschiedenen Foren glaub darf – ist schon mehrfach aufgetreten, auf die richtige Lösung zu stoßen ist jedoch Glückssache. Es geht darum, über Eclipse weitere Plugins wie bspw. Subversion oder auch die PHP Development-Tools nachzuinstallieren. Gerade bei DualStack-Arbeitsrechnern – also denen, die sowohl via IPv4 als auch IPv6 angebunden sind – funktioniert das nicht ohne weiteres. Eclipse wird den Dienst mit der Fehlermeldung

Unable to read repository at http://subclipse.tigris.org/update_1.8.x/content.xml.
Unable to read repository at http://subclipse.tigris.org/update_1.8.x/content.xml.
Connection reset

verweigern. Ganz offensichtlich hat Eclipse und/oder Java hier ein Problem, eine stabile Verbindung hinzubekommen. Die Lösung ist einfach – wenn man sie kennt, nämlich des festlegen der Verbindung über IPv4. Dies realisiert man über einen Eintrag in der eclipse.ini im Eclipse-Verzeichnis:

-Djava.net.preferIPv4Stack=true

Wichtig: Es gibt Quellen, die diesen Eintrag als „-Djava.net.preferIPv4Stack = true“ angeben. Das ist FALSCH, die Leerzeichen vor und/oder nach dem Gleichheitszeichen machen diesen Parameter ungültig und damit wirkungslos. Es ist EIN EINZIGER Parameter, der als ein kompletter String weitergegeben werden muss.

Danach einen gegebenenfalls vorhandenen Cache in

<Eclipse-Pfad>\p2\org.eclipse.equinox.p2.repository\

löschen und Eclipse neustarten. Über „Help“ -> „Install New Software“ kann man nun wie gewohnt Eclipse-Repositories und Update Sites pflegen und abrufen.

PHP array_merge_recursive() + realurl „fixedPostVars“

Einige Zeit hat es mich heute gekostet, um festzustellen, warum meine Erweiterung der realurl-Konfiguration via Hook zur Autoconfiguration fehlerhaft in der Konfiguration ankommt. Ursache ist ein Fehlverhalten der PHP-Funktion array_merge_recursive().

array_merge_recursive()

Zunächst, die Beschreibung der Funktion aus der Dokumentation:

array_merge_recursive() merges the elements of one or more arrays together so that the values of one are appended to the end of the previous one. It returns the resulting array.

If the input arrays have the same string keys, then the values for these keys are merged together into an array, and this is done recursively, so that if one of the values is an array itself, the function will merge it with a corresponding entry in another array too. If, however, the arrays have the same numeric key, the later value will not overwrite the original value, but will be appended.

Beachtenswert ist hier der letzte Satz, insbesondere „same numeric key“ und „same numeric key“.

Was ist hier so seltsam bzw. fehlerhaft?
Weiterlesen»

mySQL und die Zeit

Oft wurstelt man bei der Entwicklung mit UNIX-Timestamps für Zeitangaben herum. Das ist kein Hexenwerk, aber direkt das Gelbe vom Ei ist es auch nicht. Speziell zur Implementierung von Zeit- und Datums-Filtern benötigt dieser Lösungsansatz eine Menge Logik, die in PHP gegossen werden muss (Schaltjahre, Schaltsekunden, …). Das Herumrechnen damit ist mühsam und sorgt oft für Knöten im Hirn.

Dies kann man wesentlich einfacher haben. mySQL kommt mit einer großen Vielfalt von Datums- und Zeitfunktionen daher, derer man sich wunderbar bedienen kann. Wenn man sich zum Beispiel die Funktion

TIMESTAMPADD()

ansieht, wird man schnell merken, dass diese Funktionen das Entwicklerleben erheblich vereinfachen können. Musste man früher mühsam herumrechnen, um bspw. ein Jahr zu einem gegebenen Datum hinzuzuaddieren, funktioniert das mit

SELECT TIMESTAMPADD(YEAR,1,'2012-01-03')

völlig problemlos – und das Beste: Schaltjahre, -Sekunden und dergleichen sind schon drin. Ein anderes Beispiel: Oft sollen Daten im Monatsraster dargestellt werden. Mit PHP mühsam, mit mySQL eine etwas ausführlichere WHERE-Klausel:

[...] WHERE `date`>SELECT TIMESTAMPADD(day,1,LAST_DAY(TIMESTAMPADD(month, -1, NOW()))) AND `date`<=LAST_DAY(NOW()) [...]

Dieser Where-Klausel liefert alle Datensätze, die im aktuellen Monat liegen, mit einigen Handgriffen kann man sie so erweitern, dass allein ein übergebener Parameter wie bspw. die Angabe, der wievielte Monat vor dem aktuelle angezeigt werden soll, die Filterung schon komplett macht.

Sollte doch einmal – aus welchen Gründen auch immer – der UNIX-Timestamp nötig sein, kann man sich diesen für ein beliebiges Datum mittels der Funktion

UNIX_TIMESTAMP()

zurückgeben lassen. Will man auch so nette Gimmicks wie bspw.

DATE_FORMAT()

nutzen, ist es sinnvoll, vorher die Systemvariable für die Darstellung von Monats- und Tagnamen über

SET SESSION lc_time_names=de_DE

entsprechend zu definieren. Auf diese Weise kann man sich den Unwägbarkeiten der PHP-Datumsfunktionen einfach und nachhaltig entziehen.

Viele weitere Funktionen und genauere Infos kann man der mySQL-Dokumentation entnehmen.

Magento: Bruttowert für kostenlosen Versand / Tablerates

In Magento kann man per Tablerates einstellen, dass ab einer bestimmten Zwischensumme (Warenkorb) der Versand kostenlos ist. Das Problem hierbei ist aber, dass Magento vom Nettobetrag des Warenkorbes ausgeht, und nicht vom Bruttobetrag. Wenn man also in den Tablerates ‚Versandkostenfrei ab 50 Euro‘ einstellt, ist der Versand tatsächlich erst ab 59,50 Euro kostenlos.

Mit ein paar Zeilen kann man dies aber umgehen.

Zuerst kopiert man die Datei app/code/core/Mage/Shipping/Model/Carrier/Tablerate.php nach app/code/local/Mage/Shipping/Model/Carrier/Tablerate.php

Somit wird der neue Code bei einem Magento-Update nicht überschrieben.

In diese Datei schreibt man nun zwischen dem Block ‚// exclude Virtual products price from Package value if pre-configured‘ und ‚// Free shipping by qty‘ in ca. Zeile 77 folgenden Code:

//NEU Versandkostenfrei ab xx Euro NETTO
if (Mage::helper('tax')->priceIncludesTax()) {
   foreach ($request->getAllItems() as $item) {
      $request->setPackageValue($request->getPackageValue() + $item->getTaxAmount());
   }
}

Der Aufbau der tablerates.csv sieht dabei wie folgt aus:

"Land","Region","Postleitzahl","Zwischensumme (und mehr)","Versandpreis"
*,*,*,50.0000,0.0000
*,*,*,0.0000,4.9000