Atualizando Seu Servidor Linux para PHP 7.0

PHP 7 foi lançado dezembro passado. Após testar o código localmente, é hora de atualizar o servidor de produção. Geralmente, a maioria dos sites funcionam bem nele.

Contudo, suspeitamos que não muitos sites atualizaram. É mais seguro e fácil continuar em versões anteriores. Na verdade, uma pesquisa de sites WordPress mostrou que alguns tem:

“Até Novembro de 2016, 53.9% dos sites WordPress rodam versões PHP menores que 5.5 Apenas, 3.4% dos sites rodam PHP 7, a versão atual do PHP.” via PHP Compatibility Checker.

Mas PHP 7 já está aí há quase um ano.

Nesse episódio, mostraremos uma abordagem para atualizar para PHP 7 no Ubuntu 14.x e resolver problemas com PHPMyAdmin, que muitos vanguardistas enfrentaram.

Por hora, se usamos WordPress, devemos instalar o plugin PHP Compatibility Checker para garantir que não encontraremos problemas inesperados com nossos Plugins.

Sempre gostamos de suas ideias e comentários. Se tiverem perguntas ou sugestões de tópicos, por favor, publique seus pensamentos na seção de comentários.

Tentamos usar alguns guias padrões para atualizar para PHP 7 e acabamos lidando com problemas diferentes. Logo, os scripts abaixo foram testados repetidamente e acreditamos que funcionarão bem.

A essa altura, talvez queiramos dar uma olhada nas mudanças do PHP .ini e fazer cópia do arquivo php.ini já que precisaremos depois, par migrá-lo para PHP 7.

Isso deve ajudarnos a encontrar o arquivo .ini:

1
$ php --ini

Isso mostrou-nos:

1
2
3
4
5
6
$ php --ini
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20121212/newrelic.so' - /usr/lib/php5/20121212/newrelic.so: cannot open shared object file: No such file or directory in Unknown on line 0
Configuration File (php.ini) Path: /etc/php5/cli
Loaded Configuration File:         /etc/php5/cli/php.ini
Scan for additional .ini files in: /etc/php5/cli/conf.d
...

Para o Apache, o nosso foi /etc/php5/apache2.

Primeiro, removamos os pacotes antigos do PHP. Acreditamos ser melhor fazê-lo com cuidado, cobrindo não apenas o PHP5, mas o 5.5 e o 5.6, os quais experimentamos em um servidor.

1
2
3
4
5
$ sudo apt-get -y purge php php-common php-mcrypt php-mbstring
$ sudo apt-get -y purge php5 php5-common php5-cli libapache2-mod-php5 php5-curl php5-gd php5-imap php5-intl php5-json php5-mcrypt php5-mysql php5-pspell php5-readline php5-sqlite
$ sudo apt-get -y purge php5.5 php5.5-common php5.5-mcrypt php5.5-mbstring
$ sudo apt-get -y purge php5.6 php5.6-common
$ sudo apt-get autoremove

Quando não removemos todas as variações do PHP, enfrentamos problemas para configurar o PHP 7. Se tiverem alguma abordagem mais simples, por favor, compartilhe.

Upgrading to PHP7 PPA for PHP70 by Ondej Sur
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ sudo add-apt-repository ppa:ondrej/php
 Co-installable PHP versions: PHP 5.5, 5.6, PHP 7.0 and batteries included.
You can get more information about the packages at https://deb.sury.org
For PHP 5.4 on Ubuntu 12.04 use: ppa:ondrej/php5-oldstable
BUGS&FEATURES: This PPA now has a issue tracker: https://deb.sury.org/#bug-reporting
PLEASE READ: If you like my work and want to give me a little motivation, please consider donating regularly: https://donate.sury.org/
WARNING: add-apt-repository is broken with non-UTF-8 locales, see https://github.com/oerdnj/deb.sury.org/issues/56 for workaround:
# LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
 More info: https://launchpad.net/~ondrej/+archive/ubuntu/php
Press [ENTER] to continue or ctrl-c to cancel adding it
gpg: keyring `/tmp/tmpj6czswxr/secring.gpg' created
gpg: keyring `/tmp/tmpj6czswxr/pubring.gpg' created
gpg: requesting key E5267A6C from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpj6czswxr/trustdb.gpg: trustdb created
gpg: key E5267A6C: public key "Launchpad PPA for Ondřej Surý" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

E então, atualizamos nossos pacotes, distribuições e limpamos os arquivos remanescentes:

1
2
3
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get autoremove

Talvez vejamos erros como esse:

1
2
3
The link /vmlinuz.old is a damaged link
Removing symbolic link vmlinuz.old
 you may need to re-run your boot loader[grub]

