Categories
Programmierung

1,2 Sekunden (eine Ewigkeit)

Bei mir jetzt auch ein Artikel über Profiling. Soeben erlebt: Eine relativ kleine Webseite mit eigenem ollen CMS brauchte relativ lange (1,25 Sekunden) um eine Seite zu generieren. Zunächst die Datenbankabfragen angeschaut – nichts schlimmes gefunden. Also schnell den (proprietären) Profiler angeschmissen. Es zeigte sich folgendes Bild:

1,2 Sekunden? Arg viel. Ein Blick in die betreffende Zeile:

$string = strtr($string, $replace);

Hmm, da scheint strtr wohl nicht so performant zu sein. Noch nett ausgedrückt. Ausweichcode ausprobiert:

foreach ($replace as $key => $value) {
       $string = str_replace($key, $value, $string);
}

Dauert jetzt 12ms. Unglaublich.

Links
http://www.cznp.com/blog/3/strtr-vs-str_replace-a-battle-for-speed-and-dignity
http://www.simplemachines.org/community/index.php?topic=175031.0

Categories
Linux Storage

PHP APC Cache: GUI und Sicherheit

apc-guiGerade habe ich im PECL-Paket eine nette GUI für den APC-Cache gefunden. Es zeigt sehr anschaulich die Auslastung des Caches. Aus dem PECL-Paket wird dafür nur die apc.php in ein erreichbares Verzeichnis gelegt. Standardmäßig zeigt es die Cache-Auslastung des aktuellen virtuellen Hostings. Im Kopf der Datei lassen sich aber verschiedene Authentifizierungs-Optionen einstellen, sodass man z.B. einem User “admin” die Cache-Hits aller Seiten auf dem Server zeigen kann.

Generell sei bemerkt, dass der APC-Cache immer global agiert. Dies ist auch durchaus sinnvoll – nur so spielt APC sein Potential voll aus. Jedoch sind die Statistikvariablen für jedes PHP-Script auf dem Server auswertbar (so auch für das apc.php Script). Betreiber von Shared-Hosting Systemen sollten sich im Klaren darüber sein, dass so z.B. die Pfade von häufig verwendeten Dateien für jeden Hosting-User abrufbar sind. Soweit ich die Konfiguration bisher interpretiere, lässt sich auch durch jeden User per PHP-Script der gesamte Cache resetten…

Categories
Linux

PHP APC Caching (Centos)

Gerd hat auch schon darüber geschrieben. Da viele professionelle PHP-Anwendungen sowieso auf Caching setzen habe ich bisher keine Notwendigkeit gesehen den APC-Cache mal auszuprobieren. Da ein Server in letzter Zeit besonders hohe Load hat, habe ich den APC-Cache jetzt doch mal ausprobiert.

Nach einem ersten, subjektiven Test muss ich sagen, dass der Leistungssprung wirklich erstaunlich ist. Ich habe den Eindruck, dass auch Typo3-Seiten (trotz eingebautem Caching) spürbar schneller und flüssiger laufen. Beim Blick auf den Graphen für die CPU-Load würde ich vorsichtig mal von 1/3 weniger Load ausgehen. Letztendlich ist der Leistungssprung durchaus logisch: Es wird nicht nur (wie sonst) lediglich die Ausgabe gecached sondern auch der kompilierte PHP-Code.

apc-small

Categories
Linux

PHP mail() überwachen

Update: take a look here.

Es ist nicht ungewöhnlich, dass Shared-Hosting-Systeme irgendwann zum Spamversand mißbraucht werden. Ist ein schlampig programmiertes PHP-Script Schuld, ist dies aber nur relativ schwer zu Identifizieren. In den versendeten Mails bzw. in der Mail-Queue finden sich meist keine Hinweise darauf welches Script verantwortlich ist.

Categories
Linux

PHP: $_ENV leer

Wenn man mit PHP-Scripten auf der Kommandozeile arbeitet, kann man normalerweise über das globale $_ENV Array auf die Umgebungsvariablen zufreifen.

Jedoch bietet längst nicht jede PHP-Distribution die gleichen Voraussetzungen. Ist in der php.ini z.B.

variables_order = "GPCS" # (GET, POST, COOKIE, SESSION)

gesetzt (ohne “E”), wird das $_ENV Array nicht befüllt. Folgende Einstellung füllt das $_ENV Array wieder entsprechend:

variables_order = "EGPCS" # (ENV, GET, POST, COOKIE, SESSION)

Für die Verwendung von PHP in Verbindung mit Webservern ist die Standardeinstellung (bei manchen Distributionen) sicherlich nicht ganz falsch: Die Einstellung verhindert dann, dass sämtliche Umgebungsvariablen jedem PHP-Script zum Auslesen zur Verfügung stehen. Daher ist es sinnvoll, PHP für die Kommandozeile eine eigene php.ini mitzugeben:

php -c /etc/php.ini_cli script.php

Debian hat von vornherein eine eigene php.ini (in /etc/php5/cli/php.ini)  für das CLI (sehr vorbildlich).