PDA

Vollständige Version anzeigen : Zend sehr langsam


hans47
17.03.2009, 19:55
Hallo,

habe mir ein aktuelles Zend, Quickstart und Xampp auf meinem Win Rechner installiert.

Allerdings braucht eine Anzeige einer Seite jedesmal ca. 0.5-1s .

Meine andere Scripte (auch mit rewrite Rules/DB Abfragen, usw) laufen sehr schnell, nur Zend nicht.

Was könnte das Problem sein?

Gruß
h.

KingCrunch
18.03.2009, 00:25
Was könnte das Problem sein?Dein Rechner?
Speicher, CPU, ....

hans47
18.03.2009, 00:43
Pentium 4, 1.5 GB Ram, Win XP Home, Win Amp, Aktuelles Zend.

Ich habe aber gleichzeitig hier Shopsysteme (XT Commerce) und vieles mehr am Laufen ohne Probleme.

KingCrunch
18.03.2009, 00:58
Ich habe aber gleichzeitig hier Shopsysteme (XT Commerce) und vieles mehr am Laufen ohne Probleme.?
Wirklich repräsentativ find ich das net. Ein P4 mit 1,5GB RAM ist schon arg bemessen.

Ein kleines Beispiel, wieso solche Benchmarks nur bedingt Aussagekraft haben. Nehmen wir an ein System hat effektiv 500MB RAM frei. Anwendung A nutzt 490MB und fühlt sich benutzbar an. Anwendung B wirkt aber sehr träge und nutzt 510MB RAM. Warum ist B nun träge? Weil das OS fleissig einiges an Kram in den Auslagerungsspeicher schaufelt (und wieder zurück), B muss darauf immer warten.

Nebenbei laufen noch mindestens ein Webserver und MySQL bei dir mit, vermutlich noch Virenscanner. OnDemand-Scanner wirken sich bei vielen Dateien natürlich auch negativ aus. Eventuell gibs dann noch ein Messenger, Mailprogramm, ...

Kannst mit Bordmitteln mal testen, wie sich das ZF nun wirklich effektiv auswirkt. Einmal gibts da den Windows-Taskmanager, der zB kurzzeitig Einblick in die Prozessorlast bietet. PHP selbst liefert dann ein paar Methoden [1][2], mit den der Speicherbedarf abgeschätzt werden kann.

[1] http://de3.php.net/memory_get_usage
[2] http://de3.php.net/manual/en/function.memory-get-peak-usage.php

robo47
18.03.2009, 02:04
Als ich noch mit Windows unterwegs war und nen fertigen xampp benutzt habe musste ich auch feststellen, dass das ZF unter Windows recht langsam lief, APC zu aktivieren hat da einiges gebracht wie ich finde, allerdings unter Linux läuft das ganze jetzt allerdings noch ein gutes Stück schneller.

DennisBecker
18.03.2009, 08:26
Also ich hab mir den "Luxux" geleistet, meine Entwicklung auf 2 Rechnern machen: WinXP zum entwickeln und Ubuntu Server 8.10 mit Zend Server um das Projekt laufen zu lassen. Aber selbst mit XAMPP auf meinem WinXP Rechner läuft das ZF schnell. Hier mal ein paar Eckdaten zu Hardware und gleichzeitig laufender Software:

AMD Athlon64 3700+
2x512 MB DDR RAM
250 GB Platte (2 Partitionenen, 1. Partition mit WinXP, 2. Partition mit XAMPP)
160 GB Platte (diverse Daten wie Musik, Spiele usw.)

WinXP SP3 (abgespeckt mit nLite - vielleicht liegt hier der Teufel im Detail?)
Avast Virenscanner
Zend Studio for Eclipse
Winamp
Goole Chrome
Firefox 3.x
Miranda
Dienste von "iTunes"
diverse Prozesse von Treibern

Kann mir eigentlich schlecht vorstellen, dass das so langsam sein soll. Meine ZF Applikation hatte MVC, ca. 10 verschiedene Routen (keine default Route), und hat dann im Controller eine XML-Import-Komponente aufgerufen und eine XML Datei ausgewertet und der Seitenaufbau war bei 0,2 Sekunden!

Der Linux Rechner war vor ein paar Monaten noch mit Debian Lenny ausgestattet, da hatte ich dann ganz normal mit Apache2, MySQL, PHP5 (kein Byte-Code-Cache) programmiert und da war das ganze ähnlich schnell auf einem P4 3GHz, 768 MB RAM und einer alten 80 GB Festplatte. Der Grund warum ich auf einem Linux Rechner "entwickle" ist eigentlich recht einfach: ich will die mögliche spätere Live-Umgebung so gut wie möglich nachbilden (aktuell hab ich keine Live-Umgebung :D) und auch ein wenig mit der Konfiguration von Linux rumspielen.
Zukünftig wird der Linux-Rechner noch als File- und Mediastreaming-Server ausgestattet, für Datensicherheit und Streaming zur Playstation 3 :) Aber ich schweife grade vom Thema ab ...

KingCrunch
18.03.2009, 10:26
AMD Athlon64 3700+
2x512 MB DDR RAM
250 GB Platte (2 Partitionenen, 1. Partition mit WinXP, 2. Partition mit XAMPP)
160 GB Platte (diverse Daten wie Musik, Spiele usw.)

WinXP SP3 (abgespeckt mit nLite - vielleicht liegt hier der Teufel im Detail?)
Avast Virenscanner
Zend Studio for Eclipse
Winamp
Goole Chrome
Firefox 3.x
Miranda
Dienste von "iTunes"
diverse Prozesse von Treibern1GB Ram is schon wenig und bei den Anwendungen sind schon auch einige Kandidaten dabei, die nicht unbedingt sparsam umgehen. Umso mehr überrascht es mich, dass es flüssig durchläuft, hab eigentlich auf den Speicher spekuliert...
Um jetzt also mal ein detailiertes Bild bekommen, muss man wohl oder übel direkt Zugriffe, etc protokolieren. Kann das schon der Process Monitor?

Kann das nun nicht selbst testen, mein 4Kerner mit 4GB auf Ubuntu hat genug Freiraum :D
Zukünftig wird der Linux-Rechner noch als File- und Mediastreaming-Server ausgestattet, für Datensicherheit und Streaming zur Playstation 3 Aber ich schweife grade vom Thema ab ...Poser! :p

