Как можно запускать несколько версий PHP 5.x на сервере LAMP разработки?

Мне нужно протестировать свои PHP-приложения с несколькими версиями PHP 5.x, такими как PHP 5.0.0 и PHP 5.2.8.

Есть ли способ настроить сервер LAMP разработки, чтобы я мог быстро протестировать приложения с несколькими версиями PHP5?

Ответ 1

Один из способов сделать это - настроить свою основную версию php с помощью mod_php и запустить все остальные с помощью быстрого cgi на разных портах (т.е. 81, 82, 83 и т.д.). Это не гарантирует полностью совместимое поведение.

Ответ 2

С CentOS вы можете сделать это, используя комбинацию fastcgi для одной версии PHP и php-fpm для другого, как описано здесь:

https://web.archive.org/web/20130707085630/http://linuxplayer.org/2011/05/intall-multiple-version-of-php-on-one-server

Основано на CentOS 5.6, только для Apache

1. Включить репозиторий rpmforge и epel yum

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
sudo rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
sudo rpm -ivh epel-release-5-4.noarch.rpm

2. Установите php-5.1

CentOS/RHEL 5.x имеют php-5.1 в поле, просто установите его с помощью yum, например:

sudo yum install php php-mysql php-mbstring php-mcrypt

3. Скомпилируйте и установите php 5.2 и 5.3 из источника

Для php 5.2 и 5.3 мы можем найти множество пакетов rpm в Интернете. Тем не менее, все они конфликтуют с php, который поставляется с CentOS, поэтому, лучше построить и установить их из soure, это не сложно, нужно установить php в другом месте.

Однако при установке php в качестве модуля apache мы можем использовать только одну версию php одновременно. Если нам нужно запустить другую версию php на том же сервере, в то же время, например, для другого виртуального хоста может потребоваться другая версия php. К счастью, прохладные FastCGI и PHP-FPM могут помочь.

Создайте и установите php-5.2 с включенным fastcgi

1) Установите необходимые пакеты разработчика

yum install gcc libxml2-devel bzip2-devel zlib-devel \
    curl-devel libmcrypt-devel libjpeg-devel \
    libpng-devel gd-devel mysql-devel

2) Скомпилируйте и установите

wget http://cn.php.net/get/php-5.2.17.tar.bz2/from/this/mirror
tar -xjf php-5.2.17.tar.bz2
cd php-5.2.17
./configure --prefix=/usr/local/php52 \
    --with-config-file-path=/etc/php52 \
    --with-config-file-scan-dir=/etc/php52/php.d \
    --with-libdir=lib64 \
    --with-mysql \
    --with-mysqli \
    --enable-fastcgi \
    --enable-force-cgi-redirect \
    --enable-mbstring \
    --disable-debug \
    --disable-rpath \
    --with-bz2 \
    --with-curl \
    --with-gettext \
    --with-iconv \
    --with-openssl \
    --with-gd \
    --with-mcrypt \
    --with-pcre-regex \
    --with-zlib
make -j4 > /dev/null
sudo make install
sudo mkdir /etc/php52
sudo cp php.ini-recommended /etc/php52/php.ini

3) создайте обертку fastcgi script

создать файл /usr/local/php 52/bin/fcgiwrapper.sh

#!/bin/bash
PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS
exec /usr/local/php52/bin/php-cgi
chmod a+x /usr/local/php52/bin/fcgiwrapper.sh
Build and install php-5.3 with fpm enabled

wget http://cn.php.net/get/php-5.3.6.tar.bz2/from/this/mirror
tar -xjf php-5.3.6.tar.bz2 
cd php-5.3.6
./configure --prefix=/usr/local/php53 \
    --with-config-file-path=/etc/php53 \
    --with-config-file-scan-dir=/etc/php53/php.d \
    --enable-fpm \
    --with-fpm-user=apache \
    --with-fpm-group=apache \
    --with-libdir=lib64 \
    --with-mysql \
    --with-mysqli \
    --enable-mbstring \
    --disable-debug \
    --disable-rpath \
    --with-bz2 \
    --with-curl \
    --with-gettext \
    --with-iconv \
    --with-openssl \
    --with-gd \
    --with-mcrypt \
    --with-pcre-regex \
    --with-zlib 

make -j4 && sudo make install
sudo mkdir /etc/php53
sudo cp php.ini-production /etc/php53/php.ini

