Apachemodul vs cgi: Performance, security, features?
Olaf Schneider
- php
0 Christian Kruse0 Christian Seiler0 eddi0 Christian Seiler0 eddi
0 eddi
Hallo,
ich bin gerade dabei, den Provider zu wechseln, da mein alter Probleme mit E-Mail zu haben scheint. Bis jetzt habe ich immer in Umgebungen gearbeitet, in denen php5 direkt als Apachemodul eingesetzt war. Bei der Suche zeigt sich allerdings, dass einige, wie z.B. Domainfactory php5 per cgi einbinden.
Ist es immer noch so, dass php via cgi weniger performant ist denn als Modul, da für jede Anfrage ein Prozess gestartet werden muss?
Habt Ihr Erfahrungen, wie weit Scripts angepasst werden müssen, um unter beiden Konzepten zu laufen?
Gibt es Vor- oder Nachteile bezüglich der Sicherheit?
Vielen Dank im Voraus,
Olaf
你好 Olaf,
Ist es immer noch so, dass php via cgi weniger performant ist denn als Modul, da für jede Anfrage ein Prozess gestartet werden muss?
Ja.
Habt Ihr Erfahrungen, wie weit Scripts angepasst werden müssen, um unter beiden Konzepten zu laufen?
Es muss eigentlich nichts angepasst werden.
Gibt es Vor- oder Nachteile bezüglich der Sicherheit?
Einbindung über Apache-Module ist unsicher und nur anzuraten, wenn man den
Server alleine benutzt (virtueller Server im Jail, Root-Server, etc).
再见,
克里斯蒂安
Hallo Olaf,
Habt Ihr Erfahrungen, wie weit Scripts angepasst werden müssen, um unter beiden Konzepten zu laufen?
Mit (normalem) CGI funktioniert das Auslesen der HTTP-Auth-Daten nicht (d.h. PHP_AUTH_USER / PHP_AUTH_PASS stehen nicht zur Verfügung; den über normale .htaccess-Authentifizierung übertragenen Benutzer kann man jedoch per REMOTE_USER auslesen).
Status-Header müssen anders gesetzt werden. Bei PHP als Modul muss bspw. Header('HTTP/1.1 301 Moved Permanently'); gemacht werden während bei PHP als CGI Header('Status: 301 Moved Permanently'); notwendig ist. Ich mache das immer über den Code:
function setzeStatusHeader ($header) {
if (strtolower(php_sapi_name()) == 'cgi') {
Header('Status: ' . $header);
} else {
Header($_SERVER['SERVER_PROTOCOL'] . ' ' . $header);
}
}
// ...
setzeStatusHeader ('301 Moved Permanently');
Das fängt zwar nicht alles ab (d.h. andere Webserver könnte nochmal unterschiedliche Behandlung erwarten) - aber für den Apache klappt das ganz gut.
Viele Grüße,
Christian
Hallo,
if (strtolower(php_sapi_name()) == 'cgi') {
hier sollte mit (substr(php_sapi_name(),0,3)=='cgi')
geprüft werden, damit auch 'cgi-fcgi'
, das sich aus Sicht des Programmieres zum CGI-Binär gleich verhält, ebenfalls erfaßt wird. Weiterhin ist die Angabe des SAPIs in den Sourcen eigentlich immer kleingeschrieben worden.
Gruß aus Berlin!
eddi
Hallo eddi,
hier sollte mit
(substr(php_sapi_name(),0,3)=='cgi')
geprüft werden, damit auch'cgi-fcgi'
, das sich aus Sicht des Programmieres zum CGI-Binär gleich verhält, ebenfalls erfaßt wird.
Oh danke, mit FastCGI hatte ich noch nie zu tun, daher wußte ich das nicht.
Weiterhin ist die Angabe des SAPIs in den Sourcen eigentlich immer kleingeschrieben worden.
Nunja, aber das kann sich durchaus ändern, ich erinnere mich an eine OOP-Funktion, ich glaube get_class o.ä. war es, die in PHP4 immer Lowercase zurückgegeben hat, in PHP5 jedoch Mixed Case. Daher gehe ich lieber auf nummer sicher und jage bei fixen Strings strtolower drüber (ich fände es ja sowieso besser wenn die Funktion einen Integer zurückgeben würde, den man mit Konstanten wie PHP_SAPI_CGI u.ä. vergleichen könnte).
Viele Grüße,
Christian
Re:
(ich fände es ja sowieso besser wenn die Funktion einen Integer zurückgeben würde, den man mit Konstanten wie PHP_SAPI_CGI u.ä. vergleichen könnte).
das wäre allerdings was Feines :)
Mach doch einen Feature Request, denn ich glaube meinen Namen können die Herrschaften nicht mehr ersehen ;)
Gruß aus Berlin!
eddi
Hallo,
Habt Ihr Erfahrungen, wie weit Scripts angepasst werden müssen, um unter beiden Konzepten zu laufen?
wesentliche Unterschiede gibt es nicht. Es werden einige Variablen bei CGI vorhanden sein, die beim Modul nicht vorhanden sind, oder mit abweichenden Werten befüllt:
CGI ($_SERVER/$_ENV) Modul
PATH_TRANSLATED - nicht (zwingend) vorhanden
REDIRECT_STATUS - nicht (zwingend) vorhanden
REDIRECT_URL - nicht (zwingend) vorhanden
SCRIPT_NAME - Wert ist abweichend
SCRIPT_FILENAME - Wert ist abweichend
Insbesondere Scripte, die auf die letzten beiden Varablen zugreifen, bedürfen eines kritischen Blickes.
Gibt es Vor- oder Nachteile bezüglich der Sicherheit?
Diese sind nur im administrativen Bereich zu finden und spielen bei der Programmierung allermeißt keine Rolle.
Gruß aus Berlin!
eddi