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

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

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

9 ответов


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


С 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.икс серии имеют 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) установите необходимые пакеты dev

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/

Configue на PHP-МПФ

редактировать /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) Создайте корень веб-документа и удалите индекс.php под ним показать phpinfo переключитесь на пользователя root, run

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) перезапустите apache. посетите 3 сайтах respectly для просмотра phpinfo и проверить результат. т. е.:

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

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


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

запустите 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 ...

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

рнр5.2.6.загрузить

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

рнр5.2.8.загрузить

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

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

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

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


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


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

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

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


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

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

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

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

Oulia!

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

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

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


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

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

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

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


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

Не стесняйтесь копировать. Убедитесь, что вы понимаете, как работает код. Это для webhostin. мой локальный ящик мои моды хранятся в /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=  #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

для тестирования я просто запускаю несколько экземпляров 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 сайта в то время, когда вы обновляете что-то