🎯Raio-X do Marketing Digital: Tendências e desafios 🚀

Por que atualizar a versão do PHP para a 5.6?

Publicado em 15/06/2016

Atualizado em 04/06/2024

É difícil manter nossos sistemas atualizados, sobretudo aqueles que apresentam maior complexidade. Porém, se atualizarmos um pouquinho a cada dia, essa tarefa se torna mais tranquila. Neste artigo vamos falar do por que atualizar a versão do PHP para a 5.6.

Muitos acreditam que a atualização de sistemas demanda tempo e dinheiro, mas não visualizam que esta atividade pode, justamente, evitar que você venha a perdê-los em caso de um comprometimento do mesmo devido a falhas de segurança.

Atualizar seus sistemas, além de torná-los mais seguros e menos suscetíveis a invasões, permite, muitas vezes, acesso a novas funcionalidades, além de um desempenho superior, trazendo assim uma melhor experiência para seus usuários e/ou clientes

Para tornar sua vida mais fácil durante este processo, traremos neste artigo um breve tutorial para lhe auxiliar em manter sua versão do PHP sempre atualizada.

O que eu ganho atualizando a versão de PHP de meus sistemas?

Há várias razões para fazer a atualização do PHP. Uma delas é o fato das versões anteriores à 5.6 estarem descontinuadas. Ou seja, elas não oferecem mais atualizações de segurança, deixando seus sistemas vulneráveis a ataques maliciosos.

Outros dois bons motivos para atualizar são a performance e o consumo de recursos. A cada versão do PHP, a velocidade de execução de scripts é melhorada, além deles utilizarem cada vez menos recursos computacionais. Para corroborar esta afirmação, o gráfico abaixo demonstra o quanto uma aplicação PHP pode atender a mais requisições apenas efetuando a troca de versão.

migração

Bacana, né? Em nosso post sobre o lançamento do PHP 7.2, falamos mais sobre a performance das versões 7.x em comparação com as antigas versões 5.x. Também já destacamos a importância de manter suas versões de PHP atualizadas.

OK! Vocês me convenceram. Para qual versão atualizar minha aplicação?

Se você utiliza atualmente uma versão do PHP inferior à versão 5.6, indico inicialmente a atualização para esta versão, a fim de aproveitar agora mesmo os ganhos de performance e segurança que esta versão traz para a série 5.x sem que ocorra grandes incompatibilidades.

Porém, como a versão 5.6 entrará em final de ciclo de vida (EOL) no final deste ano, foque seus esforços em migrar para a série 7.x, visto que a versão 5.6 entra no final de seu ciclo de vida em novembro de 2018.

O que mudou no PHP 5.6 que eu devo me preocupar?

Agora vamos entender as funções que estão sendo descontinuadas e como compatibilizar sua aplicação.

  • Suporte a nova sintaxe para arrays

Foi adicionado suporte ao short array syntax, em vez de declarar um array sendo

$antigo = array("Laranja", "Rosa", "Vermelho", "Preto");

agora é possível declarar como

$novo = ["Laranja", "Rosa", "Vermelho", "Preto"];

Outras novidades podem ser vistas no manual de migração.

Outras mudanças importantes 

  • MySQL => MySQLi

Algumas funções da extensão mysql vem se tornando obsoletas desde a versão 5.3 do PHP,  algumas inclusive, já foram removidas da versão 7. Como alternativa, é possível utilizar as extensões PDO_MySQL ou a mysqli, conforme exemplos abaixo:

O código de conexão com o mysql era

mysql_connect($host,$username,$password) or die ('ERROR: Could not connect to server!');
mysql_select_db($database) or die('Could not connect to db!');

Agora é

$db = mysqli_connect($host,$username,$password,$database) or die ('ERROR: Could not connect to database!');

Para alterar uma base era

mysql_select_db($database);

Agora é

mysqli_select_db($db, $database);

Para executar queries o código era

mysql_query("SELECT * WHERE 1");

Agora é

mysqli_query("SELECT * WHERE 1");

Outras funções ficaram

