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

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

77
задан 29 April 2017 в 04:01

12 ответов

Если вы хотите запускать их одновременно, вам понадобятся два разных порта. Возможно, вы можете просто изменить конфигурацию apache (httpd.conf) с помощью простого скрипта, который перемещает ту или иную версию в правильное положение перед запуском apache.

0
ответ дан 22 November 2019 в 23:19

Проблемы :

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

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

Решение:

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

  • для а) Создайте отдельный набор конфигураций для apache с разными путями к модулям и отдельным сценарием запуска. И, конечно же, запустите его на отдельном порту.

2
ответ дан 22 November 2019 в 23:19

Для этого вы можете использовать менеджер версий php. Доступны различные менеджеры версий, например:

Мне больше всего нравится phpbrew. Надеюсь, это поможет.

61
ответ дан 22 November 2019 в 23:19

Вы можете запускать 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>

Для полной установки см. связанный вопрос . Не забудьте также взглянуть на две ссылки в заголовке, они выглядят как хорошие руководства (но менее сжатые). Это и То

(не стоит забывать о том, что связанный вопрос является большим без принятого ответа. Метод должен (и работает) нормально, но пользователь забыл использовать и использовал с отключенными короткими тегами, см. комментарии)

20
ответ дан 22 November 2019 в 23:19

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

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

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

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

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

0
ответ дан 22 November 2019 в 23:19

Я установил php 5.6 и 7.0, но кроме всех подсказок, он продолжал работать на 5. 6, так что эта команда экономит день (в моём случае я выбрал вариант 1 и перезапустил apache):

sudo update-alternatives --config php
13
ответ дан 22 November 2019 в 23:19

У меня работает этот: 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 перезапуск
 

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

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

& ast; более конкретно, запустите which php, чтобы узнать, какая версия PHP используется -но это, вероятно, будет указывать на / usr / bin / php , который для me является символической ссылкой на команду / 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
php -m
 

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

6
ответ дан 22 November 2019 в 23:19

Из этого поста я просто упорядочил команды и объяснил, как меня обслуживали (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
3
ответ дан 22 November 2019 в 23:19

Я написал сценарий 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
ответ дан 22 November 2019 в 23:19

У меня была такая же проблема, когда я работал с несколькими проектами. Я сослался на эту статью Но это было похоже на каждый раз, когда мне нужно было переключать версии, если нужно, но это дает гибкость для 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
0
ответ дан 22 November 2019 в 23:19

Вместо того, чтобы создавать несколько VirtualHost , я просто добавляю приведенный ниже код в свой файл .htaccess , и на удивление это сработало,

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

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

1
ответ дан 22 November 2019 в 23:19

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

  • переключитесь на старую версию -
    a2dismod php7.0
    перезапуск службы apache2
  • перейти на более новую версию
    a2enmod php7.0
    перезапуск службы apache2
0
ответ дан 22 November 2019 в 23:19

Другие вопросы по тегам:

Похожие вопросы: