web-dev-qa-db-de.com

Sagen Sie Apache, dass Sie einen bestimmten verwenden sollen PHP Version installiert mit phpbrew

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?

21
Vinay Aggarwal

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.

34
c9s

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.

/ home/luker/bin/phpbrewswitch

#!/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

Verwendungszweck

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
21
Luke Rodgers

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.

3
aWebDeveloper

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.

1
OB7DEV

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>
0
thaddeusmt