Come avere due versioni di PHP installate e passare facilmente da una all'altra?


76

Voglio avere sia PHP 5.2.17 che PHP 5.3.5 installati sulla mia macchina Ubuntu e cambiare secondo le mie necessità. Come posso raggiungere questo obiettivo?


in Ubuntu c'è apache.conf in / etc / apache2, ci ho pensato anche io, forse in futuro farò un pacchetto che sarebbe molto utile per gli sviluppatori web

Puoi farlo con suPHP, non sono sicuro dei dettagli
Marco Ceppi

1
esiste qualcosa come python virtualenv per distribuzioni pulite e isolate di PHP?
lenzai,

Hai preso in considerazione la possibilità di configurare server Ubuntu virtuali utilizzando un software di virtualizzazione che usi senza testa? Sarei sorpreso se quello che vuoi fare non è ben servito (nessun gioco di parole previsto) da un simile set-up.
Simon Hoare,

1
Definisci cosa significa "passare facilmente". L'ho usato per lavoro: il mio server web utilizzava PHP .phpe .php5file diversi. Puoi anche configurare il tuo server WWW per usare versioni PHP diverse per porte diverse (come http://localhost:80e http://localhost:8080) o domini diversi (come http://localphp52e http://localphp53) lasciando intatta tutta la struttura rimanente delle cartelle in modo da poter confrontare facilmente l'esecuzione di un'applicazione Web in due ambienti modificando l'attuale URL.
cprn,

Risposte:


61

Puoi usare un gestore versione php per raggiungere questo obiettivo. Sono disponibili diversi gestori di versioni come:

Il mio preferito è phpbrew. Spero che sia di aiuto.


2
Grazie, puoi per favore includere istruzioni? (onnu vishadheekarikkamo?)
Tachyons,

17
Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
Nanne,

2
Basta controllare i collegamenti che hanno una documentazione davvero buona sui loro siti. Vuoi davvero che copi e incolli le cose dal loro sito Web ?.
aneeshep,

7
Ironia della sorte, uno dei motivi per non pubblicare solo i collegamenti è LinkRot, di cui ora soffre questo post.
MirroredFate

@aneeshep, non copia-incolla la loro documentazione, ma estratti pertinenti e alcune righe su ciò che è un "gestore versione php" e su come usarlo / configurarlo per quel problema specifico sarebbe davvero il benvenuto.
Matthieu,

20

È possibile eseguire 2 differenti versioni di PHP in una sola volta, ma non è così facile come solo apt-inducendole. È necessario eseguire una versione installata separatamente e servirla secondo le impostazioni nella configurazione di Apache.

Puoi farlo usando fastcgi per esempio: sostanzialmente quello che stai cercando è la configurazione che vedi in questa pagina . Aggiungi un gestore diverso nella tua configurazione in base alla situazione / porta / dominio di cui hai bisogno. Il trucco, dopo aver installato entrambe le versioni, è questo passaggio:

=== da quella pagina ==

  1. L'ultimo passo è stato quello di creare host virtuali. Alla fine ho tre file in / etc / apache2 / sites-enabled: 000-default, php5.3.17 e php5.4.7 con i seguenti contenuti

predefinito:

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

Vedere per l'installazione completa la domanda collegata . Non dimenticare di guardare anche i due link nell'intestazione, sembrano dei simpatici tutorial (ma meno compressi). Questo e quello

