Como ter duas versões do PHP instaladas e alternar facilmente entre elas?


76

Eu quero ter o PHP 5.2.17 e o PHP 5.3.5 instalado na minha máquina Ubuntu e alternar conforme minha necessidade. Como posso conseguir isso?


no ubuntu há apache.conf em / etc / apache2, eu pensei sobre isso também, talvez eu vou no futuro fazer algum pacote que seria muito útil para desenvolvedores web

Você pode fazer isso com o suPHP, sem ter certeza dos detalhes
Marco Ceppi

1
existe algo como python virtualenv para ter implantações isoladas limpas do PHP?
lenzai

Você já pensou em configurar servidores virtuais do Ubuntu usando um software de virtualização usado sem cabeça? Eu ficaria surpreso se o que você está querendo fazer não for bem servido (sem trocadilhos) por essa configuração.
Simon Hoare

1
Defina o que significa "alternar facilmente". Eu usei isso no trabalho: meu servidor da web estava usando PHP .phpe .php5arquivos diferentes. Você também pode configurar seu servidor WWW para usar diferentes versões do PHP para diferentes portas (como http://localhost:80e http://localhost:8080) ou domínios diferentes (como http://localphp52e http://localphp53), deixando toda a estrutura restante de pastas intacta, para comparar facilmente a execução de um aplicativo Web em dois ambientes, alterando a atual URL.
CPRN

Respostas:


61

Você pode usar um gerenciador de versões php para conseguir isso. Gerenciadores de versão diferentes estão disponíveis como:

Meu favorito é phpbrew. Espero que isto ajude.


2
Obrigado, você pode incluir instruções? (onnu vishadheekarikkamo?)
Tachyons

17
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
precisa

2
Basta verificar os links que possuem realmente boa documentação em seus sites. Você realmente quer que eu copie e cole coisas do site deles?
aneeshep

7
Ironicamente, uma das razões para não apenas postar links é o linkrot, do qual esse post agora sofre.
precisa

@aneeshep, não copie e cole a documentação deles, mas trechos relevantes e algumas linhas sobre o que é um "gerenciador de versões php" e como usá-lo / configurá-lo para esse problema específico seriam realmente bem-vindos.
precisa

20

Você pode executar 2 versões diferentes do PHP ao mesmo tempo, mas não é tão fácil quanto apenas obtê-las. Você precisa executar uma versão instalada separadamente e atendê-la de acordo com as configurações na sua configuração do apache.

Você pode fazer isso usando o fastcgi, por exemplo: basicamente, o que você está procurando é a configuração que você vê nesta página . Você adiciona um manipulador diferente na sua configuração com base na situação / porta / domínio que você precisa. O truque, depois de instalar as duas versões, é esta etapa:

=== dessa página ==

  1. O último passo foi criar hosts virtuais. No final, tenho três arquivos em / etc / apache2 / sites-enabled: 000-default, php5.3.17 e php5.4.7 Com o seguinte conteúdo

padrão:

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

Veja para a instalação completa a questão vinculada . Não se esqueça de olhar também para os dois links no cabeçalho, eles parecem bons tutoriais (mas menos compactados). Isso e Aquilo

(não se deixe enganar pelo fato de que a pergunta vinculada é uma pergunta grande e sem resposta aceita. O método deve (e funciona) funcionar bem, mas o usuário esqueceu de usar <?phpe usar <?com atalhos, veja os comentários)


13

Eu instalei o php 5.6 e 7.0, mas além de todas as dicas, ele continuava executando a versão 5.6, portanto, este comando salva o dia (no meu caso, eu escolho a opção 1 e reinicio o apache):

sudo update-alternatives --config php

é útil lembrar o uso phpinfo()e php -va verificação cruzada, pois os dois podem ter um valor diferente.
Adi Prasetyo

6

Este funciona para mim: https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu

O mesmo que o script de "Growling Flea", mas usando novas versões.

Adicione o PPA

Os pacotes PHP 5.6 e PHP 7.0 são de PPA de terceiros, não fornecidos pelos repositórios oficiais do Ubuntu da Canonical. Os PPAs que recomendo aqui são de Ondřej Surý, que empacota PHP para Debian (que é então usado pelo Ubuntu), portanto, embora não seja um repositório oficial, ele não é exatamente aleatório! O PPA em si está aqui

Para adicionar o PPA à sua configuração:

sudo add-apt-repository ppa:ondrej/php  

Em seguida, também queremos obter informações sobre o que está em oferta neste novo PPA e, em seguida, execute:

sudo apt-get update   

Instale novas versões do PHP

Eu já tinha alguns dos pacotes php5 instalados, mas não desinstalei nada, apenas deixei o apt descobrir o que ele queria fazer quando pedi para instalar as novas versões:

sudo apt-get install php5.6 php7.0

Isso resultou em muitas reclamações do apt e muitos conflitos. A primeira resolução sugerida foi remover todos os pacotes php5 padrão para que o PHP 5.6 pudesse ser instalado - então aceitei a primeira sugestão.

Eu uso o apache, então essa configuração me deu o apache com os módulos php5.6 e php7.0 disponíveis, e o módulo php5.6 realmente carregado.

Assim como apenas o próprio PHP, todas as extensões e outras ferramentas que você esperaria do PHP existem para ambas as versões, portanto é muito fácil adicionar os módulos necessários. Fiquei muito, muito impressionado com o quão bem isso é feito.

Configurando e alternando versões

Agora você tem duas versões completamente separadas do PHP instaladas no seu sistema, então vamos dar uma olhada em onde todas as partes foram!

Os arquivos de configuração estão todos dentro /etc/php/5.6e /etc/php/7.0 respectivamente - aqui dentro é onde você pode configurar quais extensões são carregadas, definir as configurações ini e tudo o mais para cada versão isoladamente.

Sou um usuário apache e, como mencionei, os dois módulos estão disponíveis. Então, para mudar de um para o outro, preciso fazer:

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

Para os usuários do nginx, as alterações são quase tão fáceis quanto a Digital Ocean possui uma boa documentação sobre isso (eles têm ótimos documentos!). Confira o guia: https://www.digitalocean.com/community/tutorials/how-to- upgrade-para-php-7-no-ubuntu-14-04 , pois inclui uma seção sobre reconfigurando o nginx para usar outra versão do PHP.

Na linha de comando, tenho o php5.6 e o ​​php7.0 disponíveis como comandos. Eu também ainda tenho um comando php - procure em / etc / alternative para ver que ele se vincula a uma versão específica do PHP cli *. Você também pode verificar rapidamente qual o seu está usando executando php -v.

* mais especificamente, execute qual php para ver qual versão do PHP está sendo usada - mas isso provavelmente apontará para o /usr/bin/phpque, para mim, é um link simbólico para o /etc/alternatives/phpcomando.

Trabalhando com extensões

Este PPA vem com o pacote php-pear usual, que oferece o comando pecl para ambas as versões do PHP, portanto, qualquer extensão disponível via PECL pode ser instalada da maneira usual. Você também precisará dos cabeçalhos relevantes para que o php5.6-dev ou o php7.0-dev sejam instalados.

Quando a instalação do pecl for concluída, você receberá uma nota para adicionar o arquivo * .so ao seu php.ini; de fato, a melhor coisa a fazer aqui é ver o que há dentro /etc/php/mods-available. Já haverá alguns módulos aqui, cada um em seu próprio arquivo com o nome da extensão e terminando em .ini. Você pode copiar um para usar como modelo ou criar o seu próprio e colocar nele toda a configuração relevante para a extensão (no mínimo, você precisa extension=[extensionName].so).

Quando a nova extensão estiver disponível nos mods, ative e verifique-o fazendo:

sudo phpenmod extension  
php -m  

Isso criará os links simbólicos nos lugares certos para a sua versão atual do PHP carregar este módulo, e você deverá vê-lo na lista de módulos produzidos pelo php -m. Dica profissional: se você não o vir na saída, role até o topo da saída e veja se há alguma mensagem de erro útil lá.


3

A partir deste post , apenas coloquei em ordem os comandos e expliquei em ordem como fui servido (Ubuntu 12.04)

Este método fornece:

  1. script com menu, que permite alternar entre versões do php instaladas (não as duas ao mesmo tempo)

  2. várias versões do PHP instaladas no seu servidor

  3. arquivos conf separados

Instale todas as versões que você precisa (eu tenho duas)

Instale dependências:

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

Instale o PHP 5.3 pela primeira vez. Baixar fontes 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

Instale o PHP5.6 pela primeira vez. Baixar fontes 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

Versões do gerenciador de scripts PHP: Crie um arquivo chamado php.she coloque-o em /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

Compile e instale o 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

Compilar e instalar o 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

Vamos usá-los:

$ 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

Problemas:

  1. A instância única do apache não pode executar duas versões diferentes do PHP simultaneamente (pelo menos até onde eu saiba).

  2. Duas versões diferentes do PHP não podem ser instaladas nos pacotes, pois elas entrarão em conflito (e tente sobrescrever os mesmos diretórios).

Solução:

  • for b) Compile “a outra” versão PHP do código-fonte, manualmente (ou se preferir, pegue o código-fonte do pacote apropriado e modifique-o para evitar conflitos e modificar os caminhos de instalação)

  • para a) Crie um conjunto separado de configurações para o apache com diferentes caminhos de módulo e script de inicialização separado. E, claro, execute-o em porta separada.