DennisBecker
18.03.2009, 10:36
:D Naja, muss auch mal sein ;) Debian Lenny & Mediastreaming vertragen sich irgendwie nicht so richtig, zumindest hab ich das nicht vernünftig ans Laufen bekommen ... Ubuntu unterstützt das von Haus aus besser und ist auch besser vorkonfiguriert :D


Also ich denke es kann nur 2 Ursachen haben: diejenigen, bei denen ZF unter XAMPP zu langsam läuft haben noch mehr Applikationen laufen oder es liegt wirklich an dem Unterschied zwischen meinem optimiertem XP und einer Standard XP Installation. Mein WinXP brauch z.B. nur noch 192 MB RAM statt beim Standard gut 300 - 400 MB RAM. Ein paar Dienste gibt es bei mir nicht, da ich diverse Dinge rausgeworfen, die ich nicht brauche (z.B. Domänen-Unterstützung). Aber im Endeffekt sollte das nicht viel weniger sein als bei einer Standard XP Installation.

ice-breaker
18.03.2009, 12:21
Liegt auch teilweise an den Xampp-Versionen, also ich erinner mich an meine ersten Gehversuche mit dem Zf, da war ich auch erstaunt, als jede Seite ca. 800ms brauchte, und ich noch nichtmal DB-Verbindungen offen hatte, rein statischer Content, auf Linux schmierte dann alles.
Neija ich habe es dann einfach ignoriert und irgendwann einen anderen Xampp drauf gemacht und seit dem läuft es auch supi ~170ms.
Ich glaube einfach manche Xampp-Versionen sind besser als andere, deshalb werde ich meine Version auch nimmer upgraden, wenn nicht unbedingt nötig.

hans47, probier doch mal den Zend Server CE aus, Zend erzählt ja, sie hätten den so schön optimiert und der wäre so leistungsfähig für Windows.

Meine persönliche Meinung zu Windows und Apache&PHP ist sowieso, zum Entwicklen isses ok, aber produktiv, irgendwie ist das immer langsamer als Linux ^^

DennisBecker
18.03.2009, 13:33
Der ist aber nur so schnell, weil ein byte-Code-Cache direkt mitgeliefert wird, was den Performance-Nachteil einer Windows-Plattform etwas relativiert.

Aza
19.03.2009, 17:08
Also ich hab auf meinem Intel Dualcore mit 3 GB keine Probleme mit XAMPP ( WinXP ).

Läuft eigentlich alles ziemlich flott.

DennisBecker
19.03.2009, 18:46
Du hast ja auch eine potente Maschine ;) Zudem haben neuere Festplatten eine viel schnellere Reaktionszeit! In meinem Linuxrechner werkelt eine alte 80GB P-ATA Platte, die in der Reaktionszeit nicht gerade up2date ist.

Innocentus
20.03.2009, 15:00
Wie ist das eigentlich?
Wird bei jedem View, jedem Model und jedem Controller ein Directory-Scan durchgeführt?
Aber so ein Scan kann doch recht lange dauern?
Kann ich dem Zend Framework eigentlich auch eine Liste geben, sodass es nicht mehr scannen muss?

Mit freundlichen Grüßen
Innocentus

KingCrunch
20.03.2009, 15:03
Was für ein Scan? Wovon redest du?

Innocentus
20.03.2009, 15:16
Der Autoloader sucht doch nach den gewünschten Klassen.
Und wenn ich jetzt Zend_Translate verwende, wird nach gettext-Dateien gescannt.
Das nimmt doch Zeit in Anspruch? Das findet ja nicht im RAM sondern auf der Festplatte statt.

Mit freundlichen Grüßen
Innocentus

KingCrunch
20.03.2009, 15:20
Dazu wäre es angebracht zu wissen, wie es jeweils funktioniert. Die beiden Verfahren sehen sich irgendwie garnicht ähnlich.
Autoloader:
- Sucht Datei x im aktuellen Pfad und danach in jeden im include_path angegebenen Pfad. Hast du dort nur ein Pfad gibt es maximal zwei Versuche. Deshalb predige ich auch gerne, dass man den Include-Pfad ruhig sauber halten sollte ;) Sollte das nicht möglich sein, sollte man die Pfadangaben so sortieren, dass häufig benötigte Pfade weiter vorne stehen. Schließlich bricht der Autoloader ab, wenn er einmal erfolgreich ist.

Zend_Translate
- Das ist schon eher echtes Scanning. Und nicht umsonst wird empfohlen Zend_Translate mit Caching zu verwenden ;) Nebenbei kann es auch nach anderen Übersetzungs-Formaten anstatt nur gettext suchen.

DennisBecker
20.03.2009, 15:24
Hab gestern mal bissl rumprobiert und meine Windows-Kiste ist auch um den Faktor 10 Langsamer als die Linux-Kiste. Wenn der Apache gerade neu gestartet wurde kann es auch schonmal 2 Sekunden dauern bis sich was tut, danach geht's aber super flott weiter.

Ich kenn mich nicht mit den Windows Interna so gut aus... Bei Linux weiß ich aber, dass es File Handles im Kenerlcache zwischenspeichert, so etwas in der Art könnte ich mir auch bei Windows NT auch vorstellen. Ich werd mal entsprechend bei ReactOS Entwicklern nachhaken, die kennen sich da ja gut aus ;)

Mr.AndersoN
20.03.2009, 15:53
Ich möchte nun nicht behaupten, eine lahme Maschine zu haben (X2 3800+, 2GB Ram), aber das ZF läuft bei mir auch recht langsam.
Ich führe das eben auf die vielen Includes zurück - Windows scheint dort einen sehr flüchtigen Cache zu haben. Nach langer Pause lädt eine normale ZF-Seite schonmal über 1 Sekunde. Drücke ich danach öfter die geliebte [F5]-Taste, gehts mit 200ms relativ gesehen recht flott.

Um einen richtigen Performance-Schub für Applikationen (viele dynamische Inhalte, die nicht sinvoll zwischengespeichert werden können) zu erreichen, müsste man einen Builder entwickeln, der das ZF in 1-2 Dateien packt. Das Thema wurde auch erst in einem anderen Thread angeschnitten - dort wurde es vom Entwickler auch umgesetzt.
Wäre doch mal eine gute Möglichkeit für ein Gemeinschaftsprojekt....