(Non lasciatevi sorprendere dal fatto che la domanda collegata è grande senza una risposta accettata. Il metodo dovrebbe (e funziona) funzionare bene, ma l'utente ha dimenticato di usare <?phpe usare <?con i tag disattivati, vedere i commenti)


13

Ho installato php 5.6 e 7.0 ma oltre a tutti i suggerimenti ha continuato a funzionare 5.6, quindi questo comando salva il giorno (nel mio caso scelgo l'opzione 1 e riavvio apache):

sudo update-alternatives --config php

è utile ricordare l'uso phpinfo()e il controllo php -vincrociato poiché entrambi possono avere un valore diverso.
Adi Prasetyo,

6

Questo funziona per me: https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu

Come lo script di "Growling Flea", ma usando nuove versioni.

Aggiungi il PPA

I pacchetti PHP 5.6 e PHP 7.0 provengono da un PPA di terze parti, non fornito dai repository Ubuntu ufficiali di Canonical. I PPA che sto raccomandando qui sono di Ondřej Surý che confeziona PHP per Debian (che viene quindi utilizzato da Ubuntu) quindi, sebbene non sia un repository ufficiale, non è esattamente casuale! Lo stesso PPA è qui

Per aggiungere il PPA alla tua configurazione:

sudo add-apt-repository ppa:ondrej/php  

Quindi vorremmo anche ottenere informazioni su ciò che è offerto da questo nuovo PPA, quindi eseguire:

sudo apt-get update   

Installa nuove versioni di PHP

Avevo già installato alcuni dei pacchetti php5, ma non ho disinstallato nulla, ho lasciato a apt capire cosa voleva fare quando gli ho chiesto di installare le nuove versioni:

sudo apt-get install php5.6 php7.0

Ciò ha comportato molte lamentele da apt e molti conflitti. La prima risoluzione suggerita è stata quella di rimuovere tutti i pacchetti stock php5 in modo da poter installare PHP 5.6, quindi ho appena accettato il primo suggerimento.

Uso apache quindi questa configurazione mi ha dato apache con i moduli php5.6 e php7.0 disponibili e il modulo php5.6 effettivamente caricato.

Oltre al PHP stesso, tutte le estensioni e gli altri strumenti che ti aspetteresti con PHP sono disponibili per entrambe le versioni di PHP, quindi è molto facile aggiungere i moduli di cui hai bisogno. Sono rimasto molto, molto colpito da quanto bene sia stato fatto.

Configurazione e cambio di versioni

Ora hai due versioni completamente separate di PHP installate sul tuo sistema, quindi diamo un'occhiata a dove sono andati tutti i pezzi!

I file di configurazione sono tutti dentro /etc/php/5.6e /etc/php/7.0 rispettivamente - dentro qui è dove puoi configurare quali estensioni vengono caricate, impostare le impostazioni ini e tutto il resto per ogni versione in isolamento.

Sono un utente apache e, come ho già detto, sono disponibili entrambi i moduli. Quindi per passare dall'uno all'altro devo fare:

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

Per gli utenti di nginx, le modifiche sono quasi altrettanto facili, Digital Ocean ha una buona documentazione su questo (hanno una grande documentazione!) Quindi consulta la loro guida: https://www.digitalocean.com/community/tutorials/how-to- upgrade-to-php-7-on-ubuntu-14-04 in quanto include una sezione sulla riconfigurazione di nginx per usare un'altra versione di PHP.

Dalla riga di comando, ho sia php5.6 che php7.0 disponibili come comandi. Ho anche ancora un comando php - guarda in / etc / alternatives per vedere che si collega a una particolare versione di PHP cli *. Puoi anche verificare rapidamente quale tuo sta usando eseguendo php -v.

* più specificamente, esegui quale php per vedere quale versione di PHP viene utilizzata, ma probabilmente questo indicherà /usr/bin/php, che per me è esso stesso un link simbolico al /etc/alternatives/phpcomando.

Lavorare con le estensioni

Questo PPA viene fornito con il solito pacchetto php-pear che offre il comando pecl per entrambe le versioni di PHP, quindi eventuali estensioni disponibili tramite PECL possono essere installate nel solito modo. Avrai anche bisogno delle intestazioni pertinenti, quindi è necessario installare php5.6-dev o php7.0-dev.

Al termine dell'installazione di pecl, riceverai una nota per aggiungere il file * .so al tuo php.ini; in effetti la cosa migliore da fare qui è guardare cosa c'è dentro /etc/php/mods-available. Ci saranno già alcuni moduli qui, ognuno nel suo file chiamato con il nome dell'estensione e che termina con .ini. Puoi copiarne uno da utilizzare come modello o crearne uno tuo e inserire al suo interno tutta la configurazione rilevante per l'estensione (come minimo, è necessario extension=[extensionName].so).

Una volta che la nuova estensione è disponibile nelle mod, abilita e quindi controlla facendo:

sudo phpenmod extension  
php -m  

Questo creerà i collegamenti simbolici nei posti giusti per la tua attuale versione di PHP per caricare questo modulo, e dovresti vederlo nella lista dei moduli emessi da php -m. Suggerimento pro: se non lo vedi nell'output, scorri fino in cima all'output e vedi se ci sono messaggi di errore utili lì.


3

Da questo post , ho appena messo in ordine i comandi e spiegato in ordine quando mi è stato servito (Ubuntu 12.04)

Questo metodo ti dà:

  1. script con menu, che consente il passaggio tra le versioni di php installate (non entrambe contemporaneamente)

  2. varie versioni di PHP installate sul tuo server

  3. file conf separati

Installa tutte le versioni che ti servono (ne ho due)

Installa dipendenze:

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

Installa PHP 5.3 per la prima volta. Scarica fonti 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

Installa PHP5.6 per la prima volta. Scarica fonti 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

Script manager versioni PHP: crea un file chiamato php.she inseriscilo in /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

Compilare e installare 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

Compila e installa 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

Usiamoli:

$ 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

I problemi:

  1. Una singola istanza di apache non può eseguire contemporaneamente due diverse versioni di PHP (almeno per quanto ne so).

  2. Non è possibile installare due diverse versioni di PHP dai pacchetti in quanto potrebbero entrare in conflitto (e provare a sovrascrivere le stesse directory).

Soluzione:

  • per b) Compilare "l'altra" versione PHP dal sorgente, manualmente (o se preferite, afferrare il sorgente del pacchetto appropriato e modificarlo per evitare conflitti e modificare i percorsi di installazione)

  • per a) Creare un set separato di configurazioni per apache con percorsi di moduli diversi e script di avvio separati. E ovviamente eseguirlo su una porta separata.


