Hallo pl,
Warum soll es denn nicht möglich sein, mehrere Instanzen gleichzeitig erstellen zu dürfen!? Stell Dir mal vor, mehrere Shopmitarbeiter wollen Artikel bearbeiten. Soll da etwa jeder Mitarbeiter auf den Anderen warten müssen?
Repositories im Web-Umfeld existieren nur für die Dauer eines Webrequests.
Ob ein User auf irgendwas warten muss, ist eine Frage der verwendeten Server-Runtime. Nicht Apache, sondern die Schicht darüber. Das Programmiermodell von PHP ist so, dass ein Webrequest auf der grünen Wiese beginnt und seine Speicherinhalte nach Script-Ende verworfen werden. FastCGI behält zwar den Code im Speicher, die Daten werden aber verworfen. Kommen mehrere Webrequeste gleichzeitig, werden sie gequeued und nacheinander ausgeführt, es sei denn, der Server bildet einen Webgarden[1] und hat parallele PHP Instanzen. Jedenfalls sieht der eine Request die Daten des anderen nicht. In einem solchen Szenario ist es egal, ob ich das Repository als Singleton-Instanz fahre oder als statische Methoden.
In ASP.NET (C#) ist es anders. ASP.NET ist ein HTTP Handler im IIS, und kann mittels async-Methoden mehrere Requests quasiparallel fahren (d.h. die I/O-Pausen von Request 1 nutzen um Code von Request 2 auszuführen). Würde ich dort Repositories als Klassen mit statischen Methoden bauen, würden sie sich gegenseitig stören. Und selbst, wenn ich nicht async programmieren würde, dann würde bei statischem Code der Request n+1 noch die Daten des Requests n in den Repositories vorfinden (was gelegentlich gewollt sein kann, aber Caching baut man normalerweise anders). Ich muss in ASP.NET die Repositories pro Request anlegen und als Objekte im RequestContext vorhalten (bzw. als Parameter durch die Gegend reichen).
Also - TL;DR - ja, je nach Server warten die Mitarbeiter. Allerdings nicht von BeginSession bis End-Session, sondern von Webrequest zu Webrequest. Wenn der eine "Suchen" klickt und die Suche 10s läuft, beginnt die Suche des zweiten erst, wenn der erste sein Ergebnis hat. Es sei denn, wie gesagt, der Server fährt einen Webgarden und betreibt mehrere PHP Prozesse parallel. Oder das mod_php kooperiert mit dem Apache, nimmt mehrere Requests parallel an und führt sie in eigenen Threads isoliert voneinander aus (was dann de facto auch ein Webgarden ist).
Das Programmiermodell des Repositories ist jedenfalls so, dass ich für einen Webrequest genau eine Instanz eines Repositories habe.
Rolf
sumpsi - posui - clusi
Der kleine Bruder der Webfarm, in der mehrere Server parallel laufen ↩︎