Preferimos reiniciar e isso parece resolver o problema:

1
$ sudo reboot

Agora, instalamos o PHP7 e todos seus pacotes:

1
sudo apt-get install php7.0 php7.0-mysql libapache2-mod-php7.0 php-apcu php7.0-gd php7.0-mcrypt php-memcache php7.0-curl php7.0-tidy php-xml php-json php7.0-mbstring php-gettext libmcrypt-dev mcrypt php-gd libmcrypt4 libmhash2 libtidy5 libxslt1.1 php-apcu-bc php-pear php7.0-mbstring php7.0-xml

No mometo, quereremos migrar todas as mudanças das configurações nos arquivos de configuração para /etc/php/7.0/apache2/php.ini.

Também precisamos adicionar extension=apc.so no arquivo:

1
$ sudo nano /etc/php/7.0/apache2/php.ini

Colocamos isso aqui:

01
02
03
04
05
06
07
08
09
10
;extension=php_openssl.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_shmop.dll
extension=apc.so

Agora, se tivermos PHPMyadmin, teremos problemas ao reiniciar o Apache. Se for o caso, precisamos desabilitar o PHPMyAdmin:

1
$ sudo nano /etc/apache2/apache2.conf

Comentemos a linha que o carrega, lá no final:

01
02
03
04
05
06
07
08
09
10
11
# Include of directories ignores editors' and dpkg's backup files,
 # see README.Debian for details.
 # Include generic snippets of statements
 IncludeOptional conf-enabled/*.conf
 # Include the virtual host configurations:
 IncludeOptional sites-enabled/*.conf
 # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
 # Include /etc/phpmyadmin/apache.conf

Então, habilitamos mcrypt e mbstring e reiniciamos Apache:

1
2
3
$ sudo phpenmod mcrypt
$ sudo phpenmod mbstring
$ sudo service apache2 restart

Testmos num servidor rodando alguns apps construídos apenas com HTML, PHP e Yii1.x e todos funcionaram.

É hora de repararmos a instalação do PHPMyAdmin. Muitas pessoas encontram problemas.

Primeiro, adicionamos o repositório do pacote de nijel:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
$ sudo add-apt-repository ppa:nijel/phpmyadmin
 Latest phpMyAdmin packages - https://www.phpmyadmin.net/. Based on packages available in Debian.
There are some notable changes:
* it currently requires updated PHP packages, you can get packages from https://launchpad.net/~ondrej/+archive/ubuntu/php/
* it does include embedded copies of PHP libraries
If you like phpMyAdmin, you can support it's further development at https://www.phpmyadmin.net/donate/ or https://www.phpmyadmin.net/sponsors/, thanks!
 More info: https://launchpad.net/~nijel/+archive/ubuntu/phpmyadmin
Press [ENTER] to continue or ctrl-c to cancel adding it
gpg: keyring `/tmp/tmp6zix40vr/secring.gpg' created
gpg: keyring `/tmp/tmp6zix40vr/pubring.gpg' created
gpg: requesting key 06ED541C from hkp server keyserver.ubuntu.com
gpg: /tmp/tmp6zix40vr/trustdb.gpg: trustdb created
gpg: key 06ED541C: public key "Launchpad PPA for Michal Čihař" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

Então, atualizamos os pacotes e instalamos PHPMyAdmin:

1
2
$ sudo apt-get update
$ sudo apt-get install phpmyadmin

Note que isso recarregará vários pacotes antigos do PHP 5.x, mas o PHPMyAdmin funcionará.

Por fim, descomentamos a linha do PHPMyAdmin que comentamos anteriormente.

1
$ sudo nano /etc/apache2/apache2.conf

Aqui:

01
02
03
04
05
06
07
08
09
10
11
# Include of directories ignores editors' and dpkg's backup files,
 # see README.Debian for details.
 # Include generic snippets of statements
 IncludeOptional conf-enabled/*.conf
 # Include the virtual host configurations:
 IncludeOptional sites-enabled/*.conf
 # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
 Include /etc/phpmyadmin/apache.conf

E reiniciamos o Apache:

1
$ sudo service apache2 restart

A reinstalação do PHPMyAdmin pô-lo de volta ao local padrão, que é bem inseguro e hackeável. Sigamos Instalando e Usando PHPMyAdmin Com WordPress para proteger melhor a instalação.

Finalmente, criamos um pequeno script com phpinfo(); para verificar se o PHP 7 está ativo:

Upgrading to PHP 7 phpinfo output

Atualizar para o PHP 7 num Ubuntu 14.x foi problemático e requereu muitas mudanças dos scripts publicados para funcionar. Espero que tenham curtido o tutorial.

Rolar para cima