Hier der Link zu PHPBench. Benchmarks für PHP Funktionen.
PHPBench – PHP auf dem Prüfstand
20. November 2009 von sägefischDebugging mit XDebug und KCachegrind
15. November 2009 von sägefischXDebug ist das sehr beliebte und allseits bewährte Tool, das nicht nur Stacktrace und var_dumps ausgeben kann, sondern ebenso für CodeCoverage, echtes Debuggen, Profiling und Testen mit PHPUnit gedacht ist.
XDebug kann Profiler Dateien erzeugen, die man mit KCacheGrind perfekt auswerten kann. So bleibt kein Flaschenhals in der Applikation unbemerkt.
SVN-Befehle für Zwischendurch
10. November 2009 von grasteEin paar kleine SVN-Befehle und One-liner für den Alltag:
Alle Beitragenden eines Repositories anzeigen lassen (sortiert nach Anzahl der Änderungen):
svn log -q | awk '/^r/ {print $3}' | sort | uniq -c | sort -rn
Alle Änderungen zwischen der aktuellen Arbeitskopie und der Head-Version anzeigen lassen. Sollte im Normalfall auch anzeigen, wer den Build kaputt gespielt hat. ;)
svn log -r BASE:HEAD
History eines Zweiges ausgehend vom Verzweigungspunkt anzeigen lassen:
svn log --stop-on-copy
Alle Änderungen innerhalb eines Zeitraums ausgeben lassen:
svn di -r{2009-10-23}:{2009-11-28}
ALLE Änderungen der lokalen Arbeitskopie rückgängig machen:
svn revert -R .
SVN-Informationen als XML ausgeben lassen, um einfacher Infos für Analysen und Statistiken zu erhalten/zu parsen:
svn log --xml
Noch was für Leute, die keine Angst vor’m Löschen von Externals haben: Alle Dateien, die mit ? gekennzeichnet sind (bei SVN-Status) einfach mal löschen:
svn st | grep ^\? | awk '{print $2}' | xargs rm
Und hier noch ein Befehl um alle neuen Dateien zum Repository hinzuzufügen
svn st|grep ^?|sed s/?//|xargs svn add $1
Eigene Configs in Agavi nutzen
10. November 2009 von grasteFür diverse Aufgaben in größeren Projekten ist es notwendig, eigene XML-Konfigurationsdateien zu nutzen. Die Definition umfangreicher Einstellungen in der settings.xml wird schnell anstrengend und das Holen der Werte per AgaviConfig::get('setting.name', 'default'); unübersichtlich. Agavi bietet es aber an, eigene Konfigurationsdateien zu erstellen und diese nicht nur zu validieren, sondern auch zur Wiederverwendung zu cachen.
In der Agavi FAQ habe ich dazu mal ein Beispiel verfasst.
Einfach einen Config-Handler in der config_handlers.xml definieren:
<handler pattern="%core.config_dir%/project/foo/*.xml" class="AgaviReturnArrayConfigHandler" />
und dann direkt in den Actions, Views und Models benutzen:
if (!isset($config['baz']))
{
throw new LogicException('baz is missing!');
}
if (isset($config['bars']))
{
foreach ($config['bars'] as $foo => $data)
{
$this->doSomethingWithEach($foo, $data);
}
}
Die XML-Datei für den obigen Code könnte beispielweise so aussehen:
<ae:configurations>
<ae:configuration>
<baz>asdf</baz>
<foo>-1</foo>
<bars>
<some>...more data and xml...</some>
<more>...more data and xml...</more>
<deep>...more data and xml...</deep>
<structs>...more data and xml...</structs>
</bars>
</ae:configuration>
<ae:configuration environment="production.*">
<baz>bleh</baz>
<foo>1</foo>
</ae:configuration>
</ae:configurations>
Gut zu erkennen ist der Vorteil eigener Configs: Man kann die Agavi-Features für Konfigurationsdateien nutzen und auf einfache Art und Weise environmentspezifische Einstellungen vornehmen (z.B. in “Production” andere Werte für Logdateien, URLs oder Einstellungen nutzen als während der Entwicklung oder beim Testen).
Ebenfalls gut zu erkennen im PHP-Code ist, dass man lauter Abfragen über die Existenz bestimmer Elemente macht, die man sich mit vernünftiger Validierung sparen kann, da invalide XML-Dokumente gar nicht erst als korrekt angesehen werden von Agavi. Um seine XML-Strukturen zu validieren definiert man per validation Parameter ein XML-Schema und definiert noch gleich einen eigenen ConfigHandler, den man schreibt und per autoload.xml bekannt macht:
<handler pattern="%core.config_dir%/project/foo/*.foo.xml" class="FooDefinitionConfigHandler">
<validation>%core.config_dir%/xsd/foo_definition.xsd</validation/>
</handler>
Der ConfigHandler könnte so beginnen:
class FooDefinitionConfigHandler extends AgaviXmlConfigHandler
{
// notwendige Methoden implementieren und XML-Struktur validieren...
}
Für Beispiele einfach in die in Agavi verwendeten XSDs und entsprechende ConfigHandler sehen. Viel Spaß. :)
Nachfolgende Slashes mit mod_rewrite entfernen?
04. November 2009 von endorfinMit diesem kleine Eintrag werden URLs mit einem Slash am Ende auf die gleiche URL ohne Slash am Ende geleitet. In meiner Rails Anwendung verursachten URLs mit einem Slash am Ende einen 403 – Forbidden.
RewriteEngine On RewriteRule ^(.+)/$ $1 [R=301,L]

