DennisBecker
20.03.2009, 16:55
Also so ein File Cache in NT gibt's auch (Aussage: jedes moderen OS hat nen File Cache). Es gibt dazu im Kernel einen entsprechend Cache Bereich für das Dateisystem und ich denke NTFS hält die Daten dann wohl nicht so lange vor oder der Durchsatz der Dateien ist recht groß (Antivren Software die Hintergrund scannt?)

KingCrunch
20.03.2009, 17:00
Es gibt dazu im Kernel einen entsprechend Cache Bereich für das Dateisystem und ich denke NTFS hält die Daten dann wohl nicht so lange vor ..Neija, der Filecache hängt nur bedingt vom Dateisystem ab. Auch NTFS kann einen großen Cache vorhalten. Trotzdem interessante Frage, inwiefern vllt NTFS an der Misere Schuld ist.

Soweit ich mich erinner zwackt Windows selbst schon selbst einen umfangreichen Teil des Speichers "für sich" ab. Das soll zwar größere Speicher-Allokierungsgeschichten verhindern, möglicherweise fehlt das dann aber an anderer Stelle.

ice-breaker
20.03.2009, 17:10
Also bei mir im Dev-System stört mich das nicht, wenn der einmal nen kleinwenig länger lädt, und betreibt denn irgendwer das Zf produktiv mit Windows ?

DennisBecker
20.03.2009, 20:10
@King: Das war jetzt ne Aussage eines ReactOS entwicklers, denke mal, dass der da schon gut genug drüber Bescheid weiß, wie das intern in Windows so abläuft ;) Erst ab Vista wird extra viel Speicher "gefressen" um den dann kontrolliert an die Programme zu geben, daher trügt der Schein ein wenig, Windows Vista würde so viel für sich selbst brauchen ein wenig. Natürlich brauch Vista mehr als XP, das liegt aber auch an den vielen Kleinen zusätzlichen Programmen / Diensten, die dauernd laufen und die User Experience verbessern sollen. In Windows 7 dürfte das ähnlich sein, wobei das OS wohl bei mehr solcher Dienste nicht mehr Speicherhungrig sein soll oder gar weniger benötigt als Vista. Dem kann man ja durch abschalten der Aero Oberfläche und manueller Optimierung ja auch noch weiter entgegen wirken.

KingCrunch
20.03.2009, 20:17
@King: Das war jetzt ne Aussage eines ReactOS entwicklers, denke mal, dass der da schon gut genug drüber Bescheid weiß, wie das intern in Windows so abläuft Na hoppala, wollt dir jetz net auf die Füsse treten :D Mir gings darum, dass beim Filecache nicht zwangsläufig NTFS Schuld ist, sondern das Windows ähnliche Macken bei ext3 oder FAT (oder wasweißich) zeigt.
Erst ab Vista wird extra viel Speicher "gefressen" um den dann kontrolliert an die Programme zu geben, daher trügt der Schein ein wenig, Windows Vista würde so viel für sich selbst brauchen ein wenig.Gabs wohl schon zu XP-Zeiten, allerdings wohl noch nicht in den Umfang.
Natürlich brauch Vista mehr als XP, das liegt aber auch an den vielen Kleinen zusätzlichen Programmen / Diensten, die dauernd laufen und die User Experience verbessern sollen.:thumb: Die meinte ich in erster Linie. Wenn man einfach mal schaut, was bei einem cleanen XP in der Diensteliste schon so rumschwirrt...
In Windows 7 dürfte das ähnlich sein, wobei das OS wohl bei mehr solcher Dienste nicht mehr Speicherhungrig sein soll oder gar weniger benötigt als VistaWindows7 soll den Netbook-Markt retten, da dürfen sie sich größere Geschichten garnicht erlauben.
Die Beta is übrigens schnuffig :)

DennisBecker
20.03.2009, 23:03
Naja, Windows 7 ist aufwändiger als XP, aber bietet natürlich auch mehr zeitgemäßes :) Auf meinem P4 3GHz mit den 786 MB RAM lief es auch recht flüssig, was mich gewindert hatte :) Auch Microsoft lernt irgendwann mal aus ihren Fehlern (siehe IE3 bis 7, Windows Vista, Windows 9x/ME) :D

heinrichth
21.03.2009, 17:48
Hallo,

ich habe mir mal die Mühe gemacht, ob es wirklich soviel bringt das ZF in ein File zu packen.

Hallo Welt Anwendung mit Datenbank laden.

Parsetime: ca. 0.3000 :rolleyes:

Zend Config, Controller, DB, Filter, Http, Layout, Locale, Session, Translate, Uri und View
in eine Datei gepackt. Alle require_once und Kommentare entfernt.

Dann nur die Datei, ich hab sie ZF_light genannt in die Hallo Welt Anwendung includiert.

Parsetime: 0,0080 :D

Ich finde das sagt alles was ein sogenannter Compiler für das ZF bringen würde.

Gruß
heinrichth

ice-breaker
21.03.2009, 17:57
Ich würde mal sagen, ohne nen Apache Benchmark sagen deine Zahlen gar nichts aus.

Edit: Und natürlich die Plattform auf der das lief.

Edit2: und der der Versuch nur mit require_once gestripped, denn das macht auch schon Unmengen aus.

DennisBecker
21.03.2009, 19:43
Jupp, denn egal welches System: der 1. Aufruf wird immer der langsamste sein!

KingCrunch
22.03.2009, 00:21
Ich finde das sagt alles was ein sogenannter Compiler für das ZF bringen würde.Das sagt nur, dass es bei dir sooo viel bringt. Dass es "irgendetwas" bringt, ist bekannt. Aber viel Spass beim Updaten ;)

ice-breaker
22.03.2009, 10:38
ich würde mich sehr freuen, wenn du jeweils die Zf-Versionen mit denen du getestet hast, zur Verfügung stellst

heinrichth
22.03.2009, 18:20
Hallo,

Nachtrag:

Zuerst das System mit dem ich getestet habe.

Rechner
Mainboard = Asus Maximus II Formula
CPU = Intel core 2 Duo 3,2 GHZ
RAM = 4 GB Ram
HD = Western Digital WD3000HLFS 300 GB (VelociRaptor)

Betriebssystem = Windows XP Service Pack 3

WAMP Server 2.0