não existe um script pré-empacotado para compilar essas várias instâncias paralelas de php? Apenas para fazê-lo manualmente e corrigir caminhos? Portanto, isso significa que toda empresa de hospedagem desenvolve scripts personalizados para executar essas versões paralelas e nunca compartilhar seus esforços.
lenzai 25/05

4
Uma única instância do apache pode executar duas versões php de uma só vez.
Nanne

1

Em vez de criar múltiplos VirtualHost, basta adicionar o código abaixo no meu .htaccessarquivo e, surpreendentemente, ele funcionou,

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

Nó: eu já tinha instalado php7.2-fpmantes de usar o código.


0

Se você quiser executá-los ao mesmo tempo, precisará de duas portas diferentes. Talvez você possa alterar sua configuração do apache (httpd.conf) com um script simples que move uma ou outra versão para a posição correta antes de iniciar o apache.


1
Eu já tenho o PHP 5.3.5 instalado. Como posso instalar o PHP 5.2.17? Você poderia me dizer onde e o que preciso alterar para alternar nessas duas versões? O arquivo httpd.conf está vazio na minha instalação.
precisa

0

Você também pode executar cada site com diferentes usuários. Mais seguro.

Eu usei essa abordagem uma vez.

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

Agora eu acho que é melhor usar o php-fpm ... mas é um pouco mais complicado configurar várias versões do php.

