Jak zainstalować dwie wersje PHP i łatwo przełączać się między nimi?


76

Chcę mieć zarówno PHP 5.2.17, jak i PHP 5.3.5 zainstalowane na moim komputerze Ubuntu i przełączać się zgodnie z potrzebą. Jak mogę to osiągnąć?


w Ubuntu jest apache.conf w / etc / apache2, też o tym myślałem, może w przyszłości zrobię jakiś pakiet, który byłby bardzo przydatny dla programistów stron

Możesz to zrobić za pomocą suPHP, nie będąc pewnym szczegółów
Marco Ceppi

1
czy istnieje coś takiego jak Python virtualenv, aby mieć czyste izolowane wdrożenia PHP?
lenzai

Czy zastanawiałeś się nad utworzeniem wirtualnych serwerów Ubuntu przy użyciu oprogramowania do wirtualizacji, którego używasz w sposób bezgłowy? Byłbym zaskoczony, gdyby to, co chcesz zrobić, nie jest dobrze obsłużone (nie jest to gra słów zamierzona) w takiej konfiguracji.
Simon Hoare

1
Zdefiniuj, co to znaczy „łatwo przełączać”. Użyłem tego do pracy: mój serwer używał innego PHP dla plików .phpi .php5. Możesz również skonfigurować swój serwer WWW, aby używał różnych wersji PHP dla różnych portów (jak http://localhost:80i http://localhost:8080) lub różnych domen (jak http://localphp52i http://localphp53), pozostawiając całą pozostałą strukturę folderów nietkniętą, dzięki czemu można łatwo porównać uruchomienie jednej aplikacji internetowej w dwóch środowiskach poprzez zmianę bieżącego URL.
cprn

Odpowiedzi:


61

Aby to osiągnąć, możesz użyć menedżera wersji php. Dostępne są różne menedżery wersji, takie jak:

Moim ulubionym jest phpbrew. Mam nadzieję że to pomoże.


2
Dzięki, czy możesz dołączyć instrukcje? (onnu vishadheekarikkamo?)
Tachyons

17
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Nanne

2
Wystarczy sprawdzić linki, które mają naprawdę dobrą dokumentację na swoich stronach. Czy naprawdę chcesz, żebym skopiował i wkleił rzeczy z ich strony internetowej ?.
aneeshep

7
Jak na ironię, jednym z powodów nie tylko publikowania linków jest linkrot, na który cierpi ten post.
MirroredFate

@aneeshep, nie kopiuj-wklej ich dokumentacji, ale odpowiednie fragmenty i kilka wierszy o tym, co to jest „menedżer wersji php” i jak używać / konfigurować go dla tego konkretnego problemu, byłoby naprawdę mile widziane.
Matthieu,

20

Państwo może uruchomić 2 różne wersje PHP na raz, ale to nie jest tak proste, jak to tylko apt-zachęcając. Musisz uruchomić jedną osobno zainstalowaną wersję i obsłużyć ją zgodnie z ustawieniami w konfiguracji Apache.

Możesz to zrobić na przykład za pomocą fastcgi: w zasadzie to, czego szukasz, to konfiguracja widoczna na tej stronie . Dodajesz inny moduł obsługi w konfiguracji w zależności od potrzebnej sytuacji / portu / domeny. Sztuczka po zainstalowaniu obu wersji jest następująca:

=== z tej strony ==

  1. Ostatnim krokiem było stworzenie wirtualnych hostów. Na koniec mam trzy pliki w / etc / apache2 / sites-enabled: 000-default, php5.3.17 i php5.4.7 Z następującą zawartością

domyślna:

    <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>

Zobacz pełną wersję połączonego pytania . Nie zapomnij także spojrzeć na dwa linki w nagłówku, wyglądają jak fajne samouczki (ale mniej skompresowane). To i tamto

(nie zniechęcaj się faktem, że połączone pytanie jest duże bez żadnej akceptowanej odpowiedzi. Metoda powinna (i działa) dobrze, ale użytkownik zapomniał użyć <?phpi używał <?wyłączonych skrótów, zobacz komentarze)


13

Zainstalowałem php 5.6 i 7.0, ale oprócz wszystkich wskazówek nadal działało 5.6, więc to polecenie oszczędza dzień (w moim przypadku wybieram opcję 1 i ponownie uruchamiam apache):

sudo update-alternatives --config php

warto pamiętać o użyciu phpinfo()i php -vsprawdzaniu krzyżowym, ponieważ oba mogą mieć inną wartość.
Adi Prasetyo

6

Ten działa dla mnie: https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu

Taki sam jak skrypt z „Growling Flea”, ale przy użyciu nowych wersji.

Dodaj PPA

Pakiety PHP 5.6 i PHP 7.0 pochodzą z zewnętrznego PPA, nie dostarczanego przez oficjalne repozytoria Ubuntu od Canonical. PPA, które tutaj polecam, pochodzą od Ondřej Surý, który pakuje PHP dla Debiana (z którego następnie korzysta Ubuntu), więc chociaż nie jest to oficjalne repozytorium, nie jest on losowy! Sam PPA jest tutaj

Aby dodać PPA do konfiguracji:

sudo add-apt-repository ppa:ondrej/php  

Następnie będziemy chcieli również pobrać informacje o ofercie tego nowego PPA, więc uruchom:

sudo apt-get update   

Zainstaluj nowe wersje PHP

Miałem już zainstalowane niektóre pakiety php5, ale niczego nie odinstalowałem, po prostu pozwoliłem aptowi ustalić, co chce zrobić, kiedy poprosiłem go o zainstalowanie nowych wersji:

sudo apt-get install php5.6 php7.0

Doprowadziło to do wielu skarg ze strony apt i wielu konfliktów. Pierwszym sugerowanym rozwiązaniem było usunięcie wszystkich standardowych pakietów php5, aby można było zainstalować PHP 5.6 - więc właśnie zaakceptowałem pierwszą sugestię.

Używam apache, więc ta konfiguracja dała mi apache z dostępnymi modułami php5.6 i php7.0, a moduł php5.6 faktycznie załadowany.

Oprócz samego PHP wszystkie rozszerzenia i inne narzędzia, których można oczekiwać od PHP, są dostępne dla obu wersji PHP, więc bardzo łatwo jest dodać potrzebne moduły. Byłem pod wielkim wrażeniem tego, jak ładnie się to robi.

Konfigurowanie i przełączanie wersji

Teraz masz w systemie dwie całkowicie oddzielne wersje PHP, więc spójrzmy, dokąd poszły wszystkie elementy!

Pliki konfiguracyjne znajdują się odpowiednio /etc/php/5.6i /etc/php/7.0wewnątrz - tutaj możesz skonfigurować, które rozszerzenia są ładowane, ustawić ustawienia ini i wszystko inne dla każdej wersji oddzielnie.

Jestem użytkownikiem Apache i jak wspomniałem oba moduły są dostępne. Aby przejść z jednego do drugiego, muszę zrobić:

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

Dla użytkowników nginx zmiany są prawie tak proste, Digital Ocean ma dobrą dokumentację na ten temat (mają świetne dokumenty!), Więc sprawdź ich przewodnik: https://www.digitalocean.com/community/tutorials/how-to- upgrade-to-php-7-on-ubuntu-14-04, ponieważ zawiera sekcję dotyczącą rekonfiguracji nginx do używania innej wersji PHP.

Z wiersza poleceń mam zarówno php5.6, jak i php7.0 dostępne jako polecenia. Nadal mam też komendę php - zajrzyj do / etc / alternatives, aby zobaczyć, czy dowiązuje ona do konkretnej wersji PHP *. Możesz także szybko sprawdzić, którego używasz, uruchamiając php -v.

* dokładniej, uruchom który php, aby zobaczyć, która wersja PHP jest używana - ale to prawdopodobnie wskaże /usr/bin/php, która dla mnie sama jest dowiązaniem symbolicznym do /etc/alternatives/phppolecenia.

Praca z rozszerzeniami

Ten PPA jest dostarczany ze zwykłym pakietem php-pear, który oferuje polecenie pecl dla obu wersji PHP, więc wszelkie rozszerzenia dostępne przez PECL można zainstalować w zwykły sposób. Potrzebne będą również odpowiednie nagłówki, więc należy zainstalować php5.6-dev lub php7.0-dev.

Po zakończeniu instalacji pecl otrzymasz notatkę, aby dodać plik * .so do pliku php.ini; w rzeczywistości najlepszą rzeczą do zrobienia jest sprawdzenie, co jest w środku /etc/php/mods-available. Będą tu już niektóre moduły, każdy w swoim własnym pliku nazwanym od rozszerzenia i kończącym się na .ini. Możesz skopiować jeden, aby użyć go jako szablonu lub utworzyć własny i umieścić w nim całą odpowiednią konfigurację rozszerzenia (przynajmniej potrzebujesz extension=[extensionName].so).

Gdy nowe rozszerzenie będzie dostępne w modach, włącz je, a następnie sprawdź, wykonując:

sudo phpenmod extension  
php -m  

Spowoduje to utworzenie dowiązań symbolicznych w odpowiednich miejscach dla bieżącej wersji PHP, aby załadować ten moduł, i powinieneś zobaczyć go na liście modułów wyprowadzanych przez php -m. Porada profesjonalisty: jeśli nie widzisz go w danych wyjściowych, przewiń do samego końca danych wyjściowych i sprawdź, czy są tam jakieś przydatne komunikaty o błędach.


3

Z tego postu po prostu uporządkowałem polecenia i wyjaśniłem w kolejności, w jakiej zostałem doręczony (Ubuntu 12.04)

Ta metoda zapewnia:

  1. skrypt z menu, który umożliwia przełączanie zainstalowanych wersji php (nie obu jednocześnie)

  2. różne wersje PHP zainstalowane na twoim serwerze

  3. oddzielne pliki conf

Zainstaluj wszystkie potrzebne wersje (mam dwie)

Zainstaluj zależności:

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

Zainstaluj PHP 5.3 za pierwszym razem. Pobierz źródła 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

Zainstaluj PHP5.6 po raz pierwszy. Pobierz źródła 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

Wersje menedżera skryptów PHP: Utwórz plik o nazwie php.shi umieść go w /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

Skompiluj i zainstaluj 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

Skompiluj i zainstaluj 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

Użyjmy ich:

$ 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

Problemy:

  1. Pojedyncza instancja apache nie może jednocześnie uruchamiać dwóch różnych wersji PHP (przynajmniej o ile mi wiadomo).

  2. Nie można zainstalować dwóch różnych wersji PHP z pakietów, ponieważ będą one powodować konflikt (i spróbuj zastąpić te same katalogi).

Rozwiązanie:

  • b) Skompiluj „inną” wersję PHP ze źródła ręcznie (lub jeśli wolisz, pobierz źródło odpowiedniego pakietu i zmodyfikuj go, aby uniknąć konfliktów i zmodyfikować ścieżki instalacji)

  • dla a) Utwórz osobny zestaw konfiguracji dla apache z różnymi ścieżkami modułów i osobnym skryptem startowym. I oczywiście uruchom go na osobnym porcie.