Zend Framework 1.77

Zeitmessung: Vom Begin der Bootstrap.php bis zur Ausgabe in der index.phtml

Wer es selbst mal testen möchte!

http://rapidshare.de/files/46272181/ZF_Light.rar.html

Gruß
heinrichth

DennisBecker
22.03.2009, 18:40
Besser wäre nur in der Bootstrap zu messen, und zwar stoppen nach $frontController->dispatch()!

ice-breaker
22.03.2009, 18:49
Noch besser wäre es das ganze Testframework zu veröffentlichen, dass wir es mal auf ner Linux Kiste testen können.

Achso, wie hast du die Zf_Light.php erzeugt? Bestimmt net per Hand oder?

heinrichth
22.03.2009, 20:57
Hallo,

Nun die komplette Testapp.

http://rapidshare.de/files/46275272/ZF_Light_BaseApp.rar.html

Zur Erzeugung von ZF_Light habe ich mir ein Script geschrieben, das alle Kommentare und require_once entfernt. Die einzelnen Dateien zusammenkopiert.

Per Hand dann die Fehler in der erzeugten ZF_Light.php korrigiert, da das
Erzeuger Script noch sehr fehlerhaft ist.

Mir ging es in diesem Test erstmal nur darum, herauszufinden was es bringt
wenn KEINE KLASSEN mehr geladen werden müssen.

Wie die Parsetime gemessen wird kann nun jeder selbst durchführen.

Gruß
heinrichth

KingCrunch
22.03.2009, 22:49
Musste net auch die Reihenfolge der Klassen beachten?

heinrichth
22.03.2009, 23:16
Hallo,

Ja das wahr auch erforderlich, hat eine Weile gedauert bis ich es hinbekommen habe.

Gruß
heinrichth

ice-breaker
23.03.2009, 12:01
Also ich habe es mir gestern abend auf meiner Windows-Kiste mal angesehen, ja, die "Zf-Kompilierung" bringt wirklich einen Geschwindigkeitsvorteil, wieviel genau werde ich heute und morgen Abend noch mit nen paar Tests schauen, was mir jedoch sofort aufgefallen ist, dass die Größe des "Kompilats" mit 12MB nicht mehr von APC gecached wird (dafür muss man dann die Einstellungen ändern), was sehr bedauerlich, auch ist die Frage wie sich APC bei einem 12MB File verhält, wenn es Platz für andere Dinge schaffen muss.
Der Ansatz vom Konzept ist aber gut, den werde ich mal weiteruntersuchen.

DrakeL
23.03.2009, 14:34
Wäre in dem Ansatz nicht wichtig, dass man nur die Teile rein nimmt die man auch wirklich nutzt? Auf 12 MB kommt man dann ja nicht mehr, alles von Zend wird man ja nicht nutzen. :)

KingCrunch
23.03.2009, 14:39
"Wichtig" ist gut, das ist nicht so trivial, wie es aussieht, vorallen wenn man es automatisieren mag. Lass es 6MB sein, per Hand ist das eine Qual ;) Und wenn nen Update kommt, hat man gleich wieder den Spass.
Zur Automatisierung musste dann aber wiederum wissen, wie die Komponenten untereinander abhängen. Man könnte dazu eine statische Liste verwenden, wie sie auch im Manual zu finden ist, und hoffen, dass sich das nicht ändert. Trotzdem muss man dann deren Abhängigkeiten wieder auflösen.

Nebenbei:
Jemand getestet, ob mit der Light-Version auch Zend_Locale funktioniert? Bezweifel ich eher ohne reingeschaut zu haben, weil die Komponente auf einige viele XML-Dateien zurückgreift, die nicht mit integriert werden können.

DennisBecker
23.03.2009, 14:45
Naja, die XML Files muss man schon in der Ordner-Struktur belassen, sonst gibt's da sicherlich Probleme.

KingCrunch
23.03.2009, 14:48
Naja, die XML Files muss man schon in der Ordner-Struktur belassen, sonst gibt's da sicherlich Probleme.Und das ist eben nicht so. Zend_Locale (in Zend/Locale.php) sucht nach den XML-Dateien in einem Verzeichnis dirname(__FILE__).'/Data'. Hat mich mal interessiert, deshalb hab ich mal nachgeschaut ;) Hat man nur noch eine Datei (/path/to/zflight.php), müssen die Locales eben auch von dort aus relativ abgelegt werden (/path/to/Data/*).
Okok, das war schon der Zauber, war jetz net sooo spannend ;) Im Hinterkopf sollt mans trotzdem behalten.

DennisBecker
23.03.2009, 14:54
Solch ein Kompressionstool wäre interessant, wenn esauf Basis des eigenen Projekts im Deplay-Prozess angestoßen werden würde. Ich wollte mir demnächst mal "Phing" anschauen, wie man damit so einen Deplay-Prozess umsetzen kann.

KingCrunch
23.03.2009, 15:08
Das Ding hatte ich vor Urzeiten schonmal angedacht (vielleicht erinnert sich der ein oder andere daran). Im Moment schau ichs mir nochmal an.

ice-breaker
23.03.2009, 15:34
habe ich im Kopf auch gerade nochmal konzipiert, nur das Zf ist kein Problem, wenn dann aber wieder Libraries kommen, die vom Zf abhängen wirds komplexer.

Remi
23.03.2009, 16:53
@Dennis: meintest Du deploy-Prozess?

DennisBecker
23.03.2009, 16:55
Upps, ja natürlich meine ich den Deploy-Prozess. Ich hab's irgendwie in letzter Zeit wieder mit den vertippern ...

Mr.AndersoN
23.03.2009, 17:16
Das Ding hatte ich vor Urzeiten schonmal angedacht (vielleicht erinnert sich der ein oder andere daran). Im Moment schau ichs mir nochmal an.

Jo - lief unter dem Thema Compiler.

Es muss auch nicht eine riesige Datei sein - wenns für jede Komponente eine gibt, wäre auch schon viel erreicht, nehme ich an.

Ich hab es selbst noch nicht getestet - aber ich meine, dass die vielen Datein die Achillesferse aller größeren Frameworks ist - letzlich auch nur logisch, wenn man bedenkt, dass eine normale Festplatte eine Zugriffszeit von 12ms hat. Bei hunderten oder gar tausenden von Dateien gibts dort eben einen recht negativen Effekt (man darf jetzt natürlich nicht x geladene Dateien • 12ms rechnen, Cache gibts auch noch etc...).

