Как установить две версии PHP и легко переключаться между ними?


76

Я хочу, чтобы на моей машине с Ubuntu были установлены как PHP 5.2.17, так и PHP 5.3.5, и я должен переключаться по необходимости. Как мне этого добиться?


в Ubuntu есть файл apache.conf в / etc / apache2, я тоже об этом думал, возможно, в будущем я сделаю какой-нибудь пакет, который будет очень полезен для веб-разработчиков

Вы можете сделать это с suPHP, не зная деталей
Marco Ceppi

1
Есть ли что-то вроде Python virtualenv, чтобы иметь чистое изолированное развертывание PHP?
Lenzai

Рассматривали ли вы настройку виртуальных серверов Ubuntu с использованием программного обеспечения для виртуализации, которое вы используете без головы? Я был бы удивлен, если то, что вы хотите сделать, не очень хорошо (не каламбур) такой установки.
Саймон Хоар

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

Вы можете запускать 2 разные версии PHP одновременно, но это не так просто, как просто получить их. Вам нужно запустить одну отдельно установленную версию и подать ее в соответствии с настройками в конфигурации Apache.

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

=== с этой страницы ==

  1. Последним шагом было создание виртуальных хостов. В конце у меня есть три файла в / etc / apache2 / sites-enabled: 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, которые я рекомендую здесь, принадлежат Ондржею Сури, который пакует PHP для Debian (который затем используется Ubuntu), поэтому, хотя он не является официальным репозиторием, он не совсем случайный! Сам PPA здесь

Чтобы добавить 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-on-ubuntu-14-04, так как оно включает в себя раздел по перенастройке nginx для использования другой версии PHP.

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

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

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

Этот PPA поставляется с обычным пакетом php-pear, который предлагает команду pecl для обеих версий PHP, поэтому любые расширения, доступные через PECL, можно установить обычным способом. Вам также понадобятся соответствующие заголовки, поэтому необходимо установить php5.6-dev или php7.0-dev.

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

Как только новое расширение будет доступно в модах, включите и проверьте его, выполнив:

sudo phpenmod extension  
php -m  

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


3

Из этого поста я просто привожу в порядок команды и объясняю по порядку, как меня обслужили (Ubuntu 12.04)

Этот метод дает вам:

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

  2. различные версии PHP установлены на вашем сервере

  3. отдельные файлы conf

Установите все версии, которые вам нужны (у меня есть две)

Установить зависимости:

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 не могут быть установлены из пакетов, поскольку они будут конфликтовать (и попытаться перезаписать одни и те же каталоги).

Решение:

  • для б) Скомпилируйте «другую» версию PHP из исходного кода вручную (или, если хотите, возьмите исходный код соответствующего пакета и измените его, чтобы избежать конфликтов и изменить пути установки)

  • а) Создайте отдельный набор конфигов для 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) с помощью простого скрипта, который перемещает ту или иную версию в правильное положение перед запуском apache.


1
У меня уже установлен PHP 5.3.5. Как я могу установить PHP 5.2.17? Не могли бы вы сказать мне, где и что я должен изменить, чтобы переключиться между этими двумя версиями? Файл httpd.conf пуст в моей установке.
Debiprasad

0

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

Я использовал этот подход один раз.

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

Теперь я думаю, что лучше использовать php-fpm ... но немного сложнее настроить несколько версий php.

Нужно будет запустить несколько php-fpms и настроить Apache на использование друг друга.


3
Добро пожаловать в Спросите 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 Спасибо за обзор, обязательно позаботимся об этом
Шивдхвадж Пандей

0

Это можно сделать, отключив и включив новую версию PHP-

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