sed -i -e 's#php_fpm_CONF=\${prefix}/etc/php-fpm.conf#php_fpm_CONF=/etc/php53/php-fpm.conf#' \
    sapi/fpm/init.d.php-fpm
sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
sudo chmod a+x /etc/init.d/php-fpm
sudo /sbin/chkconfig --add php-fpm
sudo /sbin/chkconfig php-fpm on

sudo cp sapi/fpm/php-fpm.conf /etc/php53/

Конфигурировать php-fpm

Измените/etc/php53/php-fpm.conf, измените некоторые параметры. Этот шаг в основном состоит в том, чтобы раскомментировать некоторые настройки, вы можете отрегулировать значение, если хотите.

pid = run/php-fpm.pid
listen = 127.0.0.1:9000
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

Затем запустите fpm

sudo /etc/init.d/php-fpm start

Установка и настройка mod_fastcgi, mod_fcgid

sudo yum install libtool httpd-devel apr-devel
wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
tar -xzf mod_fastcgi-current.tar.gz
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
sudo make top_dir=/usr/lib64/httpd/ install
sudo sh -c "echo 'LoadModule fastcgi_module modules/mod_fastcgi.so' > /etc/httpd/conf.d/mod_fastcgi.conf"
yum install mod_fcgid

Настройка и тестирование виртуальных хостов

1) Добавьте следующую строку в /etc/hosts

127.0.0.1 web1.example.com web2.example.com web3.example.com

2) Создайте корень веб-документа и снимите index.php под ним, чтобы показать phpinfo переключитесь на root пользователя, запустите

mkdir /var/www/fcgi-bin
for i in {1..3}; do
    web_root=/var/www/web$i
    mkdir $web_root
    echo "<?php phpinfo(); ?>" > $web_root/index.php
done

Примечание. Пустой каталог /var/www/fcgi -bin необходим, НЕ СНИМАЙТЕ IT LATER

3) Создайте конфигурационный файл Apache (добавьте в httpd.conf)

NameVirtualHost *:80

# module settings
# mod_fcgid
<IfModule mod_fcgid.c>
        idletimeout 3600
        processlifetime 7200
        maxprocesscount 17
        maxrequestsperprocess 16
        ipcconnecttimeout 60 
        ipccommtimeout 90
</IfModule>
# mod_fastcgi with php-fpm
<IfModule mod_fastcgi.c>
        FastCgiExternalServer /var/www/fcgi-bin/php-fpm -host 127.0.0.1:9000
</IfModule>


# virtual hosts...

#################################################################
#1st virtual host, use mod_php, run php-5.1
#################################################################
<VirtualHost *:80>
        ServerName web1.example.com
        DocumentRoot "/var/www/web1"

        <ifmodule mod_php5.c>
                <FilesMatch \.php$>
                        AddHandler php5-script .php
                </FilesMatch>
        </IfModule>

        <Directory "/var/www/web1">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>
#################################################################
#2nd virtual host, use mod_fcgid, run php-5.2
#################################################################
<VirtualHost *:80>
        ServerName web2.example.com
        DocumentRoot "/var/www/web2"

        <IfModule mod_fcgid.c>
                AddHandler fcgid-script .php
                FCGIWrapper /usr/local/php52/bin/fcgiwrapper.sh
        </IfModule>

        <Directory "/var/www/web2">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks +ExecCGI
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>
#################################################################
#3rd virtual host, use mod_fastcgi + php-fpm, run php-5.3
#################################################################
<VirtualHost *:80>
        ServerName web3.example.com
        DocumentRoot "/var/www/web3"


        <IfModule mod_fastcgi.c>
                ScriptAlias /fcgi-bin/ /var/www/fcgi-bin/
                AddHandler php5-fastcgi .php
                Action php5-fastcgi /fcgi-bin/php-fpm
        </IfModule>

        <Directory "/var/www/web3">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks +ExecCGI
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>

4) перезапустите apache. посетите 3 сайта с уважением, чтобы просмотреть phpinfo и подтвердить результат. то есть:

http://web1.example.com
http://web2.example.com
http://web3.example.com

Если все ОК, вы можете использовать один из 3 виртуальных хостов в качестве шаблона для создания нового виртуального хоста с требуемой версией php.

Ответ 3

Наличие нескольких экземпляров apache + php никогда не щекотало мою фантазию, но это, вероятно, самый простой способ сделать это. Если вы не чувствуете себя KISS... здесь идея.

Получите ваш apache и выполняйте его, и попробуйте настроить его как debian и ubuntu, например, иметь каталоги для загруженных модулей. Ваш apache conf может использовать следующие строки:

Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

