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

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

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


person Community    schedule 07.02.2009    source источник
comment
Вы должны иметь возможность использовать переменную PATH, но я не на 100%, поэтому я не отвечаю за репутацию   -  person Malfist    schedule 07.02.2009
comment
Как использовать несколько версий PHP (PHP-FPM и FastCGI) с ISPConfig 3 (Ubuntu 12.10) — @hek2mgl: Вопросы об инструментах разработки не относятся к теме.   -  person hakre    schedule 26.05.2013
comment
@hakre Согласен, использование FPM снизит вероятность того, что несколько версий будут влиять друг на друга при загрузке в виде модуля Apache :)   -  person Ja͢ck    schedule 27.05.2013
comment
@Jack: Argh, а не модуль Apache, FCGI;)   -  person hakre    schedule 27.05.2013
comment
До сих пор я пробовал phpbrew и php-version, но они оба не могут скомпилировать PHP.   -  person nice ass    schedule 27.05.2013


Ответы (9)


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

person Community    schedule 07.02.2009
comment
Идея: для PHP 5.2.1 используйте порт 10521. Для 5.0.0 используйте 10500 :) - person Wayne; 07.02.2009
comment
Другим вариантом может быть запуск с использованием CGI (или FastCGI) по разным путям, например /cgi500/, /cgi528/, ... - person Grey Panther; 12.02.2009
comment
Если вы используете Debian и хотите использовать упаковку, я рекомендую использовать debootstrap для создания системы chroot, содержащей вашу версию PHP, а затем настроить Apache внутри системы с chroot. - person Max Tsepkov; 09.01.2014

В 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, поэтому нам лучше собрать и установить их из суры, это не сложно, суть в том, чтобы установить 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

создать файл /usr/local/php52/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 переключается на корень пользователя, запустите

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, НЕ УДАЛАЙТЕ ЕГО ПОЗЖЕ

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) перезапустить апач. посетите 3 сайта соответственно, чтобы просмотреть phpinfo и проверить результат. то есть:

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

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

person Community    schedule 25.05.2013
comment
Однако это ответ только по ссылке. Пожалуйста, включите соответствующие детали в ответ, вместо того, чтобы полностью полагаться на другой сайт. Ссылки имеют досадную проблему, заключающуюся в том, что они могут исчезнуть, и таким образом SO по-прежнему не содержит соответствующей информации. - person Maarten Bodewes; 29.11.2014
comment
Возможно, вы захотите изучить CloudLinux. Это платное решение, но по приемлемой цене. - person transilvlad; 19.02.2015
comment
Правильный ответ! Вот то же решение для Ubuntu: howtoforge.com/ - person Tobias Gaertner; 15.12.2016

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

Запустите и запустите свой apache и попробуйте настроить его так, как это делают Debian и Ubuntu, например, иметь каталоги для загружаемых модулей. Ваша конфигурация Apache может использовать такие строки:

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

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

php5.2.6.загрузить

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

php5.2.8.загрузить

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

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

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

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

person Community    schedule 12.02.2009

Примечание. Следующий метод будет работать в 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» для запуска и остановки служб по мере необходимости. Я добавил к нему два вышеуказанных сервиса.

person Community    schedule 20.07.2015
comment
На самом деле это очень умное решение. Если вы хотите запустить несколько сервисов параллельно, вы можете включить Listen 80 и Listen 81 в каждый ifdefine соответственно. - person caiosm1005; 06.12.2015
comment
Хорошая идея, но вопрос касается сервера LAMP, а не сервера WAMP. - person Vinicius Monteiro; 07.06.2016

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

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

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

person Community    schedule 23.05.2013

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

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

#! /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 шагов создают сценарий в папке с именем «bin» в вашем домашнем каталоге. Затем вы можете запустить этот скрипт, вызвав следующую команду:

~/bin/myscriptname.sh

Уля!

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

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

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

person Community    schedule 10.08.2010
comment
хороший скрипт, хотя кармический у меня не сработал, потому что я был на Power PC. Я просто использовал скрипт, чтобы удалить текущую установку, а затем вручную собрал 2.14. - person Jason; 03.11.2010

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

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

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

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

person Community    schedule 06.12.2016
comment
Это, вероятно, ИМХО, «лучший» ответ — отдельная виртуальная машина для каждой версии (но можно ли запускать несколько версий на одном IP-адресе?). Но как ни парадоксально, что создатель php должен был это сделать - самым большим недостатком php должно быть отсутствие совместимости между версиями, что делает Joomla, например, почти бесполезной. - person EML; 13.08.2017

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

Не стесняйтесь копировать. Убедитесь, что вы понимаете, как работает код. Это для веб-хостинга. мой локальный ящик, мои моды хранятся в /etc/apache2/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
person Community    schedule 14.02.2017

Для тестирования я просто запускаю несколько экземпляров 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 файлы для разных сайтов. Если у вас есть только пара сайтов, если это хороший способ упорядочить вещи, и вам не нужно беспокоиться о более чем 1 сайте за раз, когда вы что-то обновляете.

person Community    schedule 31.12.2016