Hallo Joe!
Joe User wrote:
Diese Empfehlung ist seit dem Release von PHP 5.0.0 veraltet.
Wer sagt das? Rasmus Lerdorf hält sogar den Einsatz von Apache 2 prinzipiell - zumindest unter "PHP-Gesichtspunkten" für die schlechtere Alternative gegenüber 1.3. Das sehe ich zwar nicht unbedingt so - zumal es ihm wohl auch darum geht, dass viele (unter anderem auch eigene) Apache-Module nicht für 2.0 verfügbar sind. Aber das lässt sich ja nicht unbedingt verallgemeinern. Bzgl. multithreading sieht er es aber ganz klar so - dass sich sowas für Script-Sprachen wie PHP einfach nicht eignet - eben wegen der vielen externen Bibliotheken, wo man sich oft nicht wirklich sicher sein kann, dass es hier keine Probleme geben wird. Es gibt zu viele Einflussfaktoren um sich hier wirklich sicher zu sein (siehe Zitate unten).
Joe User wrote:--enable-maintainer-zts ;)
ja, aber man beachte den Kommentar:
Code: Select all
--enable-maintainer-zts Enable thread safety - for code maintainers only
Bist Du das? ;-)
Joe User wrote:
andreask2 wrote:Also, das ganze gilt immer noch als höchst experimentell,
Wie bereits geschrieben, ist die Dokumentation diesbezüglich leider nicht up-to-date und somit unbrauchbar.
Diese Frage wurde in die FAQ aufgenommen, nachdem das dort zum 1000sten mal auf php.internals/php.general diskutiert wurde, Anlass und Vorlage hierfür war das Posting von Rasmus vom Juni diesen Jahres:
http://marc.theaimsgroup.com/?l=php-dev ... 021355&w=2
Meines Wissens wurde dieser Punkt den FAQ erst nach dem offiziellen Release von PHP5 hinzugefügt, und eben auch erst danach aus der frisch überarbeiteten Installations-Anleitung (jetzt übrigens auch mit dedizierten
Gentoo-Hinweisen ;-)) verlinkt. Das was ich bzgl. TODO und Thread-Safety zitiert habe, stammte aus dem PHP 5.0.2 Source! Und es sei ebenfalls angemerkt, dass für diese Aufgabe - im Gegesatz zu den meisten anderen - weder ein Entwicker zugewiesen war, noch ein zeitlicher Rahmen gesteckt war.
Joe User wrote:Generell nicht verwendbar ist derzeit (PHP <= 5.0.2) nur die MySQLi-Extension, wobei lediglich die mm und readline Extensions nicht threadsafe sind.
Wie kannst Du da so sicher sein?
http://httpd.apache.org/docs-2.1/develo ... ml#liblist ist zwar nicht auf dem allerneusten Stand, aber dass inzwischen alle Probleme dort behoben sind wage ich zu bezweifeln.
Und ich zitiere nochmal von php.internals:
Code: Select all
Note also that most developers who tell you their code is threadsafe don't
really know if that is true. All code relies on external things that may
or may not be threadsafe and we don't have any tools to verify claims of
thread safety.
http://marc.theaimsgroup.com/?l=php-dev ... 626764&w=2
Joe User wrote:
Naja, die höhere Performance ist durchaus zu bemerken ;)
Gemessen? Ja, bei statischen Requests natürlich, aber auch bei PHP? Vor allem unter Last bei komplexeren Scripten? Das sehen nicht alle so (siehe Zend Whitepaper unten).
Joe User wrote:
andreask2 wrote:(dafür aber eine Menge Nachteile),
Welche?
- nicht reproduzierbare Abstürze unter hoher Last
- langsamer unter Last (bezogen auf PHP)
- neuere erheblich weniger getestete Software nötig
aus dem php.internals Posting von oben:
Code: Select all
Someone was using an
early version of Apache2 with the PostgreSQL libpq client library. The
PostgreSQL developers swore up and down that their library was threadsafe
and I spent a whole day eliminating libraries one by one. Luckily this
particular problem was somewhat reproducable. If I banged hard enough at
one section which created new accounts every now and then an account would
end up with a bogus password entry and the user wouldn't be able to log
in. It turned out that libpq was using the system's crypt() function
which was not threadsafe. So the account creation which used something
line INSERT INTO users ... CRYPT($password)... would mess up when 2 or
more threads were trying to do this at the same time. This wasn't PHP's
fault in any way, it wasn't really PostgreSQL's fault either, but it was
still broken.
Joe User wrote:
andreask2 wrote:so ziemlich alle PHP-Entwickler halten dies für sinnlos,
Quelle(n)?
Es ist inzwischen einfach Konsens. Nochmal aus obigem Thread:
Code: Select all
A threaded web server behind a general-purpose scripting language like
Perl or PHP simply makes no sense to me. You want a robust and simple
base platform to layer your application on top of.
Man findet in den verlinkten Threads Aussagen mehrerer Entwickler, aber wie gesagt, es befinden sich wirklich viele Diskussionen in den Archiven. Mit PHP5 änder sich auch daran nichts, denn schon PHP4 selber war schon sehr lange Threadsafe. Es gibt sicher mhr und mehr Bibliotheken die von sich behaupten Thredsafe zu sein, was aber nicht immer stimmt (siehe Beispiel pgsql im Thread), einige werden es womöglich nie werden. Es bringt (zumindestens nach Aussagen von Zend) keine Performance-Verteile (auf Seiten von PHP) - im Gegenteil (Siehe Whitepaper unten).
z.B. verwendet auch Ilia entsprechendes in der Präsentation "Accelerating PHP Applications" von vor wenigen Wochen
http://talks.php.net/show/acc_php/7 .
George Schlossnagle beschreibt das z.B. in seinem Buch "Advanced PHP Programming" (Das beste PHP-Buch das ich kenne, gibt inzwischen auch übersetzt)
http://www.amazon.de/exec/obidos/tg/det ... schloss-20
http://simon.incutio.com/archive/2004/0 ... AndApache2
und auch das Zend-Whitepaper unten geht darauf ein.
Joe User wrote:BTW: Ich setze worker/mod_php4 seit PHP 4.3.2 und worker/mod_php5 seit PHP 5.0.1 (5.0.0 enthielt noch den (fast) vollständigen Debugcode) produktiv ein...
Und warum? Brauchtest Du diese kleine bisschen Extra-Performance?
Zu diesem Thema mal aus einem Whitepaper von Zend:
Code: Select all
If you plan on using your server primarily for serving PHP content, then running your server in multithreaded mode may actually slow you down by as much as 15%! This overhead originates in the extra work that PHP has to do in order to be thread-safe, including locking and passing around per-thread contexts to all functions
Quelle:
http://www.zend.com/whitepapers/PHPandA ... epaper.pdf
Wenn Du keine besonders hohe Last hast, dann mal folgendes Zitat von Rasmus Posting aus php.internals (s.o.):
Code: Select all
Hundreds of people may well post to this list that
Apache+PHP+ext/foo works perfectly for them, but maybe they are only
getting about a million hits a day. Then another user comes along who
gets 100 million hits a day and uses a fast dual-cpu machine and
everything blows up because now suddenly the window for some tiny race
condition has been made much larger due to the faster cpu speeds, the
second cpu and the higher frequency of requests. And the bug report we
get from this user will be something along the lines of:
It don't work sometimes. Most of the times it works fine, but then
every now and then it just don't. The error is different each time
and I have no idea how to reproduce it, but fix it right away!!!
Linux - Apache - mod_php ist eine sehr, sehr robuste Architektur. Es skaliert durch sein einfaches "fire & forget" erheblich besser als so manche gehypte AppServer Architektur. Das alles gefährdet man durch den Einsatz von multithreaded Webservern. Sicher ist das Prinzip des Worker-MPMs dem Prefork-MPM vorzuziehen wenn es um statische Inhalte geht, dann sollte man aber getrennte Server verwenden.
http://www.schlossnagle.org/~george/blo ... ndard.html
Und wie gesagt, für statische Inhalte IMHO noch besser ist der Ansatz von nonblocking bzw. asynchronous I/O wie z.B. lighttpd.
http://incremental.de/talks/phpconf-200 ... ge.23.html
http://jan.kneschke.de/projects/lighttpd/benchmark/
Viele Grüße
Andreas