PHP4 und PHP5 parallel auf dem Mac

Da die meisten Hoster (noch) kein PHP5 anbieten, entwickelt man die meisten PHP-Scripte in PHP4. Jedoch möchte man an mancher Stelle gerne „umswitchen“ zwischen den beiden Versionen – sei es, um sicherzugehen, dass das Script auch unter der neuen Version läuft, oder einfach nur weil man etwas ausprobieren möchte.

Xampp bietet zwar einen PHP-Switcher an, jedoch ist es 1. recht mühsam, wenn man entsprechende Pecl-Module einbinden möchte und 2. ein Problem, wenn man die aktuelle PHP-Version auch auf der Kommandozeile benötigt.

Ein weiterer Ansatz zur Lösung des Problems besteht darin, die PHP5-Scripte mit einer anderen Endung zu versehen und mit einem anderen PHP-Modul (meist dann als CGI installiert) zu parsen. Will man jedoch die Kompatibilität eines Systems testen, wird es schnell zu einer lästigen Aufgabe, ewig die Dateien umzubenennen.

[more]

Ich habe lange nach einer entsprechenden Lösung zu diesem Problem gesucht, bin jedoch leider nicht fündig geworden.
Auf meinem Mac habe ich es dann hinterher über den Umweg zweier PHP-Installationen in unterschiedlichen Ordnern gelöst. Hierfür habe ich die vorkompilierten Versionen von Entropy.ch genutzt. Dabei installiert sich PHP4 im Ordner /usr/local/php, PHP5 dagegen in /usr/local/php5. Die beiden Versionen kommen schon mit einigen vorkompilierten Erweiterungen und können mit phpize entsprechend nachträglich erweitert werden (z. B. Xdebug).

Die Installation der Module schreibt jeweils ein paar Zeilen in die /etc/httpd/httpd.conf, um das entsprechende Modul zu laden.
Um die jeweils andere Version auf dem Server verfügbar zu haben, muss man also nur noch die entsprechenden Zeilen des aktuellen Moduls in der httpd.conf kommentieren, oder man erstellt jeweils eine httpd4.conf und eine httpd5.conf und kopiert mit

sudo cp httpd(4/5).conf httpd.conf

die jeweils gewünschte Datei in die httpd.conf. Das hat jedoch den Nachteil, dass die beiden Dateien ständig untereinander abgeglichen werden müssen.
Eine weitaus bessere Lösung ist es, die jeweiligen Modulzeilen in eine andere Datei auszulagern und die entsprechende Datei dann mittels

Include pfad/zur/datei.conf

am Ende der httpd.conf einzubinden. Wer es noch einfacher mag, kann sich hierfür natürlich ein entsprechendes Shellscript basteln.

Da ja die aktuelle Serversion von PHP mit der lokalen übereinstimmen soll, kann man über das Terminal mit

sudo ln -sf /usr/local/php(5)/bin/php /usr/bin/php

Einen Symlink auf die aktuelle Version setzen. (Wer ein Shellscript geschrieben hat, kann diese Zeilen dann noch hinzufügen). Mann sollte jedoch aus Sicherheitsgründen /usr/bin/php vorher umbenennen und an einen anderen Ort kopieren.

Ein weiteres Problem besteht in den Include-Pfaden der verschiedenen php.ini – schießlich möchte man nicht auf die jeweils unter der anderen Version installierten Pakete verzichten. Bei mir habe ich dies mit dem Hinzufügen der anderen Pfade in der jeweiligen php.ini gelöst. Es gibt aber mit Sicherheit elegantere Methoden.

Zuletzt muss man noch den Apache einmal neu starten, damit alles funktioniert

sudo apachectl graceful

Das Ganze ewig „von Hand“ zu wiederholen ist recht mühsam, daher empfiehlt sich die Erstellung eines entsprechenden Shellscriptes (oder auch zwei, wenn man keine Bedingungen abfragen möchte).

