Як встановити дві версії PHP та легко перемикатися між ними?


76

Я хочу, щоб і PHP 5.2.17, і PHP 5.3.5 були встановлені на моїй машині Ubuntu і переходили відповідно до моєї потреби. Як я можу цього досягти?


в ubuntu є apache.conf в / etc / apache2, я теж думав про це, можливо, я буду в майбутньому зробити якийсь пакет, який буде дуже корисним для веб-розробників

Це можна зробити за допомогою suPHP, не впевнені в деталях
Marco Ceppi

1
чи є щось подібне до python virtualenv, щоб мати чисті ізольовані розгортання PHP?
lenzai

Чи розглядали ви можливість налаштування віртуальних серверів Ubuntu за допомогою програмного забезпечення для віртуалізації, яке ви використовуєте без голови? Я був би здивований, якщо те, що ви хочете зробити, не буде добре обслуговуватися (жоден каламбур) не налаштований таким чином.
Simon Hoare

1
Визначте, що означає «легко перемикатися». Я використовував це для роботи: мій веб-сервер використовував різні PHP для .phpта .php5файли. Ви також можете налаштувати ваш WWW-сервер для використання різних версій PHP для різних портів (наприклад, http://localhost:80та http://localhost:8080) або різних доменів (наприклад, http://localphp52та http://localphp53), залишивши всю решту структури папок неушкодженими, щоб ви могли легко порівняти запуск однієї веб-програми в двох середовищах, змінивши поточну URL-адреса.
cprn

Відповіді:


61

Для цього можна використовувати менеджер версій php. Доступні різні менеджери версій:

Моя улюблена - phpbrew. Сподіваюся, це допомагає.


2
Спасибі, чи можете ви включити інструкції? (onnu vishadheekarikkamo?)
Тахіони

17
Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Нанна

2
Просто перевірте посилання, які вони мають дійсно гарну документацію на своїх сайтах. Ви дійсно хочете, щоб я копіював і вставляв речі з їх веб-сайту ?.
aneeshep

7
За іронією долі, одна з причин не просто публікувати посилання - це linkrot, від якого зараз страждає ця публікація.
MirroredFate

@aneeshep, не скопіюйте їх вставку документації, а відповідні витяги та кілька рядків про те, що таке "менеджер версій php" та як використовувати / налаштувати її для цієї конкретної проблеми, дійсно вітається.
Матьє

20

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

Це можна зробити, наприклад, за допомогою fastcgi: в основному, ви шукаєте конфігурацію, яку ви бачите на цій сторінці . Ви додаєте в конфігурацію інший обробник на основі потрібної ситуації / порту / домену. Після встановлення обох версій хитрість полягає в цьому кроці:

=== із цієї сторінки ==

  1. Останнім кроком було створення віртуальних хостів. Зрештою, у мене є три файли в / etc / apache2 / sites-включено: 000-default, php5.3.17 та php5.4.7 із наступним вмістом

за замовчуванням:

    <VirtualHost *:80>
      ServerName localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.3.17:

    <VirtualHost *:80>
      ServerName 5317.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.4.7:

    <VirtualHost *:80>
      ServerName 547.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php547.fcgi
      </Directory>
    </VirtualHost>

Дивіться повне встановлення пов'язаного питання . Не забудьте також поглянути на два посилання в заголовку, вони виглядають як приємні підручники (але менш стислі). Це і те

(не варто ставитись перед тим, що пов'язане запитання є великим, без прийнятої відповіді. Метод повинен (і справді) працює нормально, але користувач забув використовувати <?phpта використовувати його <?з відмітками, див. коментарі)


13

Я встановив php 5.6 та 7.0, але, окрім усіх підказок, він продовжував працювати 5.6, тому ця команда економить день (у моєму випадку я вибрав варіант 1 та перезапустіть apache):

sudo update-alternatives --config php

корисно пам'ятати про використання phpinfo()та php -vперехресну перевірку, оскільки вони можуть мати різне значення.
Аді Прасетьо

6

Цей для мене працює: https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu

Те саме, що сценарій з "Growling Flea", але з використанням нових версій.

Додайте PPA

Пакети PHP 5.6 та PHP 7.0 - від сторонніх PPA, не наданих офіційними сховищами Ubuntu від Canonical. Параметри PPA, які я рекомендую тут, є від Ondřej Surý, який пакує PHP для Debian (який потім використовується Ubuntu), тому, хоча це не офіційний сховище, він не зовсім випадковий! Сам ППА тут

Щоб додати PPA до налаштування:

sudo add-apt-repository ppa:ondrej/php  

Тоді ми також захочемо взяти інформацію про те, що пропонується з цього нового PPA, тож запустіть:

sudo apt-get update   

Встановіть нові версії PHP

У мене вже були встановлені деякі пакети php5, але я нічого не видалив, я просто дозволив apt розібратися, що він хотів зробити, коли попросив його встановити нові версії:

sudo apt-get install php5.6 php7.0

Це призвело до великої кількості скарг на вдалі та чимало конфліктів. Перша запропонована резолюція полягала в тому, щоб видалити всі пакети запасів php5, щоб PHP 5.6 міг бути встановлений - тому я просто прийняв першу пропозицію.

Я використовую apache, тому ця установка дала мені apache з модулями php5.6 та php7.0, а модуль php5.6 фактично завантажений.

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

Налаштування та перемикання версій

Тепер у вас є дві повністю окремі версії PHP, встановлені у вашій системі, так що давайте подивимось, куди пішли всі шматки!

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

Я користувач apache, і як я вже згадував, обидва модулі доступні. Отже, щоб перейти від одного до іншого, мені потрібно зробити:

sudo a2dismod php5.6
sudo a2enmod php7.0
sudo service apache2 restart

Для користувачів nginx зміни майже так само просто, Digital Ocean має гарну документацію щодо цього (у них є чудові документи!), Тому перегляньте їх посібник: https://www.digitalocean.com/community/tutorials/how-to- оновлення до php-7-на-ubuntu-14-04, оскільки воно містить розділ про перенастроювання nginx для використання іншої версії PHP.

У командному рядку у мене є як php5.6, так і php7.0. У мене ще є команда php - загляньте в / etc / alternative, щоб побачити, що вона посилається на певну версію PHP cli *. Ви також можете швидко перевірити, який ваш використовується, запустивши php -v.

* точніше, запустіть який php, щоб побачити, яка версія PHP використовується - але це, ймовірно, вкаже на /usr/bin/php, що для мене само по собі є символьним посиланням на /etc/alternatives/phpкоманду.

Робота з розширеннями

Цей PPA постачається зі звичайним пакетом php-pears, який пропонує команду pecl для обох версій PHP, тому будь-які розширення, доступні через PECL, можна встановити звичайним способом. Вам також знадобляться відповідні заголовки, тому слід встановити або php5.6-dev, або php7.0-dev.

Коли інсталяція pecl завершиться, ви отримаєте примітку, щоб додати файл * .so до свого php.ini; насправді найкраще тут зробити, це подивитися на те, що є /etc/php/mods-available. Тут вже будуть деякі модулі, кожен у своєму власному файлі, названому за розширенням та закінчуючи inini. Ви можете скопіювати його для використання в якості шаблону або створити свій власний і покласти в нього всю відповідну конфігурацію для розширення (як мінімум, що потрібно extension=[extensionName].so).

Після того, як нове розширення буде доступним у модах, увімкніть та перевірте це, зробивши:

sudo phpenmod extension  
php -m  

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


3

З цієї посади я просто впорядкував команди та пояснював порядок, як мені служили (Ubuntu 12.04)

Цей метод дає вам:

  1. сценарій з меню, що дозволяє перемикатися між встановленими версіями php (не обома одночасно)

  2. різні версії PHP, встановлені на вашому сервері

  3. окремі файли конф

Встановіть всі необхідні вам версії (у мене є дві)

Встановити залежності:

sudo apt-get install flex apache2-threaded-dev libxml2-dev apache2 apache2-mpm-prefork apache2-threaded-dev apache2-utils apache2.2-bin apache2.2-common

Встановіть PHP 5.3 вперше. Завантажте джерела PHP

md5sum Downloads/php-5.3.10.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.3.10.tar.bz2 .
tar xjf php-5.3.10.tar.bz2
cd php-5.3.10/
sudo mkdir /usr/local/php/php_5.3.10

Встановіть PHP5.6 вперше. Завантажте джерела PHP

md5sum Downloads/php-5.6.11.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.6.11.tar.bz2 .
tar xjf php-5.6.11.tar.bz2
cd php-5.6.11/
sudo mkdir /usr/local/php/php-5.6.11

Версії менеджера сценаріїв PHP: Створіть названий файл php.shі помістіть його /bin/:

#!/bin/bash
opcion=0
cat << CABECERAMENU
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
CABECERAMENU
echo -n "Ingrese su eleccion: "
read opcion
echo
case $opcion in
    "1")
        rm /etc/apache2/php.conf
        ln -s /usr/local/php/php_5.3.10.conf /etc/apache2/php.conf
        /etc/init.d/apache2 restart
    ;;
    "2")
        rm /etc/apache2/php.conf
        ln -s /usr/local/php/php_5.6.11.conf /etc/apache2/php.conf
        /etc/init.d/apache2 restart
    ;;
    *)
        echo "Opcion no valida"
    ;;
