fastcgi - mehrere clients gleichzeitig
-
hallo leute
in der Accept-schleife wird die eigendliche generierung der webseite gemacht.
wie sieht das aus wenn jetzt die generierung z.b. 5 sekunden dauert und beispielsweise 5 clients die seite aufrufen (gleichzeitig)?
werden die clients dann hintereinander bediehnt, so das der letzte client 25 sekunden warten muss ?Meep Meep
-
Du musst deine Frage genauer stellen. Weil deine Beschreibung hat mit fastcgi nichts zu tun.
Wenn du nur einen Thread/Prozess verwendest, dann wird es mit simultanen Anfragen eng werden - sprich alles wird sequentiell abgearbeitet. Aber warum sollte man so eine Situation jemals haben?
FastCGI ist ein Protokoll über das der Server der die Anfrage des Clients bearbeitet mit der Anwendung kommuniziert die den Inhalt generiert.
-
auf wikipedia http://de.wikipedia.org/wiki/FastCGI steht:
Im Unterschied dazu wird bei FastCGI das auszuführende Programm (inkl. Interpreter, falls nötig) nur einmal geladen und steht dann für mehrere Requests zur Verfügung – egal ob vom selben Client oder von unterschiedlichen Clients.
wenn ich nun folgenden source habe:
... while (FCGI::accept () >= 0) { Sleep(5000); printf("Content-type: text/html\r\n"); printf("\r\n"); printf("Hello world!<br>\r\n"); }
und 5 browser gleichzeitig die seite abrufen, dann werden sie im abstand von 5 sekunden nacheinander bediehnt, oder ?
wenn ja, muss ich dann threads dafuer einsetzen um dem problem entgegen zu wirken ? und wie wird sowas im normalfall geloest ?
Meep Meep
-
FastCGI alleine ist nicht parallelisiert. Sprich wenn du wirklich händisch accept() aufrufst, dann musst du auch selber parallelisieren.
Aber eigentlich gibt es keinen Grund das zu tun.
Warum willst du das denn machen?
PS:
es ist einem FastCGI Module aber erlaubt mehrere Prozesse deiner App zu Spawnen. Ich weiss aber nicht ob das in der Praxis auch gemacht wird.
Siehe auch: http://www.fastcgi.com/drupal/node/6?q=node/22#S4
-
Shade Of Mine schrieb:
FastCGI alleine ist nicht parallelisiert. Sprich wenn du wirklich händisch accept() aufrufst, dann musst du auch selber parallelisieren.
Aber eigentlich gibt es keinen Grund das zu tun.
Warum willst du das denn machen?
ich rufe accept() doch garnicht auf. der aufruf kommt doch vom webserver.
mir geht es nur darum, wie es ablaeuft, wenn der webserver 5 gleichzeitige anfragen bekommt wie dann das fastcgi script aufgerufen wird.
von der logik her muesste das fastcgi script 5 mal hintereinander ablaufen.
und wenn jeder durchgang lange dauert dann wartet der letzte browser in der reihe halt ziemlich lang. da stellt sich mir eben die frage wie das normalerweise geloest wird.
aehlich wie bei der socket programmierung ?
ein thread fuer listen(). der clientsocket wird dann an einen weiteren thread uebergeben und geht dann gleich wieder in den listen status ueber. somit kann der serversocket recht schnell alle eingeheneden verbindungen abarbeiten.
wird das so auch im normalfall fuer fastcgi gemacht ?
irgendwie finde ich im inet nichts gescheites darueber.Meep Meep
-
Meep Meep schrieb:
ich rufe accept() doch garnicht auf. der aufruf kommt doch vom webserver.
Nein. Der Aufruf kommt von der FastCGI Anwendung. Es liegt im Ermessen der Anwendung was genau passiert. Jenachdem welche Anwendung das accept() macht, kann das Verhalten unterschiedlich sein.
FastCGI selber definiert hier nur, dass du eine Connection pro Accept Aufruf bekommst. Diese Connections können aber problemlos parallel bearbeitet werden. Das liegt aber in der Verantwortung der FastCGI Anwendung.
Verwendest du PHP als FastCGI?
PHP macht es bei Lighty zB so:
Er spawnt PHP_FCGI_CHILDREN Prozesse die jeweils einen Request bearbeiten. Sprich du kannst maximal PHP_FCGI_CHILDREN Requests gleichzeitig abarbeiten. Default Wert ist glaub ich 8.PHP könnte es aber auch anders machen - je nachdem welche Version man verwendet.
Weiters kann man natürlich noch andere Tools zwischen FastCGI und PHP schalten: Siehe zB http://php-fpm.org/about/
Was genau willst du denn machen?
-
ich brauch eine rein dynamische seite die ein xml dokument ausliefert.
der inhalt des xml files wird recht aufwendig berechnet.
ich will daher ein fastcgi script in c++ schreiben, weil ich damit auch noch einiges cachen kann, da das script ja im speicher gehalten wird.
jetzt dauert so eine generierung ca 7-8 sekunden pro aufruf.
es wird sehr haeufig vorkommen das mehrere client ziemlich gleichzeitig das script aufrufen. daher meine frage wie sich das dann verhaelt.Meep Meep
-
Meep Meep schrieb:
ich brauch eine rein dynamische seite die ein xml dokument ausliefert.
der inhalt des xml files wird recht aufwendig berechnet.
ich will daher ein fastcgi script in c++ schreiben, weil ich damit auch noch einiges cachen kann, da das script ja im speicher gehalten wird.
jetzt dauert so eine generierung ca 7-8 sekunden pro aufruf.
es wird sehr haeufig vorkommen das mehrere client ziemlich gleichzeitig das script aufrufen. daher meine frage wie sich das dann verhaelt.Alles klar.
Dann gibt es 2 einfache Lösungen:
mod_fastcgi verwenden: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiServer
Du kannst hier dem Module sagen, dass es zB 4 Prozesse spawnen soll.Oder gleich einen C++ Application Server verwenden, zB http://www.tntnet.org/
PS:
Die 3. Möglichkeit ist einfach CGI zu verwenden.