Как запустить несколько версий PHP 5.x на сервере разработки LAMP? - PullRequest
81 голосов
/ 07 февраля 2009

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

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

Ответы [ 9 ]

23 голосов
/ 25 мая 2013

С 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

создать файл /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. переключиться на пользователя 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, НЕ УДАЛЯЙТЕ ЕГО ПОЗЖЕ

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.

17 голосов
/ 07 февраля 2009

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

10 голосов
/ 12 февраля 2009

Наличие нескольких экземпляров 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 ...

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

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 (удалите фактический файл, скопируйте файл альтернативных версий на место и перезапустите apache.

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

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

8 голосов
/ 20 июля 2015

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

4 голосов
/ 23 мая 2013

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

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

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

3 голосов
/ 10 августа 2010

Я только что успешно опустил версию 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

Oulia!

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

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

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

2 голосов
/ 06 декабря 2016

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

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

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

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

0 голосов
/ 14 февраля 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
0 голосов
/ 01 января 2017

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

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

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

...