nie ma gotowego skryptu do skompilowania tych wielu równoległych instancji php? Po prostu zrobić to ręcznie i załatać ścieżki? SO oznacza to, że wszystkie firmy hostingowe opracowują niestandardowe skrypty do uruchamiania tych równoległych wersji i nigdy nie dzielą się swoimi wysiłkami.
lenzai

4
Pojedyncza instancja apache może uruchamiać jednocześnie 2 wersje php.
Nanne

1

Zamiast tworzyć wielokrotne VirtualHost, po prostu dodaję poniższy kod do mojego .htaccesspliku i, co zaskakujące, zadziałało,

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

Węzeł: Zainstalowałem już php7.2-fpmprzed użyciem kodu.


0

Jeśli chcesz je uruchomić w tym samym czasie, potrzebujesz dwóch różnych portów. Być może możesz po prostu zmienić konfigurację apache (httpd.conf) za pomocą prostego skryptu, który przesuwa jedną lub drugą wersję do właściwej pozycji przed uruchomieniem apache.


1
Mam już zainstalowany PHP 5.3.5. Jak mogę zainstalować PHP 5.2.17? Czy możesz mi powiedzieć, gdzie i co muszę zmienić, aby przełączać się między tymi dwiema wersjami? Plik httpd.conf jest pusty w mojej instalacji.
Debiprasad