esac

Скомпілюйте та встановіть php 5.3:

cd ~/Sources/php-5.3.10/
sudo ./configure --prefix=/usr/local/php/php_5.3.10 --with-config-file-path=/usr/local/php/php_5.3.10/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-zip --with-gd --with-curl --with-xmlrpc --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql --with-pdo-pgsql --enable-soap
sudo make clean
sudo make
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/lib/apache2/modules/libphp5.*
sudo make install
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/local/php/php-5.3.10/modules/libphp5.so
sudo mv /usr/lib/apache2/modules/libphp5.so /usr/local/php/php_5.3.10/modules/
ls -lhart /usr/local/php/php_5.3.10/modules/
sudo a2dismod php5
sudo service apache2 restart

Скомпілюйте та встановіть php 5.6

cd ~/Sources/php-5.6.11
sudo ./configure --prefix=/usr/local/php/php_5.6.11 --with-config-file-path=/usr/local/php/php_5.6.11/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-zip --with-gd --with-curl --with-xmlrpc --enable-calendar --enable-sockets --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql  --with-pdo-pgsql --enable-soap
sudo make clean
sudo make
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/lib/apache2/modules/libphp5.*
sudo make install
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/local/php/php_5.6.11/modules/libphp5.so
sudo mv /usr/lib/apache2/modules/libphp5.so /usr/local/php/php_5.6.11/modules
ls -lhart /usr/local/php/php_5.6.11/modules
sudo a2dismod php5
sudo service apache2 restart

Давайте їх використовувати:

$ sudo php.sh
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
Ingrese su eleccion: 1

 * Restarting web server apache2                                                                                                                                                                                                                                        apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

2

Проблеми:

  1. Один екземпляр apache не може одночасно запускати дві різні версії PHP (принаймні, наскільки я це знаю).

  2. Неможливо встановити дві різні версії PHP з пакетів, оскільки вони конфліктуватимуть (і спробуйте перезаписати ті самі каталоги).

Рішення:

  • для b) Скомпілюйте „іншу” PHP-версію з джерела вручну (або, якщо вам зручніше, візьміть джерело відповідного пакета та змініть його, щоб уникнути конфліктів та змінити шляхи встановлення)

  • для a) Створіть окремий набір конфігурацій для apache з різними шляхами модулів та окремим сценарієм запуску. І звичайно запустити його на окремому порту.


немає попередньо упакованого сценарію для компіляції цих декількох екземплярів паралельної php? Просто зробити це вручну та прокласти патчі? Так це означає, що всі хостингові компанії розробляють там власні сценарії, щоб запустити ці паралельні версії і ніколи не ділити зусиль.
lenzai

4
Один екземпляр apache може запускати одразу 2 версії php.
Нанна

1

Замість того, щоб робити кілька, VirtualHostя просто додаю наведений нижче код у свій .htaccessфайл і на диво він працював,

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
</FilesMatch>

Вузол: я вже встановив php7.2-fpmперед використанням коду.


0

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


1
У мене вже встановлено PHP 5.3.5. Як я можу встановити PHP 5.2.17? Скажіть, будь ласка, де і що я повинен змінити для переключення між цими двома версіями? Файл httpd.conf порожній у моїй установці.
Дебіпрасад

0

Ви також можете запускати кожен веб-сайт із різними користувачами. Більш безпечний.

Я використовував цей засіб один раз.

http://blog.servergrove.com/2011/08/22/how-to-setup-multiple-php-versions-on-apache/

Тепер я думаю, що краще використовувати php-fpm ... але налаштувати кілька версій php це складніше.

Потрібно запустити кілька php-fpms і встановити apache для використання один одного.


3
Ласкаво просимо до Ask Ubuntu! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
user98085

У мене не було часу, щоб зробити так, як ви сказали. Я здогадуюсь, я хотів лише показати спосіб. Потрібно навчитися користуватися формуючими матеріалами. Все одно, дякую!
Анріке Фернандес

0

Я написав скрипт bash, який дозволяє мені легко перемикатися між встановленими версіями php на своєму вікні. Я запускаю кілька віртуальних хостів, тому що у мене є кілька веб-проектів із клієнтами, які мають старі та нові програми. Деякі з цих проектів вимагають старіших версій php, а інші проекти вимагають php7.0.

Прочитайте мої коментарі та переконайтесь, що ви розумієте, що відбувається перед тим, як користуватися цим.

#!/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

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

Перехід від php5.6 до php7.0

Для Apache ми можемо використовувати команду як:

sudo a2dismod php5.6 ; sudo a2enmod php7.0 ; sudo service apache2 restart

Для CLI ми можемо використовувати команду як:

sudo update-alternatives --set php /usr/bin/php7.0

Перехід від php7.0 до php5.6

Для Apache ми можемо використовувати команду як:

sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart

Для CLI ми можемо використовувати команду як:

sudo update-alternatives --set php /usr/bin/php5.6

Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. - З огляду
waltinator

@waltinator Дякую за відгук, обов'язково подбайте про це
Shivdhwaj Pandey

0

Це можна зробити, відключивши та включивши нову версію PHP-

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