mysql_affected_rows -> mysqli_affected_rows($link)
mysql_close -> mysqli_close($link)
mysql_data_seek -> mysqli_data_seek( $result, $offset)
mysql_errno -> mysqli_errno( $link)
mysql_error -> mysqli_error( $link)
mysql_fetch_array -> mysqli_fetch_array( $result, $type)
mysql_fetch_assoc -> mysqli_fetch_assoc( $result)
mysql_fetch_lengths -> mysqli_fetch_lengths( $result )
mysql_fetch_object -> mysqli_fetch_object( $result, $class, $params)
mysql_fetch_row -> mysqli_fetch_row( $result)
mysql_field_seek -> mysqli_field_seek( $result, $number)
mysql_free_result -> mysqli_free_result(result)
mysql_get_client_info -> mysqli_get_client_info( $link)
mysql_get_host_info -> mysqli_get_host_info( $link)
mysql_get_proto_info -> mysqli_get_proto_info( $link)
mysql_get_server_info -> mysqli_get_server_info( $link)
mysql_info -> mysqli_info( $link)
mysql_insert_id -> mysqli_insert_id( $link)
mysql_num_rows -> mysqli_num_rows( $result)
mysql_ping -> mysqli_ping( $link)
mysql_query -> mysqli_query( $link, $query)
mysql_real_escape_string -> mysqli_real_escape_string( $link)
mysql_select_db - > mysqli_select_db( $link, $database)
mysql_set_charset -> mysqli_set_charset( $link, $charset)
mysql_stat -> mysqli_stat( $link)
mysql_thread_id -> mysqli_thread_id( $link)
  • magic_quotes => addslashes()

O uso do magic_quotes foi descontinuado pelo PHP, com isso ganhamos mais performance no PHP.
É possível utilizar a função addslashes(), quando necessário, para substituir o magic_quotes
Um exemplo de uso abaixo

ex. 1:

<?php
//string que será escapada caso haja caracteres como aspa simples
echo "Altered Text: ".addslashes($_POST['question']);
?>
<form method='post'>
Question: <input type='text' name='question'/><br />
<input type='submit'>
</form>

ex. 2:

<?php
$str = "Is your name O'Reilly?";
// Outputs: Is your name O\'Reilly?
echo addslashes($str);
?>
  • ereg, eregi => preg_match()

Tanto a função ereg quanto a eregi foram removidas da versão mais recente do PHP devido a bugs encontrados nelas.
O uso dessas funções podem ser

<?php
//eregi => preg_match
$string = 'XYZ';
eregi('z', $string, $r);
var_dump($r);

$string = 'XYZ';
//o parametro i depois do ultimo delimitador indica a configuracao case-insensitive
preg_match('/z/i', $string, $matches);
var_dump($matches);
?>

<?php
//ereg => preg_match
$date = date("Y-m-d");
ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $r);
var_dump($r);

$date = date("Y-m-d");
preg_match("/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/", $date, $matches);
var_dump($matches);
?>
  • ereg_replace, eregi_replace => preg_replace()

Assim como o ereg() e o eregi(), as funções ereg_replace() e eregi_replace() também foram removidas na versão mais recente do PHP.
Essas funções podem ser facilmente substituídas pela função preg_replace(), abaixo um exemplo para a migração da função.

<?php
//ereg_replace => preg_replace() 
$num = '5';
$string = "Essa frase tem cinco palavras.";
$string = ereg_replace('cinco', $num, $string);
var_dump($string);

$num = '5';
$string = "Essa frase tem cinco palavras.";
$string = preg_replace('/cinco/', $num, $string);
var_dump($string);
?>

<?php
//eregi_replace => preg_replace() 
$num = '5';
$string = "Essa frase tem cinco palavras.";
$string = eregi_replace('CINCO', $num, $string);
var_dump($string);

$num = '5';
$string = "Essa frase tem cinco palavras.";
$string = preg_replace('/CINCO/i', $num, $string);
var_dump($string);
?>
  • session_register, session_unregister, session_is_registered => $_SESSION

As funções session_register(), session_unregister() e session_is_registered() deixaram de funcionar desde a versão 5.4 do PHP. Porém, é possível utilizar a a variável super global $_SESSION. Abaixo alguns exemplos para substituição.

<?php
//session_register()
$barney = "A big purple dinosaur.";
session_register("barney");

$_SESSION["barney"] = "A big purple dinosaur.";
?>

<?php
//session_unregister()
$barney = "A big purple dinosaur.";
session_register("barney");
session_unregister("barney");

$_SESSION["barney"] = "A big purple dinosaur.";
unset($_SESSION["barney"]);
?>
<?php
//session_is_registered()
$barney = "A big purple dinosaur.";
session_register("barney");
if(session_is_registered("barney")){
	echo "registrado.\n";
}else{
	echo "não registrado.\n";
}

$_SESSION["barney"] = "A big purple dinosaur.";
if(isset($_SESSION["barney"])){
	echo "registrado.\n";
}else{
	echo "não registrado.\n";
}

?>
  • php_mssql => sql_srv

A biblioteca mssql já não vem mais habilitada desde a versão 5.3 do PHP. Atualmente a microsoft desenvolveu o driver sqlServ, que pode ser utilizada como substituto ao php_mssql.
Abaixo uma tabela com as funções e suas comparações.

MSSQL Function => SQLSRV Equivalent Function(s)
mssql_bind => sqlsrv_query
With the sqlsrv API, stored procedure parameters are defined in an array that is passed to sqlsrv_query or sqlsrv_prepare. For more information and examples, see How to: Retrieve Output Parameters, How to: Retrieve Input/Output Parameters, and sqlsrv_next_result.

mssql_close => sqlsrv_close
These functions are equivalent, but note that calling sqlsrv_close returns a connection to a connection pool. For more information, see Connection Pooling.

mssql_connect => sqlsrv_connect
These functions are equivalent, but note that sqlsrv_connect attempts to use a pooled connection before it creates a new one. For more information, see Connection Pooling.
 
mssql_data_seek => sqlsrv_fetch or sqlsrv_fetch_array
The sqlsrv API provides forward-only reading of result sets by default. However, in v1.1 of the driver, you can specify and retrieve any row of a result set with sqlsrv_fetch or sqlsrv_fetch_array. For more information, see Specifying a Cursor Type and Selecting Rows.
 
mssql_execute => sqlsrv_query
There are no special functions for executing stored procedures in the sqlsrv API. Stored procedures are executed with the sqlsrv_query function. For more information and examples, see How to: Retrieve Output Parameters, How to: Retrieve Input/Output Parameters, and sqlsrv_next_result.

mssql_fetch_array => sqlsrv_fetch_array
These functions are equivalent.
 
mssql_fetch_assoc => sqlsrv_fetch_array
The sqlsrv_fetch_array function returns a row with both numeric and associative indexes by default. You can retrieve only an associative array by using the SQLSRV_FETCH_ASSOC constant in the function call.

mssql_fetch_batch => No equivalent function.
While the sqlsrv API does not have a function equivalent of mssql_fetch_batch, the number of rows in a result set can obtained using sqlsrv_num_rows. As you process rows, you can track the number of remaining rows.

mssql_fetch_field => sqlsrv_field_metadata
These functions both return metadata about a result set, although they each return slightly different metadata. See mssql_fetch_field and  for sqlsrv_field_metadata details.
 
mssql_fetch_object => sqlsrv_fetch_object
These functions are equivalent.
 
mssql_fetch_row => sqlsrv_fetch_array
These functions are equivalent, but note that the sqlsrv_fetch_array function returns an array with both numeric and associative indexes by default. You can retrieve only a numeric array by using the SQLSRV_FETCH_NUMERIC constant in the function call.
 
mssql_field_length => No equivalent function.
Note that for some field types, the maximum length is returned by the sqlsrv_field_metadata function.

mssql_field_name => sqlsrv_field_metadata
In addition to other information, the field name is retuned by the sqlsrv_field_metadata function.
 
mssql_field_seek => No equivalent function.
When using the sqlsrv_get_field function, fields must be accessed in order. The sqlsrv API does not provide a way to access fields randomly.
 
mssql_field_type => sqlsrv_field_metadata
In addition to other information, the field name is retuned by the sqlsrv_field_metadata function.

mssql_free_result => sqlsrv_cancel
These functions are equivalent.

mssql_free_statement => sqlsrv_free_stmt
These functions both free resources associated with a statement, but note that the sqlsrv_free_stmt does this for any statement (not only statements associated with stored procedures).
 
mssql_get_last_message => sqlsrv_errors
These functions both return error information about the last operation performed, but the sqlsrv_errors function returns information in an array (error code and error message).
 
mssql_guid_string => No equivalent function.
While the sqlsrv API does not provide a function for converting GUIDs to strings, you can convert GUIDS to string-compatible types on the server with the CONVERT function.
 
mssql_init => No equivalent function.
There is no special function for initializing stored procedures in the sqlsrv API. Stored procedures are executed with the sqlsrv_query function. For more information and examples, see How to: Retrieve Output Parameters, How to: Retrieve Input/Output Parameters, and sqlsrv_next_result.

mssql_min_error_severity => No equivalent function.
The sqlsrv API does not provide functionality for filtering errors based on severity. For information on handling errors with the sqlsrv API, see How to: Configure Error and Warning Handling and How to: Handle Errors and Warnings.
 
mssql_min_message_severity => No equivalent function.
The sqlsrv API does not provide functionality for filtering errors based on severity. For information on handling errors with the sqlsrv API, see How to: Configure Error and Warning Handling and How to: Handle Errors and Warnings.
 
mssql_next_result => sqlsrv_next_result
These functions are equivalent.
 
mssql_num_fields => sqlsrv_num_fields
These functions are equivalent.
 
mssql_num_rows =>  sqlsrv_num_rows
These functions are equivalent.

mssql_pconnect => sqlsrv_connect
The default behavior of the sqlsrv_connect function is to open a pooled connection if one is available. When a script ends or when sqlsrv_close is called, the connection is returned to the connection pool. For more information, see Connection Pooling.

mssql_query => sqlsrv_query
These functions are equivalent.

mssql_result => sqlsrv_fetch/sqlsrv_get_field
The combination of the sqlsrv_fetch and sqlsrv_get_field functions are equivalent to the mssql_result function. Calling sqlsrv_fetch makes a row of data available for reading and sqlsrv_get_field reads fields in the current row.

mssql_rows_affected => sqlsrv_rows_affected
These functions are equivalent.

mssql_select_db => No equivalent function.
To select a database with the sqlsrv API, use sqlsrv_query to execute the following query: USE databaseName.

Retirado do blog MSDN da Microsoft.

  • split => explode

A função split tornou-se obsoleta na versão 5.3. Há alternativas para substituição, como preg_split(), str_split() ou explode().
Abaixo exemplo utilizando explode().

<?php
//split
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $extra) =
    split(":", $data, 5);
?>
<?php
//explode
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $extra) =
    explode(":", $data, 5);
?>

Eu não manjo de programação PHP. #comofaz?

Para você, que deseja utilizar uma nova versão de PHP mas não possui domínio da linguagem para realizar grandes alterações no código, compartilho com você um projeto que foi criado para PHP 7 e superior, que com um simples include em seus scripts PHP, te permite usar funções descontinuadas em versões superiores de PHP. Você encontra o projeto no Github.
Veja abaixo um trecho do código que retirei do projeto de como foram feitas as criação das funções de compatibilidade:

if (!function_exists('ereg')) {
    function ereg($pattern, $subject, &$matches = array())
    {
        return preg_match('/' . $pattern . '/', $subject, $matches);
    }
}

Vale ressaltar que para cada função foi utilizado “function_exists”. Ou seja, só irá definir a função se esta já não existir, impedindo assim que a função seja reescrita caso a versão do PHP selecionada já possua esta função definida nativamente.

Para utilizá-las, baixe os arquivos para o seu FTP e utilize a função include do PHP. Abaixo, uma simples demonstração de uso:

<?php
include 'wrapper-legacy.php';
include 'wrapper-mssql.php';
include 'wrapper-mysql.php';
?>

A partir deste momento, você poderá utilizar funções descontinuadas como, por exemplo, o ereg:

<?php
include 'wrapper-legacy.php';
include 'wrapper-mssql.php';
include 'wrapper-mysql.php';

	if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) {
   		 echo "$regs[3].$regs[2].$regs[1]";
} else {
    		echo "Formato data inválido: $date";
}

?>

Para que não precise fazer os 3 includes em todos os seus scripts, indico que crie um arquivo, por exemplo, autoload.php, adicione os includes necessários e só chame este autoload.php nos scripts que necessitarem deles. Caso sua aplicação tenha um script que seja instanciado em todos os seus script, faça o include deste script autoloader.php neste arquivo.

Conteúdo elaborado pelo colaborador pelo colaborador Franklin Guimarães Fernandes Junior – Analista de Infraestrutura na KingHost, com atualização de Diego Cassolli em Agosto/2018.

Fique ligado no Blog da KingHost para mais novidades e materiais sobre PHP.

O que você achou deste conteúdo?

O que você achou deste conteúdo?

Redação KingHost
Redação KingHost
Somos uma empresa de soluções digitais, especialistas em simplificar o uso da tecnologia e referência em hospedagem de site.
Redação KingHost
Redação KingHost
Somos uma empresa de soluções digitais, especialistas em simplificar o uso da tecnologia e referência em hospedagem de site.

Compartilhe esse conteúdo com alguém que possa gostar também

Receba todo mês conteúdos
incríveis como esses para
seguir evoluindo

Conteúdos relacionados

Ataque DDoS é uma das ameaças mais temidas por quem tem um site na internet. Imagine anos de investimento para construir a credibilidade de uma presença digital, para ver seu site sendo afetado por um ataque desse tipo.  Para se ter uma ideia, o Brasil pelo 10º ano consecutivo, é o líder do ranking de...

Mensagens para você