In jedem Fall wäre das wohl mal ein sehr interessantes, produktives und natürlich aufwändiges Projekt.

ice-breaker
23.03.2009, 17:36
Sollte nicht mit APC sowieso alles im Ram sein?
Man müsste APC also nur beibringen nicht mehr lokal nach neueren Versionen zu suchen (apc.stat = Off), sondern das zu nutzen, was er hat, bei neuen Dateien eben kurz den PHP-Prozess neustarten.

Jemand in der Lage das mal auf ner Linux Kiste zu testen?

KingCrunch
23.03.2009, 18:17
@Anderson: Neija, 12ms is scho recht lang, neuere schaffen dann doch schon mehr, Server-Platten sowieso. Im Server selbst tut dann RAID sein übrigens -- je nach Qualität positiv wie negativ.
Nur fürs ZF isses garnet sooo schwer, stell ich fest :D Will mans allerdings verallgemeinern, wirds kompliziert ... Vorallen wenn man auch Funktionen und prozeduralen Code zulassen möchte.

ice-breaker
23.03.2009, 18:37
Will mans allerdings verallgemeinern, wirds kompliziert ... Vorallen wenn man auch Funktionen und prozeduralen Code zulassen möchte.
richtig, oder wenn noch andere Bibiliotheken auf dem Zf beruhen wirds immer schwerer.

KingCrunch
24.03.2009, 01:44
richtig, oder wenn noch andere Bibiliotheken auf dem Zf beruhen wirds immer schwerer.Och, da fiel mir was einfaches, wie triviales ein:
Jeder Include, der nicht zugeordnet werden kann, wird in einer eigenen Datei als Kommentar ausgelagert
// require_once 'Some/Library/Bla.php';
// oder
// Missing class 'Zend_Config'
Diese wird wiederum am Anfang des Kompilats (sagt man so, oder? :D) geladen. Nun kann man zumindest sehen, was fehlt, und es in eben dieser Datei vorladen lassen.

Gibt sicher schönere Lösungen, aber irgendwo muss man auch Kompromisse schließen ;)

Mal schaun, ob das so umsetzbar und dann auch funktional ist.

deetee
24.03.2009, 07:01
Hallo,

habe mir ein aktuelles Zend, Quickstart und Xampp auf meinem Win Rechner installiert.

Allerdings braucht eine Anzeige einer Seite jedesmal ca. 0.5-1s .

Meine andere Scripte (auch mit rewrite Rules/DB Abfragen, usw) laufen sehr schnell, nur Zend nicht.

Was könnte das Problem sein?

Gruß
h.

Dass das ZF im MVC Betrieb durchaus Zeit braucht ist richtig. Das liegt am umfangreichen Dispatch Prozess. Je nachdem wie groß deine Anwendung ist, d. h. wie exzessiv du Plugins registrierst, Helper nutzt oder allgemein eben eine umfangreiche Applikation hast, dauert der Dispatch Prozess schon ein wenig. Das ZF ist nicht auf Geschwindigkeit ausgelegt, sondern auf komfortable Nutzung der Klassen.

Ich habe auch so meine Probleme mit der Geschwindigkeit auf meinem vServer. Da kann man nur mit Optimierung rangehen, z. B. ist die PHP Funktion (http://php.net/manual/en/function.ob-gzhandler.php)


// einmalig in der ersten Zeile in der index.php
ob_start('gzhandler');nützlich bei umfangreichen Seiten. Dazu ist allerdings gzip bzw. zlib Unterstützung auf dem Server nötig (mit phpinfo() überprüfbar). Je nach System kann es auch 'ob_gzhandler' oder 'gz_handler' heißen. Bringt aber auch nur was für große Seiten, da hier jede Response komprimiert wird und vom Browser wieder dekomprimiert werden muss. Die Zeit zur Dekomprimierung kann sich bei kleinen Seiten auch negativ auf die Geschwindigkeit auswirken.

Ansonsten bleibt noch Caching und im Zusammenhang mit Datenbanken das Nutzen von Views und Stored Procedures. Grundsätzlich ist natürlich eine optimale Programmierung auch nicht verkehrt, denn da fängt es bereits an.

Aktuell gibt es eine Serie im Internet Magazin zu versch. PHP Frameworks, darunter auch das ZF. Evtl. gibt es da auch einen Geschwindigkeitsvergleich am Ende, bin ich mal gespannt. Die Serie vergleicht CakePHP, Symfony, ZF und noch 1-2 andere Frameworks in jeweils einzelnen Artikeln. Der erste Einführungsbericht war zwar etwas dürr an Informationen, aber da ging es auch nur um die allgemeine Funktionalität von Frameworks und noch nicht ins Detail.

ice-breaker
24.03.2009, 12:27
Mal schaun, ob das so umsetzbar und dann auch funktional ist.
Hmm, ja könnte funktionieren, aber es muss definitv noch nen spezieller Autoloader geschrieben werden, wenn wir nun nur Zend_Controller als ein Kompilat erstellen wollen und eine 3rd Party Komponente will Zend_Controller_Some_Class laden, müssen wir das auf die "Kompilatsstämme" zurückführen, also der Autoloader muss erkennen, dass damit das Kompilat Zend_Controller gemeint ist, ja, dann könnte das durchaus funktionieren :D

[...]
Es geht hier aben eben vor allem um die wirklich lange Zeit, die gebraucht wird um nur die Zf-Klassen zu parsen, und die benötigte Zeit ist wirklich deutlicher höher als alles was im Dispatch-Prozess passiert.

deetee
24.03.2009, 12:36
Es geht hier aben eben vor allem um die wirklich lange Zeit, die gebraucht wird um nur die Zf-Klassen zu parsen, und die benötigte Zeit ist wirklich deutlicher höher als alles was im Dispatch-Prozess passiert.
Das Laden der Klassen gehört zum Dispatch Prozess.

ice-breaker
24.03.2009, 12:38
Das Laden der Klassen gehört zum Dispatch Prozess.
Dann zeig mir wie du die Zend_Controller-Klassen erst im Dispatch Prozess laden willst ;)
Der Dispatch-Prozess hat mal goar nix mit Klassen laden zu tun, die kann man ja schon alle in der Bootstrap geladen haben.

Aber ist ja auch egal, zur Problemlösung trägt das ja nicht bei.

deetee
24.03.2009, 13:17
Dann zeig mir wie du die Zend_Controller-Klassen erst im Dispatch Prozess laden willst ;)
Der Dispatch-Prozess hat mal goar nix mit Klassen laden zu tun, die kann man ja schon alle in der Bootstrap geladen haben.

Aber ist ja auch egal, zur Problemlösung trägt das ja nicht bei.

Vor, während und nach dem Dispatch Prozess werden Klassen geladen. Sobald eine Applikation einen Dispatcher einsetzt ist der Ablauf von Anfang bis Ende ein Dispatch Prozess. Gut, das muss nicht jeder so sehen, aber das ZF basiert im MVC Modus quasi vollständig auf einem Dispatcher und daher sehe ich alles ab der ersten Zeile in der Bootstrap als Dispatch Prozess an. Wie du das siehst ist ne andere Geschichte, aber geh einfach mal davon aus, dass es mehrere richtige Ansichten zu einem Thema gibt, damit ersparst du dir und mir ne Menge Tipparbeit.

ice-breaker
24.03.2009, 13:23
Gut schließen wir das (auch das unser KingCrunch da nicht mehr anspringt, damit wir möglichst beim Topic bleiben ;) )

Machen wir wieder mit dem Compiler weiter, denn ne gute Lösung könnte denke ich die Reponse-Time doch ordentlich beeinflussen, erst Recht auf Systemen auf denen kein APC zur Verfügung steht.

deetee
24.03.2009, 13:32
Gut schließen wir das (auch das unser KingCrunch da nicht mehr anspringt, damit wir möglichst beim Topic bleiben ;) )


Wenn du nicht dauernd seine Beiträge für mich zitieren würdest in Fällen wie diesen, dann würde ich sie gar nicht lesen können. Denk mal so rum.

KingCrunch
24.03.2009, 13:43
Wenn du nicht dauernd seine Beiträge für mich zitieren würdest in Fällen wie diesen, dann würde ich sie gar nicht lesen können. Denk mal so rum.Hat er doch garnicht Oo Langsam wirds unheimleich -.-

// einmalig in der ersten Zeile in der index.php
ob_start('gzhandler');Startet die Ausgabekomprimierung sorgt sorgt serverseitig sogar eher für mehr, als für weniger Last. Hat aber auch mit dem Thema nüx zu tun.

ice-breaker
24.03.2009, 13:52
ich habe ich noch nie KingCrunch für dich (deetee) zitiert, und werde ich auch nicht, das ist mir zu doof.
mir gings nur darum 2 Streithähne auseinander zu halten um bei einem interessanten Thema zu bleiben :D

Hat eigentlich irgendwer das Thema schon mal mehr angegeangen als nur aus gedanklicher Sicht? :D
Vllt könnten ma das ja auch als Google Code Projekt umsetzen, der "Zf Compiler"

KingCrunch
24.03.2009, 13:57
Hat eigentlich irgendwer das Thema schon mal mehr angegeangen als nur aus gedanklicher Sicht? Knapp 5 DIN-A4 Karopapiert roter Linien :D Mein blauer Kugelschreiber is weg ...
ich habe ich noch nie KingCrunch für dich (deetee) zitiert, und werde ich auch nicht, das ist mir zu doof.Will ich auch garnet. So weit kommts noch, dass ich mich für sooo wichtig halte.

deetee
24.03.2009, 14:01
ich habe ich noch nie KingCrunch für dich (deetee) zitiert, und werde ich auch nicht, das ist mir zu doof.
mir gings nur darum 2 Streithähne auseinander zu halten um bei einem interessanten Thema zu bleiben :D


Im Moment bist du und ich es die diskutieren...nicht kingcrunch und ich. Und da ich kc nicht lesen kann, verstehe ich deine Befürchtung nicht, warum ich mit kc hier streiten sollte? Es sei denn, ich könnte ihn lesen, weil er für mich zitiert wird...

ice-breaker
24.03.2009, 14:03
Im Moment bist du und ich es die diskutieren...nicht kingcrunch und ich. Und da ich kc nicht lesen kann, verstehe ich deine Befürchtung nicht, warum ich mit kc hier streiten sollte? Es sei denn, ich könnte ihn lesen, weil er für mich zitiert wird...
aber er kann dich lesen und vom Thema abweichen, was du wiederum gerade tust ^^
Das Thema ist so wichtig, lasst uns da doch mal am Ball bleiben.

Knapp 5 DIN-A4 Karopapiert roter Linien :D
schön, also die Berechnung der Abhängigkeiten kann ich beitragen (habe ich schonmal umgesetzt) zudem eine Reihenfolge wie die Klassen definiert werden: ich denke über eine Art Graph ließe sich das am besten lösen, zu jeder Klasse die abhängigen Klassen definieren und dann sich von den minimalsten Abhänigkeiten (ergo die Wurzel, genau 0 Abhängigkeiten in Interfaces z.B.) zu denen mit mehr Abhängigkeiten vorarbeiten, sollte alles so funktionieren.

KingCrunch
24.03.2009, 14:11
Im Moment bist du und ich es die diskutieren...nicht kingcrunch und ich. Und da ich kc nicht lesen kann, verstehe ich deine Befürchtung nicht, warum ich mit kc hier streiten sollte? Es sei denn, ich könnte ihn lesen, weil er für mich zitiert wird...Ein eigentlich völlig unnötiger Kommentar ... Mittlerweile weiß jeder, dass ich von ihm geblockt bin, muss man nicht ständig betonen.
Zumal sich sein erster Beitrag auf den Ausgangspost bezog, der nun wirklich nicht mehr uptodate ist.
schön, also die Berechnung der Abhängigkeiten kann ich beitragen (habe ich schonmal umgesetzt) zudem eine Reihenfolge wie die Klassen definiert werden: ich denke über eine Art Graph ließe sich das am besten lösen, zu jeder Klasse die abhängigen Klassen definieren und dann sich von den minimalsten Abhänigkeiten (genau 0 Abhängigkeiten in Interfaces) zu denen mit mehr Abhängigkeiten vorarbeiten, sollte alles so funktionieren.Hab ich mir über die 5 Seiten sogar etwas einfacher gemacht.

