Вы находитесь на странице: 1из 4

Melhoria performance - Evolução PHP

Foi realizado um estudo para analisar o impacto e estimativa de esforço da evolução da versão de PHP de 5.3 para 7.

Após pesquisa, a melhor fonte de informação foi a própria página do PHP (www.php.net).

Da analise realizada, surgiu o seguinte quadro (será actualizado em caso falta de informação):

PHP 5.3 PHP5.4 PHP 5.4 PHP5.5 PHP 5.5 PHP5.6 PHP 5.6 PHP7

Aplic. Aplic. Aplic.

Magic quotes has been X (FPDF tem a execução da função Changes were NA Array keys won't be Só Internal constructors Só testando
removed $mqr=get_magic_quotes_runtime();) made to pack() overwritten when defining testando always throw exceptions
and unpack() an array as a property of a on failure
class via an array literal

The register_globals and NA – estão ambas as variáveis a The original X json_decode() now rejects Só list() no longer assigns
register_long_arrays OFF MySQL extension non-lowercase variants of testando variables in reverse order
php.ini directives have is now the JSON literals true, false
been removed. deprecated, and and null at all times, as per
will generate the JSON specification, and
E_DEPRECATED sets json_last_error()
errors when accordingly
connecting to a
database.
Instead, use the
MySQLi or
PDO_MySQL
extensions.

Nota: foram
alteradas as
funções para
utilizar as
funções de
MySQLi. Foi
necessário
alterar a ordem
dos parametros
+ alteração de
métodos
estáticos para
não estáticos.

As of PHP 5.3.0, you will NA – não foram encontrados json_encode() Só Uploads using the @file X Variable variables can no
get a warning saying that warnings “call-time” now accepts testando syntax now require longer be used with the
"call-time depth parameter. CURLOPT_SAFE_UPLOAD global keyword. The curly
pass-by-reference" is to be set to FALSE. brace syntax can be
deprecated when you use CURLFile should be used used to emulate the
& in foo(&$a);. And as of instead previous behaviour if
PHP 5.4.0, call-time required
pass-by-reference was
removed, so using it will
raise a fatal error.

The break and continue NA NA Now, the divide operator Só testando


statements no longer returns a float as either
accept variable arguments It is also now possible to +INF, -INF, or NAN, as
(e.g., break 1 + foo() * define a constant array specified by IEEE 754
$bar;) using the const keyword:

Timezone can no longer be NA(?) Files larger than 2 gigabytes NA Strings containing Só testando
set using the TZ in size are now accepted. hexadecimal numbers
environment variable are no longer considered
to be numeric.

Non-numeric string offsets Só testando Removed functions : X – eregi 1


- e.g. $a['foo'] where $a is call_user_method() and situação no
a string - now return false call_user_method_array() makefont.php
on isset() and true on , All ereg* functions
empty()

Parameter names that NA The deprecated


shadow super globals now mcrypt_generic_end()
cause a fatal error. This function has been
prohibits code like function removed in favour of
foo($_GET, $_POST) {} mcrypt_generic_deinit().

array_combine() now NA All ext/mysql functions


returns array() instead of were removed
FALSE when two empty
arrays are provided as Nota: foram alteradas
parameters. as funções para utilizar
as funções de MySQLi.
Foi necessário alterar a
ordem dos parametros
+ alteração de métodos
estáticos para não
estáticos.

The third parameter of NA New objects cannot be


ob_start() has changed assigned by reference
from boolean erase to
integer flags
keywords are now NA
reserved: trait, callable,
insteadof

functions have been NA


removed:
define_syslog_variables(),
import_request_variables(),
session_is_registered(),
session_register(),
session_unregister(),
mysqli_bind_param(),
mysqli_bind_result(),
mysqli_client_encoding(),
mysqli_fetch(),
mysqli_param_count(),
mysqli_get_metadata(),
mysqli_send_long_data(),
mysqli::client_encoding()
and mysqli_stmt::stmt()

Após a indicação da existência do projecto https://github.com/sstalle/php7cc , que percorre todo o código fonte da aplicação e enumera
possíveis erros que irão surgir com PHP7, foi gerado o seguinte relatório para o projecto:

Comando:

/var/www/vendor/sstalle/php7cc/bin$ php php7cc.php --except=/var/www/market/configPHP/apark_40_scripts/


--except=/var/www/market/public_html/objects/DAOAutomatedDebitSDB.php
--except=/var/www/market/public_html/objects/DAOAutomatedDebitSDD.php
--except=/var/www/market/public_html/objects/DAORetainers.php
--except=/var/www/market/public_html/objects/DAOParkCustomers.php /var/www/market/ >>
/tmp/search_php7_total_com_excepcoes.txt

De notar que foi necessária a exclusão de alguns ficheiros pois estes entravam em ciclo infinito e causavam uma excepção na
execução do script:

/var/www/market/configPHP/apark_40_scripts/

/var/www/market/public_html/objects/DAOAutomatedDebitSDB.php

/var/www/market/public_html/objects/DAOAutomatedDebitSDD.php

/var/www/market/public_html/objects/DAOParkCustomers.php

/var/www/market/public_html/objects/DAORetainers.php

Como o objectivo da execução do script era o levantamento dos tipos de erros com que teremos que lidar, não foi dedicado tempo
para perceber e "alterar/corrigir" os 4 ficheiros excluídos.

O resultado da execução do script resultou no seguinte relatório: search_php7_total_com_excepcoes.txt

Após a analise do relatório, foram idenficados os seguintes erros recorrentes e definida a sua possível correcção. Segue a tabela de
"tratamento de erros":

Tipo Erro Resolução OBS

[Error] PHP 4 constructors are Trocar nome da função para


now deprecated __construct()

[Error] Removed function Trocar função para trocado


"mysql_affected_rows" called "mysqli_affected_rows"

[Error] Removed function Trocar função para "mysqli_close" trocado


"mysql_close" called

[Error] Removed function Trocar função para "mysqli_connect" trocado


"mysql_connect" called

[Error] Removed function Trocar função para "mysqli_data_seek" trocado


"mysql_data_seek" called
[Error] Removed function Trocar função para "mysqli_errno" trocado
"mysql_errno" called

[Error] Removed function Trocar função para "mysqli_error" trocado


"mysql_error" called

[Error] Removed function Trocar função para trocado


"mysql_escape_string" called "mysqli_escape_string"

[Error] Removed function Trocar função para "mysqli_fetch_array" trocado


"mysql_fetch_array" called

[Error] Removed function Trocar função para trocado


"mysql_fetch_assoc" called "mysqli_fetch_assoc"

[Error] Removed function Trocar função para "mysqli_field_name" trocado


"mysql_field_name" called

[Error] Removed function Trocar função para "mysqli_insert_id" trocado


"mysql_insert_id" called

[Error] Removed function Trocar função para "mysqli_num_fields" trocado


"mysql_num_fields" called

[Error] Removed function Trocar função para "mysqli_num_rows" trocado


"mysql_num_rows" called

[Error] Removed function Trocar função para "mysqli_query" trocado


"mysql_query" called

[Error] Removed function Trocar função para trocado


"mysql_real_escape_string" called "mysqli_real_escape_string"

[Error] Removed function Trocar função para "mysqli_select_db" trocado


"mysql_select_db" called

[Error] Removed function Trocar função para "sqlsrv_close" trocado


"mssql_close" called

[Error] Removed function Trocar função para "sqlsrv_connect" trocado - Muda a forma como é feito, recebe o host e
"mssql_connect" called um array de dados onde tem informação como user,
password, dbname, etc.

[Error] Removed function Trocar função para "sqlsrv_fetch_array" trocado, faltava também o mssql_fetch_assoc, que
"mssql_fetch_array" called passou para sqlsrv_fetch_array mas com a definição
explicita do segundo parâmetro.

[Error] Removed function Trocar função para Após análise deve ser utilizado o
"mssql_get_last_message" called "sqlsrv_get_last_message" sqlsrv_errors : print_r( sqlsrv_errors()
, true)

[Error] Removed function Trocar função para "sqlsrv_num_rows" trocado


"mssql_num_rows" called

[Error] Removed function Trocar função para "sqlsrv_query" trocado - A ordem dos parâmetros é invertida, primeiro
"mssql_query" called a connection, depois a query

[Error] Removed function Trocar função para trocado


"mssql_rows_affected" called "sqlsrv_rows_affected"

[Error] Removed function Utilizar a função sqlsrv_connect para Pode ser um problema no caso de termos mais bases
"mssql_select_db" called definir a BD ($connectionInfo = array( de dados no HADA
"Database"=>"dbName");)

[Error] Removed function Ver caso a caso || confirmar You should NEVER rely on magic quotes or
"set_magic_quotes_runtime" configuração || Definir expressão regular addslashes for security in an SQL context.
called

[Error] Removed regular Support for the /e modifier has been


expression modifier "e" used removed. Use preg_replace_callback()
instead.
[Error] Removed function "eregi" Começar a utilizar o preg_match()
called

[Error] Multiple default cases Retirar opções depois do default


defined for the switch statement

[Error] Class/trait/interface "Error" Mudar o nome, uma vez que “Error”


was added in the global passou a ser palavra reservada.
namespace

[Warning] Function argument(s) Verificar caso a caso :.( You are right, it just checks if a certain statement/call
returned by "func_get_args" might occurs before func_get_args in a function, so it's very
have been modified imprecise

[Warning] Indirect variable, Verificar caso a caso :.( Podem ser falsos positivos
property or method access

[Warning] Possible array element Verificar caso a caso :.(


creation during by-reference
assignment

[Error] Syntax error, unexpected '{' Falhas na definição de variáveis (p.ex:


on line 3. Processing aborted. define('CONFIG_FOO', {FOO});) -
Corrigir

[Error] Bitwise shift by 32 bits Actualizar composer (?) - Sphinx

PHPEXCEL é uma das principais Actualizar o PHPExcel


fontes de erros!!!!!

Conclusões:

A grande maioria dos casos parece uma troca directa de funções, em que os parâmetros de entrada coincidem.

As situações de warnings identificadas terão que ser verificadas uma a uma, pois podem tratar-se de falsos positivos.

Existe a situação de "mssql_select_db" que também terá que ser analisada, pois passa a ser um parametro no connect.

A actualização das bibliotecas via composer para veroes mais recentes (como o phpmailer), resolverá também um grande número de
situações.

Вам также может понравиться