Ich hatte den PHP-, MySQL- und Apache-Stack für die Entwicklung installiert. Diese Installation verwendet Konfigurationsdateien von:
/etc/Apache2/
/etc/php5/
Später installierte ich mehrere Versionen von PHP mit phpbrew
. Alle Versionen sind über CLI zugänglich und umschaltbar. Apache bleibt jedoch immer auf der Standardversion, die nicht mit phpbrew installiert wurde.
Hier ist eine Liste meiner installierten PHP Versionen.
$ phpbrew list
Installed versions:
php-5.4.13 (/home/admin1/.phpbrew/php/php-5.4.13)
+default -- --with-bz2=/usr
php-5.5.5 (/home/admin1/.phpbrew/php/php-5.5.5)
php-5.3.27 (/home/admin1/.phpbrew/php/php-5.3.27)
Ich habe versucht, die Konfigurationsdateipfade so zu ändern, dass sie auf PHP von phpbrew verweisen. Aber nichts scheint zu funktionieren.
Wie kann ich Apache anweisen, die PHP-Version PHP zu verwenden?
Sie müssen ein PHP mit apxs2
erstellen:
1) Stellen Sie sicher, dass Sie Sudo apt-get install Apache2-dev
installiert haben.
2) phpbrew install 5.4.22 +apxs2=/usr/bin/apxs2
ausführen
Dann sollten Sie die erstellte Moduldatei in Ihrer Apache-Konfigurationsdatei sehen.
Ich habe das Skript geschrieben, weil es mich nervte.
Standardmäßig ändert phpbrew switch
die CLI-Version. Um Apache zu aktualisieren, müssen Sie es anweisen, die neu generierte .so
-Datei zu verwenden. Unter Ubuntu wird diese Datei wie /usr/lib/Apache2/modules/libphp$VERSION.so
erstellt.
Um diese .so
-Datei zu generieren, müssen Sie PHP wie folgt installieren:
phpbrew install php-5.6.16 +default +apxs2
Jedenfalls ist hier das Shell-Skript, das ich zum Wechseln der PHP -Versionen verwende. Der Switch schlägt fehl, wenn die .so
-Datei nicht gefunden wird, und fordert Sudo
-Berechtigungen zum Neustart von Apache an.
#!/usr/bin/env bash
VERSION=$1
SOFILE=/usr/lib/Apache2/modules/libphp$VERSION.so
CONFFILE5=/etc/Apache2/mods-available/php5.load
CONFFILE7=/etc/Apache2/mods-available/php7.load
source ~/.phpbrew/bashrc
if [ -f $SOFILE ]; then
phpbrew switch $VERSION
phpbrew list
if [[ $VERSION == 7* ]]; then
FILECONTENTS="LoadModule php7_module $SOFILE"
CONFFILE=$CONFFILE7
Sudo a2enmod php7
Sudo a2dismod php5
else
FILECONTENTS="LoadModule php5_module $SOFILE"
CONFFILE=$CONFFILE5
Sudo a2enmod php5
Sudo a2dismod php7
fi;
echo $FILECONTENTS > $CONFFILE
echo "AddType application/x-httpd-php .php" >> $CONFFILE
echo "Updated $CONFFILE"
Sudo service Apache2 restart
else
echo $VERSION "is not configured for Apache"
phpbrew list
fi
Versuch, zu einer PHP -Version zu wechseln, die nicht für Apache erstellt wurde:
[21:02:55] luker [~]$ phpbrewswitch 5.4.45
5.4.45 is not configured for Apache
php-5.6.16
php-5.6.10
* php-5.5.30
php-5.4.45
Erfolgreicher Wechsel zu einer PHP Version, die eine .so
-Datei enthält:
[21:03:55] luker [~]$ phpbrewswitch 5.6.16
* php-5.6.16
php-5.6.10
php-5.5.30
php-5.4.45
Updated /etc/Apache2/mods-available/php5.load
Informieren Sie sich in Server Fault post Wie kann ich Apache mitteilen, welches PHP verwendet werden soll?.
Sie müssen die Version von PHP in Apache angeben.
Wenn phpbrew die PHP-Version erfolgreich mit + apxs2 ext installiert, sollten Sie eine neue ".so" -Datei in der Modulbibliothek von Apache2 haben (usr/lib/Apache2/modules nicht in/etc/Apache2/mods-available).
Im Ordner/etc/Apache2/mods-available sollte ein php5.load oder php7.load erstellt werden, das auf die erwähnte .so-Datei verweist.
Die .so-Datei, die in diesen .load-Dateien aufgelistet ist, ist die Version, die geladen wird.
Um zwischen einer php5- und einer php7-Version zu wechseln, verwenden Sie a2enmod/a2dismod php5 php7.
Sie müssen Apache2 nach dem Ändern der Konfiguration neu laden.
Wenn PHP-Dateien als Nur-Text dargestellt werden, müssen Sie dies entweder der PHP * .load-Datei hinzufügen:
AddType-Anwendung/x-httpd-php .php
ODER um zu vermeiden, dass Sie die PHP-Ladedateien bei jeder Installation einer neuen Version bearbeiten müssen, können Sie dies global in Ihrer Apache2-Konfigurationsdatei festlegen:
SetHandler-Anwendung/x-httpd-php
Diese Anweisungen gelten für einen Entwicklungsserver.
Mein persönliches Skript dazu:
#!/bin/bash
i=1
c=1
options=()
while [ $c -gt 0 ]
do
v=$(phpbrew list | sed -n "${i}p")
if [ -z "$v" ]; then
c=0
Elif [ -n "$v" ]; then
options+=("$v")
fi
i=$[$i+1]
done
count=0
printf "\n"
echo 'Available versions:'
for i in "${options[@]}"
do
echo "$i $[$count+1]"
count=$[$count+1]
done
printf "\n"
echo 'Which version should be enabled?'
read selected
chosen="${options[$selected - 1]}"
chosen="$(echo -e "${chosen}" | tr -d '[:space:]')"
chosen="$(echo -e "${chosen}" | sed 's/\*//g')"
chosen="$(echo -e "${chosen}" | sed 's/php-//g')"
echo -e "php-${chosen} to be enabled."
source $HOME/.phpbrew/bashrc
phpbrew switch php-${chosen}
if [[ $chosen =~ ^5 ]]; then
Sudo a2dismod php7
Sudo a2enmod php5
Sudo service Apache2 reload
Elif [[ $chosen =~ ^7 ]]; then
Sudo a2dismod php5
Sudo a2enmod php7
Sudo service Apache2 reload
else echo 'This script only works on php 5 and 7';
fi
Das Skript führt die phpbrew-Liste in Ihrem Namen aus, und Sie können die Version mithilfe der Zehnertastatur auswählen. Es führt dann den phpbrew-Switch aus und schaltet die Apache2-Module ein oder aus und startet den Server neu.
Die Lösung, die ich für die Verwaltung mehrerer PHP -Versionen mit einem Apache-Server gefunden habe, besteht darin, PHP-FPM und FastCGI anstelle von mod_php
auszuführen. Auf diese Weise kann ich mehrere Versionen von PHP ausführen und auswählen, auf welchen Websites meines Entwicklungscomputers ich welche PHP-Version ausführen möchte.
Sie müssen Ihre PHP - Versionen mit dem Flag +fpm
phpbrew anstelle von +apxs2
erneut kompilieren, mit dem Befehl phpbrew fpm start
starten, das Apache libapache2-mod-fastcgi
-Paket installieren und wahrscheinlich Apache mod_php
deaktivieren. Ich kann dieselbe Site mit mehreren Versionen von PHP testen, indem ich einfach einen anderen virtuellen Host konfiguriere, der auf den gleichen Code verweist, jedoch auf andere PHP-FPM-Sockets.
Hier ist ein Beispiel für eine Apache 2.4 /etc/Apache2/mods-enables/fastcgi.conf
-Konfigurationsdatei, bei der 2 Versionen von PHP über phpbrew installiert sind:
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
FastCgiIpcDir /var/lib/Apache2/fastcgi
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
# This is for php 5.6.28
FastCgiExternalServer /usr/lib/cgi-bin/php56-cgi -socket /home/{USERNAME}/.phpbrew/php/php-5.6.28/var/run/php-fpm.sock -pass-header Authorization
# This is for php 7.0.13
FastCgiExternalServer /usr/lib/cgi-bin/php70-cgi -socket /home/{USERNAME}/.phpbrew/php/php-7.0.13/var/run/php-fpm.sock -pass-header Authorization
# this seems to be required by Apache 2.4.10
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
Dann können Sie in Ihrer Apache "Site" Virtualhost-Konfiguration angeben, welche PHP -Version mit einem Alias wie dem folgenden ausgeführt werden soll:
<VirtualHost *:80>
# ServerName, ServerAdmin, etc
DocumentRoot /var/www/my-site-code
# Then point the php5-fcgi handler to a specific version of PHP
# Here is PHP7, as defined in the fastcgi.conf file
Alias /php5-fcgi /usr/lib/cgi-bin/php70-cgi
</VirtualHost>