Затем создайте свою первую версию php и дайте ей префикс с явно указанным номером версии, например, /usr/local/php/ 5.2.8,/usr/local/php/5.2.6...

Конф/загрузка будет выглядеть примерно так:

php5.2.6.load

LoadModule php5_module /usr/local/php/5.2.6/libphp5.so

php5.2.8.load

LoadModule php5_module /usr/local/php/5.2.8/libphp5.so

Чтобы переключать версии, все, что вам нужно сделать, это изменить загрузку и файлы conf из каталога, в котором apache включает включение для других версий. Вы можете автоматизировать это с помощью простого bash script (удалить фактический файл, скопировать файл альтернативных версий на место и перезапустить apache.

Одним из преимуществ этой настройки является то, что все является последовательным, так что вы сохраняете php.ini одинаково с точки зрения опций и модулей (которые вам все равно придется делать с CGI). Все они проходят через SAPI. Ваши приложения не будут нуждаться в каких-либо изменениях и не должны использовать относительные URL-адреса.

Я думаю, что это должно сработать, но опять же, я не пробовал, и не могу этого сделать, так как у меня нет таких же требований, как у вас. Сделайте комментарий, если вы когда-нибудь попытаетесь.

Ответ 4

Примечание. Следующий метод будет работать в Windows.

Альтернативный метод (если нормально запускать одну версию PHP за раз) заключается в определении нескольких служб Apache, каждый из которых будет использовать другую версию PHP.

Прежде всего используйте условия в файле конфигурации Apache:

 <ifdefine php54>
    SetEnv PHPRC C:/apache/php54/
    ScriptAlias /php/ "C:/apache/php54/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

<ifdefine php55>
    SetEnv PHPRC C:/apache/php55/
    ScriptAlias /php/ "C:/apache/php55/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

Теперь, используя httpd.exe, создайте две отдельные службы из командной строки (повышенные до администратора):

httpd.exe -k install -n Apache224_php54 -D php54

httpd.exe -k install -n Apache224_php55 -D php55

Теперь вы можете запустить одну из указанных выше служб за раз (если вы закроете один из них перед запуском другого).

Если вы ранее устанавливали Apache как услугу, вы можете удалить это, используя следующую команду (замените имя службы тем, которое вы использовали):

apache -k uninstall -n Apache224

Еще одно замечание заключается в том, что я лично использую "программу значков области уведомлений" под названием "Seobiseu" для запуска и остановки служб по мере необходимости. Я добавил к нему два вышеупомянутых сервиса.

Ответ 5

Понимая, что вы, вероятно, говорите о локальном/настольном компьютере и, вероятно, хотите продолжить разговор о локальной/настольной машине, я брошу альтернативу для вас на всякий случай, если это может помочь вам или кому-то еще

Настройте несколько экземпляров виртуального сервера в облаке и поделитесь своим кодом между ними как хранилищем git (или меркуриальным, я полагаю, хотя у меня нет личного опыта, все, что вам действительно нужно, это что-то децентрализованное). Это дает вам возможность максимально приблизиться к производственному опыту, и если у вас есть опыт настройки серверов, тогда это не так сложно (или дорого, если вы просто хотите закрутить сервер, сделайте то, что вам нужно сделать, затем снова разверните его, тогда вы говорите о нескольких центах, чтобы сказать 50 центов, до нескольких долларов, если вы просто оставите его в рабочем состоянии).

В наши дни я делаю всю свою разработку проекта в облаке, и мне было намного проще управлять инфраструктурой, чем когда-либо, когда я использую локальные/не виртуализированные установки, и это делает этот вид побочных действий, сценарий довольно прямолинейный. Я просто хотел бросить эту идею, если бы вы ее не рассматривали.

Ответ 6

Я только что успешно отказался от PHP5.3 на Ubuntu 10.

Для этого я использовал следующий script:

#! /bin/sh
php_packages=`dpkg -l | grep php | awk '{print $2}'`

sudo apt-get remove $php_packages

sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/karmic.list

sudo mkdir -p /etc/apt/preferences.d/

for package in $php_packages;
do echo "Package: $package
Pin: release a=karmic
Pin-Priority: 991
" | sudo tee -a /etc/apt/preferences.d/php
done

sudo apt-get update

sudo apt-get install $php_packages

Для тех, кто не знает, как запускать скрипты из командной строки, вот краткий учебник:

1. cd ~/
2. mkdir bin
3. sudo nano ~/bin/myscriptname.sh
4. paste in the script code I have posted above this
5. ctrl+x (this exits and prompts for you to save)
6. chmod u+x myscriptname.sh

Эти 6 шагов создают script в папке с именем "bin" в вашем домашнем каталоге. Затем вы можете запустить этот script, вызвав следующую команду:

~/bin/myscriptname.sh

Oulia

Надеюсь, это поможет некоторым из вас!

Для справки, вот где я получил script: PHP5.2.10 для Ubuntu 10

Есть несколько человек, которые все подтверждают, что это работает, и это сработало для меня.

Ответ 7

Расмус Лердорф, создавший PHP, поддерживает активное бродячее решение, которое, кажется, решает ваши потребности. Он позволяет быстро переключаться между версиями PHP, в настоящее время поддерживает более 20 различных версий. Он выходит из коробки с сервером nginx, но может быть легко переключен на apache2 с предварительно настроенной настройкой. Он также поддерживает MySQL из коробки.

Таким образом, у вас будет доступ ко всем версиям PHP, которые можно развернуть на двух основных веб-серверах, в хорошем брандмауэре, поддерживаемом большим человеком за PHP.

Для получения дополнительной информации я хотел бы сослаться на сообщение, данное г-ном. Лердорф в https://youtu.be/6XnysJAyThs?t=2864

Репозиторий github, содержащий решение Vagrant, находится в https://github.com/rlerdorf/php7dev

Ответ 8

Вот ссылка, описывающая процедуру. Это лучшее, что я до сих пор встречал. В настоящее время я успешно использую PHP 5.4 для старого проекта, PHP 5.6 для новых проектов, Тестирование Wordpress как на HHVM, так и на PHP 7. Мне потребовалось некоторое время, чтобы настроить со многими хитами и пробными версиями, но теперь он работает плавно. Мой следующий подход - научиться перемещать их в докеры.

Ответ 9

Для тестирования я просто запускаю несколько экземпляров httpd на разных IP-адресах, поэтому у меня есть php7, работающий на 192.168.0.70 и php5.6, работающий на 192.168.0.56. В производстве у меня есть сайт, на котором запущен старый oscommerce с php5.3, и у меня просто есть другой файл conf для сайта

httpd -f/etc/apache2/php70.conf httpd -f/etc/apache2/php53.conf

Это также чистый способ иметь разные файлы php.ini для разных сайтов. Если у вас просто есть несколько сайтов, если у вас есть хороший способ сохранить организованность, и вам не нужно беспокоиться о более чем одном сайте за раз, когда вы что-то обновляете

Ответ 10

У меня есть несколько проектов, работающих на моем ящике. Если вы уже установили несколько версий, этот bash script должен помочь вам легко переключиться. На данный момент у меня есть php5, php5.6 и php7.0, которые я часто swtich взад и вперед в зависимости от проекта, над которым я работаю. Вот мой код.

Не стесняйтесь копировать. Убедитесь, что вы понимаете, как работает код. Это для webhostin. мой локальный ящик мои моды хранятся в /etc/apache 2/mods-enabled/

    #!/bin/bash
# This file is for switching php versions.  
# To run this file you must use bash, not sh
# 
    # OS: Ubuntu 14.04 but should work on any linux
# Example: bash phpswitch.sh 7.0
# Written by Daniel Pflieger
# growlingflea at g mail dot com

NEWVERSION=$1  #this is the git directory target

#get the active php enabled mod by getting the array of files and store
#it to a variable
VAR=$(ls /etc/apache2/mods-enabled/php*)

#parse the returned variables and get the version of php that is active.
IFS=' ' read -r -a array <<< "$VAR"
array[0]=${array[0]#*php}
array[0]=${array[0]%.conf}


#confirm that the newversion veriable isn't empty.. if it is tell user 
#current version and exit
if [ "$NEWVERSION" = "" ]; then
echo current version is ${array[0]}.  To change version please use argument
exit 1
fi 

OLDVERSION=${array[0]}
#confirm to the user this is what they want to do
echo "Update php"  ${OLDVERSION} to ${NEWVERSION}


#give the user the opportunity to use CTRL-C to exit ot just hit return
read x

#call a2dismod function: this deactivate the current php version
sudo a2dismod php${OLDVERSION}

#call the a2enmod version.  This enables the new mode
sudo a2enmod php${NEWVERSION} 

echo "Restart service??"
read x

#restart apache
sudo service apache2 restart