Antwort
 
Themen-Optionen
Alt 20.12.2006, 19:50 Nach oben    #21
Waq
Erfahrener Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 108
Standard

Zu share-nothing:
Bei der Parallelisierung, die nunmal nötig ist, um eine Applikation auf mehrere Server oder so zu verteilen, hat man immer das Problem der Komunikation zwischen den Threads. Aus der Java-Welt kennt man hier die komplizierten Alleskönner-Architekturen, die durchaus skalieren, aber nur begrenzt, weil es irgendeinen Knotenpunkt gibt, durch den alles durchmuss.

Bei klassischen PHP-Architekturen wird nichts geteilt, jedes abgearbeite HTTP-Request ist unabhängig. Eigener Apache-Prozess, eigene Session, keine Kommunikation mit den anderen. Keine Zugriffe auf fremde Sessions. Das skaliert endlos in die Breite. Stell zehnmal soviele Server hin und es ist zehnmal so schnell.

http://www.sitepoint.com/blogs/2004/...oesnt-get-php/


Von Singletons halte ich im Allgemeinen eher wenig. Sind schliesslich nichts weiter als globale Variablen, die sich ein OOP-Kleidchen angezogen haben.
Singletons kann man als Abkürzung verwenden, wenn man zu faul ist, Kontexte explizit durchzureichen. Das kann sogar sinnvoll sein, wenn man spezialisierte Architekturen schreibt, die einen Kontext annehmen (z.B. das PHP-Typische "ich bin vom Browser aufgerufen worden und in $_REQUEST stehen meine Daten"), da dass explizite durchreichen von Kontexten durchaus lästig sein kann. Mit wiederverwendbarem OOP hat das allerdings nichts zu tun.

Es gibt keine Objekte, die es nur einmal geben darf. Sowas basiert immer auf einer Annahme, von der nicht zu garantieren ist, dass sie überall gilt, und man vergisst dabei gerne gegen Interfaces statt gegen Implementationen zu programmieren.