Será necessário executar múltiplos php-fpms e configurar o apache para usar um ao outro.


3
Bem-vindo ao Ask Ubuntu! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
User98085

Não tive tempo suficiente para fazer o que você disse. Acho que só queria mostrar um caminho. Ainda precisamos aprender a usar o material de formatação. Obrigado mesmo assim!
Henrique Fernandes

0

Eu escrevi um script bash que me permite alternar facilmente entre as versões instaladas do php na minha caixa. Eu corro vários hosts virtuais porque tenho vários projetos da web com clientes que possuem programas antigos e novos. Alguns desses projetos requerem versões mais antigas do php e outros exigem o php7.0.

Leia meus comentários e entenda o que está acontecendo antes de usar isso.

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

Eu tive o mesmo problema quando estava lidando com vários projetos. Mencionei este artigo. Mas era como sempre que eu precisava mudar as versões, se necessário, mas isso oferece flexibilidade para cli e web separadamente.

Passando do php5.6 para o php7.0

Para o Apache, podemos usar o comando como:

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

Para a CLI, podemos usar o comando como:

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

Passando do php7.0 para o php5.6

Para o Apache, podemos usar o comando como:

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

Para a CLI, podemos usar o comando como:

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

Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada. - Da avaliação
waltinator

@waltinator Obrigado pela revisão, com certeza vai cuidar disso
Shivdhwaj Pandey

0

Isso pode ser feito desativando e ativando a nova versão do PHP-

  • mudar para a versão mais antiga -
    a2dismod php7.0
    service apache2 restart
  • alterne para a versão mais recente do serviço
    a2enmod php7.0
    apache2 restart
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.