0

Możesz także uruchomić każdą witrynę z różnymi użytkownikami. Więcej Ochrony.

Raz użyłem tego podejścia.

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

Teraz myślę, że lepiej jest używać php-fpm ... ale konfiguracja wielu wersji php jest trochę bardziej skomplikowana.

Będzie musiał uruchomić wiele php-fpms i ustawić apache, aby się ze sobą korzystali.


3
Witamy w Ask Ubuntu! Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
user98085

Nie miałem czasu na zrobienie tego, co powiedziałeś. Chyba chciałem tylko pokazać drogę. Stil musi się nauczyć, jak używać formowania. W każdym razie dzięki!
Henrique Fernandes

0

Napisałem skrypt bash, który pozwala mi łatwo przełączać się między zainstalowanymi wersjami php na moim urządzeniu. Prowadzę kilka wirtualnych hostów, ponieważ mam kilka projektów internetowych z klientami, którzy mają stare i nowe programy. Niektóre z tych projektów wymagają starszych wersji php, a inne wymagają php7.0.

Przeczytaj moje komentarze i upewnij się, że rozumiesz, co się dzieje przed użyciem tego.

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

Miałem ten sam problem, gdy obsługiwałem wiele projektów. Odniosłem się do tego artykułu, ale było tak, jak za każdym razem, gdy potrzebuję zmieniać wersje, jeśli to konieczne, ale daje to elastyczność dla cli i sieci osobno.

Przejście z php5.6 na php7.0

W przypadku Apache możemy użyć polecenia jako:

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

W przypadku interfejsu wiersza polecenia możemy użyć polecenia jako:

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

Przejście z php7.0 na php5.6

W przypadku Apache możemy użyć polecenia jako:

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

W przypadku interfejsu wiersza polecenia możemy użyć polecenia jako:

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

Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie. - Z recenzji
waltinator

@waltinator Dzięki za recenzję, na pewno się tym
zajmę

0

Można to zrobić, wyłączając i włączając nową wersję PHP-

  • przejdź na starszą wersję -
    a2dismod
    usługa php7.0 uruchomi ponownie apache2
  • przejdź do nowszej wersji
    a2enmod php7.0
    usługa apache2 restart
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.