Unter Linux sollte es eigentlich auch funktionieren, ist aber mit Sicherheit mehr Arbeit/Zeitaufwand, da man die beiden Versionen nicht einfach über apt-get oder als rpm installieren kann, sondern mit den jeweiligen Pfaden selbst kompilieren muss, was schon mal recht lange dauern kann.

Wenn jemand einen Tipp hat, wie man das Ganze noch vereinfachen kann, bin ich natürlich überaus dankbar ;)


Ähnliche Artikel

Kommentare

  1. Mathias schrieb am 5.03.06:1

    Hm. Interessant.

    Bis jetzt bin ich immer relativ zufrieden gewesen mit xampp. Es gibt da im Startmenu (Windows halt) einen Eintrag „PHP-Switch“ mit dem das ganz einfach geht, allerdings ist es nicht das, was du wolltest. Es wird einfach umgestellt und das gilt dann global.

    Ich mache es von Anfang an gleich so, dass das Script auf PHP4 sowie auf PHP5 läuft. Mein Webserver läuft momentan noch auf PHP4. Daher schreibe ich alles im localhost (PHP5), kopiere per FTP in einen sicheren (passwortgeschützten) Ordner und teste dann, ob alles funktioniert (PHP4). Dann wird nur noch kopiert… fertig. So kann ich nebenbei auch sichergehen, dass das Script unter den Server-Einstellungen läuft, die sich aber nicht gross von meinen eigenen unterscheiden.

    In Kürze wird mein Webhoster auf PHP5 umsteigen (oder suPHP oder so, wie sich das auch immer nennt). Grundsätzlich ist es mir egal, welche Version läuft, man kann (fast) jede neue Funktion, die in PHP5 auftaucht auch in PHP4 umschreiben und… schwupps… funktioniert.

    Das mit der Kommandozeile: Es gibt zwei Ordner für PHP unter xampp. Ich glaube, in der Mac-Version ist das auch so… Und ein drittes php.ini File von der Version, die gerade aktiv ist. Dort sollten sich auch die anderen Einstellungen befinden. Vielleicht hilft dir das weiter (??)

    Ich denke sowieso, in nächster Zeit ein bisschen von PHP wegzukommen und mit RoR zu liebäugeln. Habe auch schon ein entsprechendes Buch dazu geschnappt. Bin begeistert!

    So, mein Senf.

  2. Julia schrieb am 5.03.06:2

    Unter Windows ist Xampp auch eine feine Sache, da man dann ja die Sachen auch „live“ auf einem Apache sehen kann.
    Bei mir wird es schon von daher schwierig, weil ich auf dem Apache auch andere Module (z. B. mod_python) installiert habe und nicht extra für PHP einen zweiten Apache auf einem eigenen Port und mit eigener Konfiguration laufen lassen möchte.
    Außerdem habe ich auch immer einige VirtualHosts eingerichtet, die dann zwischendurch auch von außen erreichbar sein sollen.

    Mit der Kompatibilität von PHP4/5 gibt es eigentlich auch keine großen Probleme, wenn man auf PHP4 ausgerichtet programmiert. Da vermisse ich allerdings schon manchmal die Möglichkeiten einer Funktion wie _call(), oder die Zugriffseinschränkungen.

    Im Bezug auf RoR: hast du dir Typo schon mal angesehen? Einfach super interessant zu sehen, wie dort die Benutzerverwaltung und die Administration realisiert wurden.

  3. Mathias schrieb am 6.03.06:3

    call() ??
    Kenne ich nicht. Den Befehl findet man auch nicht im Manual (?) Meinst du Backticks? Oder meinst du call_user_func() ?

    Von solchen Funktionen würde ich aufgrund der Ausführgeschwindigkeit abraten, gemäss meiner Erfahrung. Bis jetzt habe ich das ganz gut hinbekommen (YATE ist sogar, je nach Aufgabe, tatsächlich einiges schneller als Smarty!)

    Typo kannte ich noch nicht. Die Seite schient aber im Umbau zu sein, aber ich werde mir mal das Ding genauer anlugen, wenn ich denn Zeit finde ;-)

    Du hast ja eine Linux-Kiste. Da ist das Zeug sehr wahrscheinlich schon drauf (also Apache und so). Da lässt sich sicher PHP4/5 parallel einrichten.

  4. Julia schrieb am 6.03.06:4

    Ich meine schon ___call()_ (irgendwie wird hier ein Unterstrich verschluckt) – eine der neuen „magischen“ Funktionen in PHP5, mit der man dann den Aufruf von nicht existierenden Methoden abfangen kann (automatische Getter und Setter usw.).

    Du hast ja eine Linux-Kiste. Da ist das Zeug sehr wahrscheinlich schon drauf (also Apache und so).
    Mac OSX baut auch auf einem Unix-Kern auf, so dass es von der Konfiguration genauso ist wie Linux. Wäre also die gleiche Arbeit ;)

    So wie es jetzt ist, geht es ja auch – man wechselt ja nicht alle paar Minuten hin und her.

  5. Mathias schrieb am 6.03.06:5

    Oha, ja PEAR habe ich voll vergessen. Ich sollte mich mal genauer damit befassen ;-)

    Lustig, was man bei dir so lernen kann…

  6. Julia schrieb am 6.03.06:6

    Na dann viel Spass beim Quelltext-durchforsten! In ein paar Tagen schreibst du deine Kommentare dann nur noch mit der Syntax von PHP-Documentor und ich muss „Name:“ im Kommentarformular in “@author“ ändern ;)

  7. Mathias schrieb am 7.03.06:7

    $teil1 = ‘Da musst’;
    $teil2 = ‘du wohl’;
    $teil3 = ‘recht haben’;
    $teil4 = ’;)’;

    $out = implode(’ ’, $teil);

    print_r($out);

    ;)

    (Code, also @-Textile-Tag funktioniert irgendwie nicht…)

  8. Julia schrieb am 7.03.06:8

    Schau mal, ob es mit join() klappt – Textile ist mitunter genau so schreibfaul wie ich … ;)
    Wie hast du bloss diesen Smiley hinbekommen… sieht eher aus wie eine mathematische Formel… grübel

    Den “@textile-Tag“ könnte man ja vielleicht sogar noch einbauen…

  9. Mathias schrieb am 7.03.06:9

    Der Code-Hilight-Tag wär (gerade bei dir) von Vorteil.

    Ach ja, und wenn du schon dabei bist­du hast ja eh nichts zu tun ;)­dann kannst du gleich noch LaTeX-Tags einbauen ;) für Formeln und Smilies und so ;)

    Übrigens der Smilie besteht aus Semikolon, Bindestrich und einer normalen Klammer. Mehr nicht, aber sieht lustig aus…

    auf Vorschau klick

    Jetzt muss ich halt so verkrüppelte Smilies machen, ohne Nase ;—)

    (Ha mit — geht´s!)

  10. Julia schrieb am 7.03.06:10

    Der Code-Highlight verträgt sich aber leider irgendwie nicht so richtig mit Textile­aber ich arbeite daran: PHP und Objective-C gehen schon mit Geshi, nur Html macht noch arge Probleme… wenn alles geht, stelle ich auch um – versprochen!

    du hast ja eh nichts zu tun ;)
    Da nimmt man sich mal einen Tag frei… Aber angenehm ist so eine Wurzelspitzenentzündung – im Übrigen ein lustiges Wort für etwas so schmerzhaftes – wirklich nicht.

    Auf LaTeX-Unterstützung verzichte ich dann aber doch lieber – sonst komme ich zu eurem Leidwesen noch darauf, irgendwelche Matrizen oder lineare Gleichungen zu posten ;)

  11. Mathias schrieb am 8.03.06:11

    sonst komme ich zu eurem Leidwesen noch darauf, irgendwelche Matrizen oder lineare Gleichungen zu posten ;)

    Büdde ;—)


Dein Kommentar:

Sämtliche Html-Tags werden gelöscht, der Kommentar kann mit Textile formatiert werden.
Vor dem Absenden müsst ihr euch einmal die Vorschau ansehen.