Olaf Schneider: Apachemodul vs cgi: Performance, security, features?

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

  1. 你好 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).

    再见,
     克里斯蒂安

    --
    Das Malheur mit dem Open Source | Frühling
    Ich bewundere wirklich den Sinn der Bienen für kollektive Verantwortung. Obwohl sich einzelne Bienen hin und wieder bekämpfen, herrscht zwischen Ihnen grundsätzlich ein starkes Gefühl für Eintracht und Zusammenarbeit. Wir Menschen gelten als sehr viel weiter entwickelt, doch mitunter rangieren wir sogar hinter kleinen Insekten.
    http://wwwtech.de/
  2. 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

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
    1. 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

      1. 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

        --
        "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
        1. 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

  3. 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