1. Abhängigkeiten: Formal gibt es genau 0 oder eine Abhängigkeit, multiple Vererbung unterstützt PHP ja garnicht. Was ist mit den Interfaces? Wenn man die einfach pauschal an den Anfang packt, kann man sich sehr sicher sein, dass sie definiert werden, bevor irgendeine andere Klasse sie zu Implementieren versucht ;) Klassen, die zwar genutzt, nicht aber geerbt werden, müssen nicht vorher definiert werden.

2. Abhängigkeiten bestimmen: Das ZF ist wunderbar schlicht aufgebaut. Jede Datei besteht quasi aus einem Kopfteil mit File-DocBlock und diversen Includes und einem Body-Teil mit Class-DocBlock und der eigentlichen Klasse. Trennt man da direkt auf, hat eben zwei Teile :D Die Abhängigkeit kann man zB dadurch bestimmen, indem man den String nach dem T_EXTENDS nach T_CLASS oder T_INTERFACE und vor { sucht (sind alles PHP-Tokens). Oder aber man sucht sich die Dateinamen aus den Includes im Head zusammen, hätte aber den Nachteil, dass eventuell Abhängigkeiten auftreten, die nicht zwangsläufig in eine Reihenfolge gebracht werden müssen.


Wünschenswert wäre (wie oben schon angedeutet), wenn das Ding auch mit anderen Frameworks/Bibliotheken klar kommt, eventuell per Adapter oder sowas.

ice-breaker
24.03.2009, 14:19
1. Abhängigkeiten: Formal gibt es genau 0 oder eine Abhängigkeit, multiple Vererbung unterstützt PHP ja garnicht. Was ist mit den Interfaces? Wenn man die einfach pauschal an den Anfang packt, kann man sich sehr sicher sein, dass sie definiert werden, bevor irgendeine andere Klasse sie zu Implementieren versucht ;)
ja, durchaus ein sehr simpler Ansatz den ich noch verkompliziert habe :D
Immerhin können auch Interfaces von Einander erben, daher würde ich einfach vorschlagen Klassen und Interfaces gleich zu behandeln, ist weniger Code und zudem sind wir weniger fehleranfällig, falls das Zf doch irgendwann mal extendete interfaces nutzt

Klassen, die zwar genutzt, nicht aber geerbt werden, müssen nicht vorher definiert werden.
den Teil verstehe ich nicht.

2. Abhängigkeiten bestimmen: Das ZF ist wunderbar schlicht aufgebaut. Jede Datei besteht quasi aus einem Kopfteil mit File-DocBlock und diversen Includes und einem Body-Teil mit Class-DocBlock und der eigentlichen Klasse. Trennt man da direkt auf, hat eben zwei Teile :D Die Abhängigkeit kann man zB dadurch bestimmen, indem man den String nach dem T_EXTENDS nach T_CLASS oder T_INTERFACE und vor { sucht (sind alles PHP-Tokens). Oder aber man sucht sich die Dateinamen aus den Includes im Head zusammen, hätte aber den Nachteil, dass eventuell Abhängigkeiten auftreten, die nicht zwangsläufig in eine Reihenfolge gebracht werden müssen.
hmm, wir müssen aber beides behandeln, die T_EXTENDS und T_IMPLEMENTS sind ja klar, aber die exceptions werden ja erst bei bedarf geladen, die müssten also auch als abhängigkeit gezählt werden.

Wünschenswert wäre (wie oben schon angedeutet), wenn das Ding auch mit anderen Frameworks/Bibliotheken klar kommt, eventuell per Adapter oder sowas.
kann man sich ja als 2. Schritt überlegen, wenn es mit dem Zf gut läuft, ich denke aber wenn man die Klassen so baut, dass sie wiederbenutzbar sind (Abhängigkeiten und Includes erkennen, Graph für die Reihenfolge berechnen usw) ergibt sich das automatisch.

KingCrunch
24.03.2009, 14:24
den Teil verstehe ich nicht.Wenn in irgendeiner Methode new Bla() steht, reicht es, wenn class Bla irgendwo definiert wird. Es muss nich VOR der Klasse sein, in dessen Methode new Bla() steht.
class Blub {
public function foo () {
$bla = new Bla();
}
}
class Bla {
}
hmm, wir müssen aber beides behandeln, die T_EXTENDS und T_IMPLEMENTS sind ja klar, aber die exceptions werden ja erst bei bedarf geladen, die müssten also auch als abhängigkeit gezählt werden.T_IMPLEMENTS kann man ignorieren, wenn man alle Interfaces sowieso nach vorne setzt, was aber nicht geht, wenn man nicht zwischen Klasse und Interface unterscheidet.
Exception: Siehe oben in diesem Beitrag ;)

DennisBecker
24.03.2009, 14:26
Immerhin können auch Interfaces von Einander erben, daher würde ich einfach vorschlagen Klassen und Interfaces gleich zu behandeln, ist weniger Code und zudem sind wir weniger fehleranfällig, falls das Zf doch irgendwann mal extendete interfaces nutzt Das tut es sogar schon Bei Zend_Cache_Backend_* ;)

KingCrunch
24.03.2009, 14:28
interface Zend_Cache_Backend_ExtendedInterface extends Zend_Cache_Backend_InterfaceTatsache ... voll an mir vorbei gegangen.

ice-breaker
24.03.2009, 14:46
T_IMPLEMENTS kann man ignorieren, wenn man alle Interfaces sowieso nach vorne setzt, was aber nicht geht, wenn man nicht zwischen Klasse und Interface unterscheidet.
Das tut es sogar schon Bei Zend_Cache_Backend_* ;)
gewonnen :D
also müssen wir auch Abhängigkeiten bei Interfaces berechnen, in Bezug auf die universelle Nutzbarkeit ist es denke ich sowieso zu empfehlen.

Also ich persönlich würde aus dem Bauch hinaus, das gerade so machen:
Einmal nen Package, was zu nem PHP-File die Abhängigkeiten berechnet.
Einmal nen Package, was zu einer Menge an Files und deren Abhängigkeiten die Reihenfolge berechnet, bis dahin kann man das ja auf jedes Framework anwenden.

