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


81

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

Чи можна налаштувати сервер LAMP для розробки, щоб я міг швидко тестувати програми з декількома версіями PHP5?


Ви повинні мати можливість використовувати змінну PATH, але я не на 100%, тому я не відповідаю за повторення
Malfist

Як використовувати декілька версій PHP (PHP-FPM та FastCGI) з ISPConfig 3 (Ubuntu 12.10) - @ hek2mgl: Питання про засоби розробки не є неточними.
hakre

@hakre Погоджено, що використання FPM зменшить вірогідність того, що кілька версій впливають одна на одну при завантаженні як модуль Apache :)
Ja͢ck

@Jack: Argh, а не модуль Apache, FCGI;)
hakre

Поки що я пробував phpbrew та php-версію, але, здається, вони обидва не змогли скомпілювати PHP.
nice ass

Відповіді:


17

Один із способів зробити це - налаштувати основну версію php за допомогою mod_php і запустити всі інші за допомогою швидкого cgi на різних портах (тобто 81, 82, 83 тощо). Це не гарантує абсолютно послідовної поведінки.


32
Ідея: для PHP 5.2.1 використовуйте порт 10521. Для 5.0.0 використовуйте 10500 :)
Уейн

2
Іншим варіантом було б запустити його за допомогою CGI (або FastCGI) за різними шляхами - тобто / cgi500 /, / cgi528 /, ...
Сіра Пантера

Якщо ви використовуєте Debian і хочете використовувати упаковку, я рекомендую використовувати debootstrap для створення системи chroot, що містить вашу версію PHP, а потім налаштувати Apache всередині chroot'ed системи.
Макс Цепков

23

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

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.


1
Однак це лише відповідь на посилання. Будь ласка, включіть відповідні деталі у відповідь, замість того, щоб повністю покладатися на інший сайт. Посилання мають неприємну проблему, оскільки вони можуть зникнути, і таким чином SO все ще не містить відповідної інформації.
Маартен Бодеус

Можливо, ви захочете заглянути в CloudLinux. Це платне рішення, але воно має прийнятну ціну.
transilvlad

1
Правильна відповідь! Ось таке саме рішення для Ubuntu: howtoforge.com/…
Тобіас Гертнер

10

Наявність декількох екземплярів 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 буде виглядати приблизно так:

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

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

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

Я думаю, що це має спрацювати, але знову ж таки, я не пробував цього, і я, мабуть, не роблю цього, оскільки не маю таких самих вимог, як ви. Коментуйте, якщо хоч колись спробуєте.


8

Примітка: Наступний метод буде працювати на вікнах.

Альтернативним методом (якщо нормально запускати одну версію 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" для запуску та зупинки послуг за потреби. Я додав до нього дві вищезазначені служби.


Це насправді дуже розумне рішення. Якщо ви хочете запускати кілька служб паралельно, ви можете включити Listen 80і Listen 81в кожну ifdefine, відповідно.
caiosm1005

Приємна ідея, але питання стосується сервера LAMP, а не сервера WAMP.
Вініцій Монтейро

4

Розуміючи, що ви, мабуть, говорите про локальну / настільну машину і, мабуть, хотіли б продовжувати говорити про локальну / настільну машину, я запропоную вам альтернативу на той випадок, якщо це може допомогти вам або комусь іншому:

Налаштуйте декілька екземплярів віртуального сервера в хмарі та поділіться між собою своїм кодом як сховище git (або, як я вважаю, ртутним, хоча у мене немає особистого досвіду, все, що вам насправді потрібно, це щось децентралізоване). Ця перевага надає вам якомога ближче виробничий досвід, і якщо у вас є досвід налаштування серверів, це не так вже й складно (або дорого, якщо ви просто хочете закрутити сервер, зробіть те, що вам потрібно зробити, потім знову обертайте, тоді ви говорите про кілька центів, скажімо, 50 центів, до декількох доларів, якщо просто залишити його запущеним).

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


3

Я щойно успішно перейшов на версію 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

Там є кілька людей, котрі підтверджують, що це працює, і це пригостило мене.


хороший сценарій, хоча кармічний для мене не працював, бо я був на Power PC. Я щойно використав сценарій для видалення моєї поточної інсталяції, а потім створив вручну 2.14
Джейсон

2

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

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

Для отримання додаткової інформації я хотів би звернутися до доповіді, яку виголосив пан. Лердорф за адресою https://youtu.be/6XnysJAyThs?t=2864

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


Це, мабуть, IMHO, найкраща відповідь - інша віртуальна машина для кожної версії (але чи можна запускати кілька версій за однією IP-адресою?). Але як би не було іронічно, що творець php повинен це робити - найбільшим недоліком php повинна бути відсутність сумісності між версіями, що робить Joomla, наприклад, поруч марною.
EML

0

У мене є кілька проектів, що працюють на моєму вікні. Якщо ви вже встановили більше однієї версії, цей скрипт 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

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

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

Це також чистий спосіб мати різні php.iniфайли для різних сайтів. Якщо у вас є лише кілька сайтів, якщо це хороший спосіб організувати все, і вам не доведеться турбуватися про більше, ніж 1 сайт за раз, коли ви щось оновите

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.