Подтвердить что ты не робот

Сообщите Apache, чтобы использовать определенную версию PHP, установленную с использованием phpbrew

У меня был установлен пакет PHP, MySQL и Apache для разработки. Эта установка использует файлы конфигурации из:

/etc/apache2/
/etc/php5/

Позже я установил несколько версий PHP, используя phpbrew. Все версии доступны и переключаются с CLI. Но Apache всегда остается в версии по умолчанию, которая не была установлена ​​с помощью phpbrew.

Вот список моих установленных версий PHP.

$ 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)

Я попытался изменить пути к файлам конфигурации, чтобы они указывали на phpbrew PHP. Но ничего не работает.

Как я могу сказать Apache, чтобы использовать PHP-версию phpbrew?

4b9b3361

Ответ 1

Вам нужно создать PHP с apxs2:

1) Убедитесь, что вы установили sudo apt-get install apache2-dev.

2) Выполнить phpbrew install 5.4.22 +apxs2=/usr/bin/apxs2

Затем вы должны увидеть встроенный файл модуля в конфигурационном файле Apache.

Ответ 2

Я написал это, потому что это меня раздражало.

По умолчанию phpbrew switch изменит версию CLI. Чтобы обновить Apache, вам нужно будет сказать, что он использует только что сгенерированный файл .so. На Ubuntu этот файл будет создан как /usr/lib/apache2/modules/libphp$VERSION.so.

Для этого .so файла, который должен быть сгенерирован, вам необходимо установить PHP как:

phpbrew install php-5.6.16 +default +apxs2

В любом случае, здесь оболочка script я использую для переключения версий PHP. Переключиться не удастся, если файл .so не найден, и он попросит sudo привилегии перезапустить Apache.

/дома/Люкер/бен/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

Использование

Попытка переключиться на версию PHP, которая не была создана для Apache:

[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

Успешно переключится на версию PHP, имеющую существующий файл .so:

[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

Ответ 4

Решение, которое я нашел для управления несколькими версиями PHP с сервером Apache, - это запуск PHP-FPM и FastCGI вместо mod_php. Таким образом, я могу запустить несколько версий PHP и выбрать, какие сайты на моей машине разработки я хочу запустить, какую версию PHP.

Вам нужно будет перекомпилировать ваши версии PHP с флагом +fpm phpbrew вместо +apxs2, запустить их с помощью команды phpbrew fpm start, установить пакет Apache libapache2-mod-fastcgi и, возможно, отключить apache mod_php - но это довольно пятно, когда оно работает. Я могу протестировать один и тот же сайт с несколькими версиями PHP, просто сконфигурировав другой виртуальный хост, указывающий на тот же код, но различные сокеты PHP-FPM.

Вот пример конфигурационного файла Apache 2.4 /etc/apache2/mods-enables/fastcgi.conf с двумя версиями PHP, установленными через phpbrew:

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

Затем в вашей конфигурации виртуального хоста apache "сайт" вы можете указать, какую версию PHP следует использовать с псевдонимом, например:

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

Ответ 5

Если phpbrew успешно устанавливает версию php с + apxs2 ext, у вас должен быть новый файл ".so" в библиотеке модуля apache2 (usr/lib/apache2/modules нет /etc/apache 2/mods-available).

Там должна быть php5.load или php7.load, созданная внутри папки /etc/apache 2/mods-available, которая указывает на указанный .so файл.

Файл .so, указанный в этих .load файлах, - это загружаемая версия.

Для переключения между версиями php5 и php7 используйте a2enmod/a2dismod php5 php7.

Вам нужно перезагрузить apache2 после изменения конфигурации.

Если php файлы отображаются как обычный текст, вам нужно либо добавить это в файл php *.load:

Приложение AddType/x-httpd-php.php

ИЛИ, чтобы избежать необходимости редактировать файлы загрузки php каждый раз при установке новой версии, вы можете установить это глобально в файле конфигурации apache2:

  Приложение SetHandler/x-httpd-php

Эти инструкции предназначены для сервера разработки.

Мой персональный script для этого:

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

script запускает список phpbrew от вашего имени и позволяет выбрать версию с помощью цифровых клавиш. Затем он запускает phpbrew-переключатель, а также включает или выключает модули apache2 и перезапускает сервер.