Klassisches Beispiel ist der PC-Speaker (das Piep-Ding Ein PC hat immer nur einen PC-Speaker also sollte man dafür ein Singleton verwenden.
Klingt einleuchtend, ist aber Unsinn.
Niemand (ausser dem Betriebssystem usw.) sollte einfach annehmen, dass es einen PC-Speaker gibt. Man sollte annehmen, dass man ein Soundausgabegerät braucht, ein solches als Parameter akzeptieren und darauf den Sound ausgeben. Ob der Sound auf den PC-Speaker geht, auf eine der potentiell mehreren Soundkarten oder obs quer durchs Internet geschickt wird an den Kerl der lieber von Zuhause arbeiten möchte, hat mich an der Stelle nicht zu interessieren.
Waq ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.12.2006, 21:47 Nach oben    #22
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Zitat:
Zitat von pago Beitrag anzeigen
Zum einen wäre es damit notwendig, alle Singletons als Parameter an anderen Klassen/Funktionen zu übergeben, weil man nie wissen kann, ob nach ner Änderungen weiter unten in der Hierarchie nicht doch die Instanz benötigt wird, zum anderen ist der Aufruf einer getInstance-Methode mit Sicherheit nicht in einem relevanten Rahmen aufwendig.
Ich finde das mitunter auch sehr anstrengend, Komponenten "so dumm wie möglich" zu halten. Aber ich glaube dennoch, dass sich der Weg lohnt, wirklich klar zu definieren, wer was weiß und worauf Zugriff hat. Ätzend, wenn man irgendwann merkt, dass die oder die Komponente jetzt aber doch Zugriff auf irgend was braucht, worauf sie eben noch keinen hat und man ev. alle Komponenten diesen Typs nochmal umbauen darf.

Aber die Alternative ist doch ein böses Durcheinander, in dem du selbst aus dem Template (schreibend) auf die Datenbank zugreifen kannst etc. Und wenn ich mich recht erinnere, waren diese Zeiten noch ätzender! Klar, alles geht schön flott on der Hand, aber testen? Und mögliche Fehlerquellen verstreuen sich über die komplette Anwendung.

Sind natürlich extreme, aber die Frage ist ja immer auch, warum man nicht weiß, welche Komponente welche Zugriffe braucht. Ich glaube, in diese Fragen (wer weiß und darf was) zu investieren bringt einen zu den Kernpunkten einer Anwendung. Und wenn man diese sauber geöst bekommt, dann passts (bis zu den nächsten Fragen... *g) und dann braucht man keine Globals und Singletons.

Zitat:
Wenn es von einem Objekt nur eine Instanz geben soll und darf, dann hat das nunmal ein Singleton zu sein. Andernfalls kommst du in Teufels Küche, weil du dann n Objekte mit unterschiedlichem State haben könntest, weil du ab und an mal ne neue Instanz erzeugt hast (warum auch nicht? verbietet dir ja niemand durch nen private Konstruktor und wenn doch ist es ja wieder ein Singleton...).
Hier reicht es, im Kostruktor einen statischen Flag zu setzen und __clone() dicht zu machen (im Extremfall noch in jeder öffentlichen Methode sicherstellen, dass $this existiert).

In der Kritik ist ja nicht, dass man verhindert, dass ein Objekt nochmal gebaut wird, sondern, dass man von überall drauf zugreifen kann. (Bezeihungsweise: Bei "Waq" ist das doch in der "Kritik" - aber es gibt natürlich Konstrukte, die sich nur sehr aufwändig - sei es in der Implementerung oder in der Last zur Laufzeit - realisieren lassen, wenn man nicht ausschließt, dass es maximal eine Instanz von dieser Klasse zur Laufzeit gibt.).

Basti

Geändert von Basti (20.12.2006 um 21:56 Uhr).
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.12.2006, 13:25 Nach oben    #23
Benutzer
 
Registriert seit: 24.10.2006
Beiträge: 90
Standard

@Ben

Ich habe keine Benchmarks durchgeführt, aber rein theoretisch ist ein Singleton langsamer, als wenn du Objekte durchreichst.

Bei einem Singleton rufst du jedesmal eine Funktion auf und das ist wesentlich langsamer als wenn du einfach auf eine Variable zugreifst.

Teste das z.B. mal mit PHP_VERSION und phpversion () aus. Du wirst sehen, dass PHP_VERSION schneller ist.

Ich verwende bei kleineren Sachen (und ich habe hauptsächlich kleine Sachen mit vlt. 200 Besucher pro Tag) aber trotzdem Singletons. Allerdings sollte man sich beim Thema Performance zuerst um andere Sachen kümmern (Apache, Dateisystem, Datenbank, Caching mit 404 ...)

MfG Byrel


[EDIT by Ben]
Diskussion über die Caching-Methode über den HTTP-Code 404: http://forum.developers-guide.net/showthread.php?t=4911

Geändert von Ben (23.12.2006 um 20:07 Uhr).
Byrel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.12.2006, 21:21 Nach oben    #24
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Also das Zend Framework verwendet ja eine Registry, um Singleton-Objekte zu verwalten.
Zitat:
The registry is a mechanism for providing singleton instances of values to the application space. By storing the value in the registry once, and then retrieving the value from the registry whenever it is needed, the same instance is always returned.
http://framework.zend.com/manual/en/zend.register.html

Hm, ich will jetzt nicht sagen "wenn die das machen, dann wird das schon okay sein", aber wenn es wirklich signifikant langsamer wäre, dann würde das in solch einem Framework doch sicherlich auch anders geregelt werden, oder?

Ich muss jetzt auch nicht jede 10000stel Sekunde rauskitzeln .. mir ging es mehr um signifikante Unterschiede.

@bzgl: http_load .. hab ich noch nicht ausprobiert!
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.12.2006, 22:57 Nach oben    #25
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Ich verstehe jetzt nicht so genau den Vorteil der ZF-Variante. Es ist doch egal ob ich eine statische Methode aufrufe oder das über die Registry des ZF mache. Ich denke zweiteres ist sogar noch langsamer oder?
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.12.2006, 23:24 Nach oben    #26
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
Standard

Zitat:
Zitat von WarrenFaith Beitrag anzeigen
Ich verstehe jetzt nicht so genau den Vorteil der ZF-Variante. Es ist doch egal ob ich eine statische Methode aufrufe oder das über die Registry des ZF mache. Ich denke zweiteres ist sogar noch langsamer oder?
aber vieleicht hat man so bissel mehr "system" dadrin unter anderem, weil man eine klasse nicht als singleton programmieren muss sondern so einfach zugriff auf EINE Instanz der klasse hat.
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.12.2006, 23:29 Nach oben    #27
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Ist doch Sinn des Singletons nur eine Instanz zu haben!
Wenn ich die Instanz der Configuration einheitlich $Configuration nenne, dann ist das doch kein Problem.
Genauso einfach gehts auch mit $registry->get('Configuration') (bin mir mit dem call jetzt unsicher).
Aber letzten Endes ist das die Implementation von schon vorhandener Funktionalität.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.12.2006, 23:34 Nach oben    #28
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Im Zend Framework existiert genau eine Instanz der Registry. Es können aber jederzeit weitere Zend_Config-Instanzen erstellt werden. Die Registry bietet ja nur den globalen Zugriff auf die Instanzen ...

Keine Ahnung, wo da Vor- und Nachteile liegen.
Habe hier zwar viel gelesen und auch Einiges verstanden, aber so wirklich durchblicken tue ich immer noch nicht.
Aber das kommt ...
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.12.2006, 00:17 Nach oben    #29
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Registry und Singleton sind zwei unterschiedliche Patterns. Gemeinsam haben sie, dass sie Objekten einen Zugang zu anderen Objekten (bzw. sich selbst im Falle von Singletons) anbieten, die sonst keinen Zugang hätten, da ihnen nichts übergeben wurde, dass ihnen diesen Zugang geben kann.

Hier allerdings ist das Singleton absolut global und die Registry ist nur den Objekten verfügbar, denen sie auch übergeben wurde (falls sie nicht selbst als Singleton oder statische Klasse implementiert ist).

Der wichtige Unterschied aber ist, dass es von einer Singleton-Klasse nur eine Instanz geben kann, eine Registry kann aber Instanzen von Klassen aufnehmen, die noch weitere Instanzen im Umlauf haben.

Ich habe auch die Reistry aus meinem Framework/CMS rausgeschmissen, macht manches aber nicht einfacher bzw. ich hab noch nicht überall einen passenden Ersatz gefunden.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.12.2006, 00:41 Nach oben    #30
Benutzer
 
Registriert seit: 24.10.2006
Beiträge: 90
Standard

Zitat:
Hm, ich will jetzt nicht sagen "wenn die das machen, dann wird das schon okay sein", aber wenn es wirklich signifikant langsamer wäre, dann würde das in solch einem Framework doch sicherlich auch anders geregelt werden, oder?
Ehrlich gesagt. Wenn deine App. ne perfekte Performance hinlegen soll, dann sollte das Zend Framework IMHO vermieden werden. Ich weiß zwar nicht ob das noch immer so ist, aber als ich mich mit dem Framework 0.1.X beschäftigt habe, war der Code nur voll von Sachen wie "if (substr () === "text")", require_once, magic methods, Funktionsaufrufe in Schleifen, capturing regexp ... .

MfG Byrel
Byrel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.12.2006, 00:45 Nach oben    #31
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Zunächst einmal gibt es imho die "perfekte Performance" nicht und außerdem geht es ja eher um einen Kompromiss. Die Frage ist einfach, auf welche Engpässe man aufpassen muss, im konkreten Fall eben, ob Singletons solch einen Engpass darstellen könn(t)en.

Ich habe den Thread ja nicht in Zusammenhang mit der Nutzung des ZF erstellt.

Und nein, ich will hier jetzt nicht hören, dass man dann besser eine eigenständige Sache baut und nicht auf ein fertiges Framework zurückgreift. Ich will es einfach nicht hören .. Stichwort: Kompromiss zwischen Arbeitsaufwand und Ertrag!

In diesem Sinne.
Grüße, Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.01.2007, 05:45 Nach oben    #32
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Hier noch ein kleiner Nachtrag:
http://paul-m-jones.com/blog/?p=238#comment-99590
Zitat:
(implementing singletons in PHP4 is definitely slower than PHP5)
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PEAR-Benchmark nutzen um Performance einer Template-Engine zu messen Ben PEAR, PECL und Frameworks 9 26.02.2007 22:16
getimagesize und Performance ? CIX88 PHP-Programmierung 6 04.05.2006 08:28
[FRAGE] performance von phptags J33d3X PHP-Programmierung 14 30.01.2006 14:52
Performance erhöhen Steve231 Datenbanken 5 18.10.2005 16:39


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:59 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44