Profilling ist wichtig. Das klassische Rausschreiben von microtime()-Werten ist nicht wirklich verlässlich, gerade wenn das Bootstraping und die Class-Loader teilweise vorher laufen. Da bei meinem Framework die Verbesserungen in der Performance zwar immer ein wenig was brachten, aber der Rest immer noch länger dauerte als der Code vermuten lies, habe ich mal xdebug aktiviert.
xdebug.profiler_enable=1
xdebug.profiler_output_dir=C:/test/profile
Mit WinCacheGrind dann die dort erzeugte Datei nach einem Seiten-Aufruf analysiert. Es gab wirklich einen Fehler im Class-Loader der dafür sorgte, dass das system/classes/ Verzeichnis immer wieder gelesen wurde, wenn nur die Klasse noch nicht eingebunden war, aber schon der Pfad dorthin bekannt war. Dateizugriffe kosten extrem und selbst mit den PHP internen Caches sollte man so wenige wie möglich verwenden. Übersetzungsdateien werden nun in der Session gecached. Das Einlesen war auch sehr aufwendig.
Ein dummy User-Objekt versuchte, die eigenen UserGroups zu laden. Da die Id aber 0 war kam natürlich nie ein Ergebnis aus der DB, aber der Overhead wurde erzeugt. Also eine Prüfung auf id==0 und schon lief alles besser.
Meine Grundregeln sind jetzt:
* wenige Zugriffe auf das Dateizugriff
* Caching von Daten
* unnötige DB-Connections verhindern
* Objekte instanziieren kostet viel, wenn möglich SingleTons für DAOs und ToolKits verwenden
* nur laden was man braucht
* ob JSON oder XML ist am Ende nicht so wichtig, solange die Dateien keine unnötigen Daten enthalten (schnell Parsen und Cachen)
* Profilling ist wichtig und sollte man immer mal wieder machen (auch ohne konkreten Anlass)
* Das Bootstraping des Frameworks/der Anwendung muss schnell sein, der Rest liegt in der Hand des Entwicklers und er sollte so entwickeln können, also würde das Framework keine Zeit benötigen (er soll sich auf seinen Code konzentieren können)
Wichtig bei der oben gezeigten Config in der php.ini ist, dass dasVerzeichnis shon exisieren muss,da xdebug es nicht von sich auch anlegen würde.
Das Zendframework zu installieren sieht erstmal komplexer aus als es ist. Hier wird es gut erklärt. Wenn man mit dem WAMP-Paket von Bitnami das Framework mit installiert hat, findet man es unter frameworks/zendframework
Darin legt man sich die Datei install.bat an:
../../php/php.exe composer.phar self-update
../../php/php.exe composer.phar install
starten.
Wenn man sich jetzt den Stress mit dem VirtualHost nicht machen will.. oder wir bei mir wo es einfach nicht so recht klappen wollte... kopiert man sich das Verzeichnis einfach in apache2/htdocs.
Wenn es mit dem VirtualHost nicht klappt, darauf achten dass der include der VirtualHost-Datei aus extra nicht auskommentiert ist.
Ausser dem:
Require all granted
Anstelle von
Order allow,deny
Allow from all
Dann sollte es auch klappen. Ansonsten dem hier folgen.
Ich versteh nicht warum so viele Personen Passwörter so negativ gegenüber darstehen. Passwörter sind wichtig und schützen einen. Aber es sind oft auch die Menschen, die das Internet grund sätzlich als unsicher ansehen und glauben jeder könnte jetzt alles von denen sehen. Aber in Firmen sollte es den meisten schon klar sein, dass man sich damit nicht nur selber schützt sondern auch seine Kunden. Also Datenschutz und so.
Windows 7 hat ein Problem. Man muss das Admin-Konto per Hand aktivieren:
net user administrator * /active:yes
Ideal wäre es, wenn man ein admin-Konto und ein normales Konto anlegen müsste. Das automatische Einloggen, sollte nur mit Konten gehen die keine
Admin-REchte haben und man sollte dann das Passwort für das Konto auch nur über eine Admin-Konto setzen dürfen. Nachdem ich erlebt hat wie eine Person 5 Rechner lahm legen konnte, nur weil dort plötzlich ein Passwort gesetzt wurde, sehe ich es als noch dringender an, auch alles über einen Server laufen zu lassen. Denn dann hätte man dort einfach das Passwort nochmals neu gesetzt und alles wäre wieder ok gewesen. Aber sowas kostet ja und viele kleinere Firmen sparen sich das Geld lieber, was man Ende dann bedeutet, dass jemand wie ich Geld damit verdient, Festplatten an USB-Adater zu hängen udn Daten zu kopieren.. da wäre ein Server nach 5 Rechnern schon fast günstiger gwesen, wenn man noch den Arbeitsausfall der Mitarbeiter dazu rechnet.
Ich habe lange Zeit mit PHPclipse in einem Eclipse 3.2 mein PHP entwickelt und bin dann mit Eclipse Luna doch irgendwie mal auf die Idee gekommen jetzt PDT verwenden zu können. PHPclipse nutzte eine Code-Vervollständigung, die einfach alle Methoden aller Klassen kannte und dann diese auch präsentierte und man mußte eben darauf achten dass man die Methode der richtigen Klasse hatte.
PDT bekam es nur selten hin einen Methoden anzu bieten. Nun habe ich heraus gefunden, dass PDT auch ganz anders arbeitet und extrem gut mit Annotations zusammenarbeit.
Wenn man mit den Annotations arbeitet ist das Entwickeln an sich genau so gut wie bei Java.
/**
* @param number $index
* @return XWBlogMedia
*/
public function getMedia($index){
return $this->list->get($index);
}
Um Java-Anwendungen schnell zu bekommen, habe ich schon viel gelernt. Das meiste basiert darauf möglichst viel Caching zu verwenden, andere Serialisierungen (die default Serialisierung von Java ist wirklich extrem langsam), Reflections richtig zu verwenden (method.setAccessible(true)) und am Ende eigentlich so wenig neue Objekte wie möglich zu erzeugen.
Das alles ist toll, aber man muss immer daran denken, dass Datebank- und Dateizugriffe immer sehr aufwenig sind. Dafür gibt es dann Connection-Pooling und NIO.
Bei PHP ist es an sich sehr ähnlich. Nur hat man hier das Problem, dass man keinen Application-Scope hat und somit alles auch mindestes für jeden Benutzer machen muss, um es dann in der Sesion zwischen zu speichern, was am Ende wieder Serialiserung bedeutet.
Mit Aoop habe ich viel über Performance gelernt in einem Framework auf PHP gelernt. Dateizugriffe sind
das schlimmste! SingleTon-Beans helfen um global zu vermeiden oder dass man einige Dinge mehrfach durchführen muss.
Was erstaunlich schnell ist, ist die Datenbank. Natürlich abhängig von den Daten, Struckturen und Queries. In Java wird immer gesagt, man solle ORMs verwenden und dann bei Schulungen zum Thema Performance lernt man die Constructor-Queries kennen und lernt wie man mit nativen SQL arbeitet. In PHP habe ich bis jetzt nur natives SQL verwendet und kann sagen, dass selbst ohne Connection-Pooling, es oft schneller ist als ORMs/JPA in Java.
Aber Connection-Pooling mit PHP wäre echt toll. ES geht.. über Umwege. Vor ein paar Jahren hatte ich mal mit Java-Bridge herum experimentiert und da war es dann auch relative einfach (da man eben Java aus PHP heraus aufrufen kann) auf JDBC zuzugreifen oder eben auch auf das JNDI und dich dort eine DataSource vom Tomcat zu holen. Mit Quercus habe ich hier noch nicht weiter getestet, aber ich gehe mal davon aus, dass man hier sehr viel mehr Performance bekommen kann. Quercus an sich soll schnell sein und mit Connection-Pooling und NIO sollten sich Anwortzeiten und Laufzeiten stark reduzieren lassen.
Vor ein paar Tagen bin ich auf ein seltsames "Problem" gestossen. Vieleicht lag es auch an was anderen aber es hat mich irritiert.
$pattern="";
$pattern=substr($result,$from,$len);
Das obere war immer schneller als wenn ich den Substring direkt zugewiesen habe ohne die Varibale vorher zu initialisieren.
$pattern=substr($result,$from,$len);
Das finde ich seht seltsam. Entweder greift hier die dynamische Typisierung ein... oder.. keine Ahnug.. aber ich werde mal weiter nachforschen.
Auch die moderneren MySQL-Funktionen werde ich mal durch testen. Hier köntne sich auch was getan haben.
Am Ende wäre es aber natürlich toll zu sehen was PHP7 oder die HHVM bringen würden. Wenn sie halten was sie versprechen würde für Lösungen wie Java-Bridge oder Quercus nur noch das Connection-Pooling bei Datenbank-Abfragen sprechen.