Сообщите 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?
Ответы
Ответ 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
Ответ 3
Посмотрите на сообщение о неисправности сервера Как сообщить Apache, какой PHP использовать?.
Вам нужно указать версию PHP в Apache.
Ответ 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 и перезапускает сервер.