non esiste uno script preconfezionato per compilare queste istanze multiple parallele php? Solo per farlo manualmente e patchare i percorsi? Quindi questo significa che tutte le società di hosting sviluppano lì script personalizzati per eseguire queste versioni parallele e non condividere mai i loro sforzi.
lenzai,

4
Una singola istanza di apache può eseguire 2 versioni php contemporaneamente.
Nanne,

1

Invece di farne multipli VirtualHostaggiungo semplicemente il codice seguente nel mio .htaccessfile e sorprendentemente ha funzionato,

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

Nodo: avevo già installato php7.2-fpmprima di utilizzare il codice.


0

Se si desidera eseguirli contemporaneamente, sono necessarie due porte diverse. Forse puoi semplicemente cambiare la tua configurazione di apache (httpd.conf) con un semplice script che sposta l'una o l'altra versione nella posizione corretta prima di avviare apache.


1
Ho già installato PHP 5.3.5. Come posso installare PHP 5.2.17? Potresti dirmi dove e cosa devo cambiare per passare tra queste due versioni? Il file httpd.conf è vuoto nella mia installazione.
Debiprasad,

0

È inoltre possibile eseguire ogni sito Web con diversi utenti. Più sicuro.

Ho usato questo approccio una volta.

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

Ora penso che sia meglio usare php-fpm ... ma è un po 'più complicato configurare più versioni php.

Dovrà eseguire multipli php-fpms e impostare apache per usarsi a vicenda.


3
Benvenuti in Ask Ubuntu! Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
user98085

Non ho avuto abbastanza tempo per fare come hai detto. Immagino, volevo solo mostrare un modo. Stil ha bisogno di imparare come usare il materiale formativo. Grazie comunque!
Henrique Fernandes,

0

Ho scritto uno script bash che mi permette di passare facilmente tra le versioni php installate sulla mia scatola. Gestisco diversi host virtuali perché ho diversi progetti web con clienti che hanno programmi vecchi e nuovi. Alcuni di questi progetti richiedono versioni precedenti di php e altri progetti richiedono php7.0.

Leggi i miei commenti e assicurati di capire cosa sta succedendo prima di usarlo.

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

Ho avuto lo stesso problema quando gestivo più progetti. Ho fatto riferimento a questo articolo Ma è stato come ogni volta che ho bisogno di cambiare le versioni se necessario, ma questo dà la flessibilità per cli e web separatamente.

Passando da php5.6 a php7.0

Per Apache, possiamo usare il comando come:

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

Per CLI, possiamo usare il comando come:

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

Passare da php7.0 a php5.6

Per Apache, possiamo usare il comando come:

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

Per CLI, possiamo usare il comando come:

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

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - Dalla recensione
Waltinator,

@waltinator Grazie per la recensione, sicuramente ci
penseremo noi

0

Può essere fatto disabilitando e abilitando la nuova versione di PHP-

  • passa alla versione precedente -
    a2dismod php7.0
    service apache2 restart
  • passa alla versione più recente
    a2enmod php7.0
    service apache2 restart
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.