dedlfix: Apache und PHP4 und 5 als Modul gleichzeitig

echo $begrüßung;

Wenn man PHP 4 und PHP 5 gleichzeitig auf einem Apachen laufen lassen möchte, geht das ja nicht so einfach. Das sagen zumindest alle Dokumente, die ich dazu fand.
Es gibt zwar einige Lösungen, wie es "halbwegs" geht:

  • PHP4 als Modul, PHP5 als CGI
  • PHP4 als CGI, PHP5 als Modul
  • beide als CGI (in diversen Varianten)
  • zwei Apache Instanzen, eine mit PHP4 und eine mit PHP5 als Modul [1]

Aber um diese Lösungen geht es mir nicht. Ich suche die Gründe dafür, dass es nicht mit beiden Modul-Versionen in _einer_ Apache-Instanz geht. Oder vielleicht geht es ja doch? [2]

Ich setzte ja große Hoffnung in das in Gentoo umgesetzte Konzept, dessen Ankündigung ich irgendwann einmal las. In einem der neuesten Newsletter fand ich nun Hinweise zu diesem Gentoo-Konzept [3] dessen Freigabe ja auch nur noch ein paar Tage entfernt sein soll.
Doch leider wurde meine Hoffnung enttäuscht. Neben den üblichen Lösungsvorschlägen findet sich unter Mixed PHP4/PHP5 configuration - How to configure Apache to handle PHP4 and PHP5 noch eine Umschaltmöglichkeit [4] (wie auch schon aus Xampp bekannt).

Und auch dieser Satz findet sich dort: "Warning: It's not possible to run PHP4 and PHP5 module together in one Apache server, because both export the same symbols!" Und im Teil nach dem Komma scheint dann wohl auch der Hase im Pfeffer zu liegen.
Doch wie umfangreich sind diese "same symbols". Es kann sich ja wohl nicht nur um den Content-Type-Namen "application/x-httpd-php" handeln? Den zu patchen dürft ja nicht das Problem sein.

Vielleicht gibt es ja ein Dokument, das über diese "symbols" im Apachen ein paar Worte mehr verliert...

echo "$verabschiedung $name";

[1] meine derzeitige Lösung
[2] Was ich mir aber nicht vorstellen kann, sonst hätte sicher jemand diese Lösung schon publiziert.
[3] Hätte ich sicher auch schon früher finden können, bei entsprechend intensiverer Suche. :-)
[4] genau genommen irgendwo im PHP Upgrading Guide

  1. Hi dedlfix,

    Aber um diese Lösungen geht es mir nicht. Ich suche die Gründe dafür, dass es nicht mit beiden Modul-Versionen in _einer_ Apache-Instanz geht. Oder vielleicht geht es ja doch?

    Ohne es zu wissen, glaube ich folgendes - so wird PHP ja als Modul geladen:

    LoadModule php4_module "C:/Server/xampp/php/php4/php4apache2.dll"  
    AddType application/x-httpd-php .php
    

    Und so über CGI:

    ScriptAlias /php4/ "C:/Server/xampp/php/php4/"  
    AddType application/x-httpd-php .php  
    Action application/x-httpd-php "/php4/php.exe"
    

    (in diesem Beispiel jetzt unter Windows mit XAMPP, aber das macht ja keinen großen Unterschied)

    Im zweiten Fall (über CGI) kannst du statt application/x-httpd-php auch irgend/etwas verwenden, weil du es durch AddType ja selber festlegst - wenn du hier zwei verschiedene Mime-Types verwendest kannst du ja eben auch zwei PHP Versionen über CGI realisieren.

    Im ersten Fall (als Modul) wird die Action für application/x-httpd-php nirgendwo von mir festgelegt - es scheint, als würde das Modul das so zur Verfügung stellen bzw. festlegen. Und es legt eben sowohl das PHP4, als auch das PHP5 Modul so fest, weshalb du hier keine zwei Versionen parallel laufen lassen kannst ohne das diese in Konflikt miteinander geraten. Vermutlich würde aber es mit einer leichten Modifizierung des Quellcodes aber gehen...

    Soweit zumindest meine Gedanken zu diesem Thema ;-)

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    That's life - Es gibt im Leben[tm] keine Zurück-Taste. (Fabian Transchel)
    1. echo $begrüßung;

      Im zweiten Fall (über CGI) kannst du statt application/x-httpd-php auch irgend/etwas verwenden, weil du es durch AddType ja selber festlegst - wenn du hier zwei verschiedene Mime-Types verwendest kannst du ja eben auch zwei PHP Versionen über CGI realisieren.

      Ja, so machen es die Versionen, die ein oder beide PHP-CGIs in den Apachen einbinden.

      Im ersten Fall (als Modul) wird die Action für application/x-httpd-php nirgendwo von mir festgelegt - es scheint, als würde das Modul das so zur Verfügung stellen bzw. festlegen.

      Diese Stelle fand ich schon mal in den PHP-Quelltexten. (Ich nehme an, dass es die richtige war.) Da steht in PHP4 und 5 das selbe drin.

      Vermutlich würde aber es mit einer leichten Modifizierung des Quellcodes aber gehen...

      Soweit war das ja mein Gedankengang. Doch ich denke, dass diese Lösung viel zu simpel ist als dass da nicht auch schon Gentoos PHP-Betreuer oder andere draufgekommen wären, die mehr von der Materie des Zusammenspiels zwischen PHP-Modul und dem Apachen wissen als ich.

      echo "$verabschiedung $name";

      1. Hallo,

        Vermutlich würde aber es mit einer leichten Modifizierung des Quellcodes aber gehen...

        Soweit war das ja mein Gedankengang. Doch ich denke, dass diese Lösung viel zu simpel ist als dass da nicht auch schon Gentoos PHP-Betreuer oder andere draufgekommen wären, die mehr von der Materie des Zusammenspiels zwischen PHP-Modul und dem Apachen wissen als ich.

        Hast du auch schon mal daran gedacht, dass die einfach "betriebsblind" sind und gar nicht auf die Idee kommen, mit eingefahrenen Konventionen zu brechen?
        Ich denke nämlich auch, dass application/x-httpd-php ein MIME-Typ ist, der im Apachen nur intern verwendet wird, und den man deswegen auch problemlos anders nennen könnte - aber vielleicht sind die Apache/PHP-Programmierer zu sehr in ihren eigenen Konventionen gefangen, um das ernsthaft in Betracht zu ziehen.

        So long,

        Martin

        1. echo $begrüßung;

          Hast du auch schon mal daran gedacht, dass die einfach "betriebsblind" sind und gar nicht auf die Idee kommen, mit eingefahrenen Konventionen zu brechen?

          Ja, aber den Gedanken verwarf ich wieder. So viele können nicht einfach betriebsblind sein, oder?

          Ich werd mal noch ein bisschen auf Antworten warten und ansonsten mal einen Selbst-(Patch&Compile)-Versuch starten.

          echo "$verabschiedung $name";

          1. echo $begrüßung;

            Ich werd mal noch ein bisschen auf Antworten warten und ansonsten mal einen Selbst-(Patch&Compile)-Versuch starten.

            Also... der erste Versuch ist misslungen.

            System ist immer noch Gentoo¹⁾ mit diesem Apache-Paket: net-www/apache-2.0.54-r30

            ebuild {php-4.3.11/php-5.0.4.ebuild} unpack
            jeweils an alle "application/x-httpd-php" eine 4 oder 5 angehängt.
            ebuild ... compile
            ebuild ... install
            ebuild ... qmerge
            Konfigurationsdateien angepasst (/etc/conf.d/apache2 und die unter /etc/apache2/modules.d)
            /etc/init.d/apache2 start

            Die Requests wurden einfach nicht beantwortet. Der Browser wartete ewig. Fehlermeldungen und interessante Logfile-Einträge gabs auch keine.

            echo "$verabschiedung $name";

            ¹⁾ extra ein neues in einer VM installiert

            1. Hi dedlfix,

              Also... der erste Versuch ist misslungen.
              jeweils an alle "application/x-httpd-php" eine 4 oder 5 angehängt.

              Hm, das wundert mich jetzt ehrlich gesagt schon etwas ... woran könnte es denn sonst noch liegen? Mir fiel gerade so spontan der Apache ein, wäre es möglich, dass da bereits x-httpd-php irgendwo hinterlegt ist?

              Die Requests wurden einfach nicht beantwortet. Der Browser wartete ewig. Fehlermeldungen und interessante Logfile-Einträge gabs auch keine.

              Hast du das Logging Level auch mal ganz hoch gesetzt? Und den Timeout vielleicht noch runter, damits schneller geht?

              MfG, Dennis.

              --
              Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
              Crypt::PasswdMD5 jetzt auch in PHP
              Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher. (Albert Einstein)
              1. echo $begrüßung;

                Also... der erste Versuch ist misslungen.
                jeweils an alle "application/x-httpd-php" eine 4 oder 5 angehängt.

                Hm, das wundert mich jetzt ehrlich gesagt schon etwas ... woran könnte es denn sonst noch liegen? Mir fiel gerade so spontan der Apache ein, wäre es möglich, dass da bereits x-httpd-php irgendwo hinterlegt ist?

                Wie ich ja bereits vermutete liegt der Hund doch tiefer begraben. Bei meinem nächster Versuch habe ich noch die Bezeichner, die mod_info zu den PHP-Modulen ausgab, eindeutig umbenannt. Es handelte sich dabei um php_value, php_flag, php_admin_value, php_admin_flag und PHPINIDir. Die bekamen alle ein 5 hinter das 'php'. Das PHP4-Modul hab ich so gelassen. Die Namen der Module waren bereits unterschiedlich. Das PHP4-Modul heißt sapi_apache2.c und das 5er mod_php5.c.
                Genützt hat das nichts. Das einzelne Einbinden der Module lief ohne Probleme. Mit beiden gleichzeitig konnte ich zwar mod_status und mod_info zu einer Ausgabe bewegen - das ging bei Versuch 1 auch schon nicht. Mir fiel aber auf, dass o.g. Bezeichner im PHP5-Modul wieder den "Ohne-5-Namen" trugen. Und außerdem gab es diesmal Segmentation faults beim Aufruf von PHP-Scripten.

                Damit beende ich diese Versuche und widme mich dem Sammeln von Erfahrung beim Umsetzen der bisher bekannten Lösungsvorschläge, vorwiegend einer "ordentlichen" Zwei-Instanzen-Variante. Bisher war meine zweite Instanz ein Xampp ohne m und f (=FTP).

                echo "$verabschiedung $name";

        2. Hi Martin,

          Ich denke nämlich auch, dass application/x-httpd-php ein MIME-Typ ist, der im Apachen nur intern verwendet wird, und den man deswegen auch problemlos anders nennen könnte.

          Richtig, du kannst das (bei der CGI-Version auch ohne Modifikation des Quellcodes) problemlos tolle/sache oder script/php-parsed nennen - ganz nach belieben.

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Man sollte nie aufhören zu fragen (Albert Einstein)
          ... aber natürlich erst, nachdem man sämliche FAQ's und Archive durchgelesen hat :-P
      2. Hi dedlfix,

        Im ersten Fall (als Modul) wird die Action für application/x-httpd-php nirgendwo von mir festgelegt - es scheint, als würde das Modul das so zur Verfügung stellen bzw. festlegen.

        Diese Stelle fand ich schon mal in den PHP-Quelltexten. (Ich nehme an, dass es die richtige war.) Da steht in PHP4 und 5 das selbe drin.

        Darf ich fragen wo? (Bin zu faul zum Suchen *fg*)

        Wenn man da das eine abändert, z.B. auf application/x-httpd-php5 und dann
        AddType application/x-httpd-php5 .php5
        in der httpd.conf verwendet kann ich mir gut vorstellen, dass das funktioniert.

        Soweit war das ja mein Gedankengang. Doch ich denke, dass diese Lösung viel zu simpel ist als dass da nicht auch schon Gentoos PHP-Betreuer oder andere draufgekommen wären, die mehr von der Materie des Zusammenspiels zwischen PHP-Modul und dem Apachen wissen als ich.

        Wie Martin dir ja bereits gesagt hat - außerdem, warum sollte man zwei PHP Versionen als Modul haben? Was spricht gegen zwei PHP Versionen über CGI? Ich habe mir eh mal sagen lassen, dass die CGI-PHP-Version sicherheitstechnisch für den Mehrbenutzter-Betrieb vorteilhafter, besser bzw. leichter zu handhaben sei.

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Wissen ist gut, Können ist besser, aber das Beste und Interessanteste ist der Weg dahin! (Detlef G.)
        1. echo $begrüßung;

          Diese Stelle fand ich schon mal in den PHP-Quelltexten. (Ich nehme an, dass es die richtige war.) Da steht in PHP4 und 5 das selbe drin.

          Darf ich fragen wo? (Bin zu faul zum Suchen *fg*)

          So schwer ist das mit dem Suchen nicht. Auspacken und suchen lassen. Der Midnight Commander fand in PHP 4.4.0 und 5.0.5 für "application/x-httpd-php" folgende Dateien (Readmes ausgelassen):
          /sapi/apache2handler/sapi_apache2.c (Zeilen 60 und 61 bzw. 62 und 63)
          /sapi/apache2filter/sapi_apache2.c (Zeilen 510, 641 und 643 bzw. 507, 647 und 649)
          /sapi/apache/mod_php4.c (Zeilen 912 und 913 bzw. mod_php5.c Zeilen 921 und 922)
          /main/php.h (Zeile 244 bzw. 235)
          /sapi/apache_hooks/mod_php5.c (nur 5.0.5, Zeilen 1392 und 1393)

          warum sollte man zwei PHP Versionen als Modul haben?

          • Sportlicher Ehrgeiz
          • Die (wenn auch geringen, so doch vorhandenen) Unterschiede zwischend er CGI- und der Modul-Version
          • Der Geschwindigkeitsverlust beim Starten des CGIs?
          • HTTP authentication with PHP

          Es gibt schon einige Gründe, auch wenn sie für der meisten kaum von Bedeutung sind.

          echo "$verabschiedung $name";