Danach, puh, hmm, müssen die Dinger zusammenkompiliert werden, also irgendein Design Pattern, dem man mehrere Objekte übergeben kann, um die PHP-Files zu manipulieren (also whitespaces löschen, includes löschen, irgendwas modifizieren, weiß-der-teufel) und wenn ein File dann durch den Prozess der Modifikation durch ist, es eben nach und nach auf die Platte schreiben.

robo47
24.03.2009, 15:11
Also ich hab mir mal grad den Compiler von Doctrine angeschaut, der liest den kompletten Ordner über einen RecursiveDirectoryIterator aus, required alle .php-Dateien und merged danach das was
get_declared_classes() und get_declared_interfaces() zurückgibt und bekommt so seine Liste mit Dateien. (Bei Doctrine abzüglich der nicht gewollten DB-Driver)

Danach kommentare entfernen etc und in eine datei mergen.

Die beiden arrays die die get_declared_*() Funktionen zurückliefern enthalten die Reihenfolge in der die Klassen PHP bekannt waren (also geladen wurden) damit wäre man die Arbeit sich gedanken darüber zu machen was vor was geladen werden muss weg oder ?

-> http://trac.doctrine-project.org/browser/tags/1.1.0/lib/Doctrine/Compiler.php#L64

ice-breaker
24.03.2009, 15:28
Hmm, ziemliche Holzhammer-Methode oder?

Ich glaube aber den Ansatz (so ähnlich) hatte ich auch mal und bin dabei in folgendes Problem gerannt:
der RecursiveDirectoryIterator will zuerst die untergeordneten Ordner lesen, dadurch hat er irgendeine Unterklasse von Zend_Acl geladen die auf eine Oberklasse verwies, diese verwies aber wieder auf die Unterklasse.
Das Problem darin war, dass die Unterklasse mit require_once die Oberklasse laden wollte, diese wiederum mit require_once die Unterklasse geladen hat, und das require_once scheinbar erst in Aktion tritt wenn die Datei einmal fertig geparsed wurde, dementsprechend hat sich PHP beendet weil er die Klasse/Interface 2 mal definieren wollte.

Ach mir fällts wieder ein ^^
Ich wollte prüfen ob die von mir bestimmten Dependencies wirklich stimmen und bin dann so in das Problem gerannt.

KingCrunch
24.03.2009, 15:30
Also ich hab mir mal grad den Compiler von Doctrine angeschaut, der liest den kompletten Ordner über einen RecursiveDirectoryIterator aus, required alle .php-Dateien und merged danach das was
get_declared_classes() und get_declared_interfaces() zurückgibt und bekommt so seine Liste mit Dateien. (Bei Doctrine abzüglich der nicht gewollten DB-Driver)Hab ich auch schon gesehen. Doctrine hat manch merkwürdige Design-Entscheidung ...
der RecursiveDirectoryIterator will zuerst die untergeordneten Ordner lesen, dadurch hat er irgendeine Unterklasse von Zend_Acl geladen die auf eine Oberklasse verwies, diese verwies aber wieder auf die Unterklasse.
Das Problem darin war, dass die Unterklasse mit require_once die Oberklasse laden wollte, diese wiederum mit require_once die Unterklasse geladen hat, und das require_once scheinbar erst in Aktion tritt wenn die Datei einmal fertig geparsed wurde, dementsprechend hat sich PHP beendet weil er die Klasse/Interface 2 mal definieren wollte.Mit require_once() sollte das eigentlich nicht passieren.
Ich wollte prüfen ob die von mir bestimmten Dependencies wirklich stimmen und bin dann so in das Problem gerannt.hmm kA, was du meinst, aber kann sein :D

ice-breaker
24.03.2009, 15:40
Mit require_once() sollte das eigentlich nicht passieren.
ich weiß, das dachte ich auch, nur irgendwie wollte es nicht ganz wie ich, ich bin immerwieder bei dem already-declared error bei den ACL-Sachen gelandet.

Also wer macht das Google Code Projekt auf? :D

Edit: Vllt sollten wir uns erst nen Namen ausdenken ^^ (Zf Compiler ?)

DennisBecker
24.03.2009, 19:54
"Strip ZF!" ;) Oder "ZF Compression" ... just my 2 cents :)

Bleistift
24.03.2009, 19:57
Zend (Framework) ist ein geschützter Name. Nur so als Hinweis am Rande ;)

DennisBecker
24.03.2009, 20:38
Ich glaube aber nicht, dass dies die Abkürzung "ZF" betrifft, oder?

Bleistift
24.03.2009, 21:01
Ich glaube aber nicht, dass dies die Abkürzung "ZF" betrifft, oder?

Nein, vermutlich nicht... Ich wollte es trotzdem mal erwähnt haben ;)

ice-breaker
24.03.2009, 21:24
"Strip ZF!" ;) Oder "ZF Compression" ... just my 2 cents :)
"ZF Compressor" würde noch gehen, aber "Compression" ist etwas unpassend oder? Das würde ja eher eine Art beschreiben, wie man es "kleinmacht" und nicht es macht.

KingCrunch
31.03.2009, 03:17
Hab mir das nun noch mal angeschaut
Wenn ich sowas

if (class_exists('ZipArchive', false)) {

abstract class Zend_Search_Lucene_Document_OpenXml extends Zend_Search_Lucene_Document
{
/*Code */
}

} // end if (class_exists('ZipArchive'))Oderif (class_exists("Zend_Exception")) {
abstract class Zend_InfoCard_Exception_Abstract extends Zend_Exception
{
}
} else {
abstract class Zend_InfoCard_Exception_Abstract extends Exception
{
}
}

class Zend_InfoCard_Exception extends Zend_InfoCard_Exception_Abstract
{
}sehe, wird mir bissl schummrig. kA, ob sie sich was dabei gedacht haben. Gerade erste Variante ist sehr unpraktisch, weil man denkt, man lädt eine Klasse, lädt sie aber garnicht und es gibt nichtmal nen Fehler.
Zumindest macht es die Analyse etwas schwer.

ice-breaker
31.03.2009, 13:01
Den letzten Code (http://framework.zend.com/issues/browse/ZF-4230?page=com.atlassian.jira.plugin.system.issueta bpanels:comment-tabpanel&focusedCommentId=29829#action_29829) habe ich schonmal gemeldet, neija wie das nunmal ist, wir ignorieren das einfach und schließen den BugReport, derjenige hat sich nichtmal das InfoCard-Release angesehen :mad: