Acasă » Blog » Adaptare platforma web de la PHP 5.6 la PHP 7.2

Adaptare platforma web de la PHP 5.6 la PHP 7.2

Share this post on social!

Migrarea unor platforme standard sau custom bazate pe limbajul PHP si construite pe versiuni vechi de PHP anterioare lui PHP 7.0 necesita analize atente ale codului, utilizarea unor programe terte de inspectare automata a surselor si indicare a functiilor sau structurilor care nu mai sunt valabile in noua versiune de limbaj sau sunt modificate.

PHPCompatibility

Defapt PHP Compatibility Coding Standard for PHP CodeSniffer

Cerinte:

  • PHP 5.3+
  • PHP CodeSniffer: 2.3.0+ or 3.0.2+.

Instalare PHP CodeSniffer si PHPCompatibility

Se instaleaza mai intai PHP CodeSniffer (am utilizat Composer; vezi aici descrierea instalarii PHP CodeSniffer

Apoi PHPCompatibility ca standard pentru PHP Code Sniffer (vezi metoda nr 2: Installation via a git check-out to an arbitrary directory (method 2))

Obtinere incompatibilitati

Se poate rula in fereastra de comanda: 
 phpcs -p --standard=PHPCompatibility /path/to/file-or-directory 

Si se vor lista toate incompatibilitatile generate de utilizarea unor functii eliminate din noua versiune de PHP sau care folosesc alti parametrii sau alta ordine a parametrilor.

Pentru salvarea rezultatului intr-un fisier de raport se ruleaza:

 phpcs -p --standard=PHPCompatibility /path/to/file-or-directory phpcs -p --standard=PHPCompatibility --report-full=/path/to/file-or-directory/report-file-name

Iar pentru a ingusta verificarea pentru un set de versiuni PHP, se poate rula:

 phpcs -p --standard=PHPCompatibility /path/to/file-or-directory phpcs -p --standard=PHPCompatibility --runtime-set testVersion 7.3-7.4 --report-full=/path/to/file-or-directory/report-file-name

Aplicarea corectiilor de compatibilizare a codului la PHP 7.2.

O situatie concreta este legata de functiile native PHP de interogare a bazei de date mysql

Exemple:

  • mysql_connect() ;
  • mysql_select_db();
  • mysql_query();
  • mysql_result();
  • mysql_fetch_assoc();
  • mysql_fetch_array()
  • mysql_fetch_object();
  • mysql_num_rows()
  • mysql_affected_rows();
  • mysql_error()

Functiile mysql_* sunt eliminate din PHP 7.2.

Solutia gasita este inlocuirea cu functiile corespunzatoare mysqli_*

Problema este ca functiile mysqli_ folosesc alti parametri, in alta ordine

Exemplu:

mysql_query($query, $link); $link este resursa de conectare la baza de date si este parametru optional!

mysqli_query($link, $query); $link este obligatoriu

In cazul unui proiect concret, prezenta functiilor mysql_* a fost de ~ 4000 de ori in 1200 de fisiere.

Solutia de rezolvare a 90% din incompatibilitatile platformei cu PHP 7.2

Este deci exclusa incercarea de update automat in editor mysql_ cu mysqli_

Am descoperit o sugestie in internet care indruma spre crearea unor functii mysql_ wrapper;

Intr-adevar, solutia functioneaza pentru ca functiile mysql_ nu mai exista deci le putem crea. Iar in interiorul fiecareia apelam functia mysqli_ corespunzatoare cu parametrii setati corect.

Si aici sunt detalii, legate de exemplu de necesitatea setarii unei variabile “link” – conectorul la baza de date – in vectorul $GLOBALS accesibila in orice functie.

Implementarea nu se opreste aici, pentru ca de exemplu mysql_query intoarce ca rezultat o resursa in vreme ce mysqli_query intoarce un obiect iar in platforma custom pe care o compatibilizez de la PHP 5.2 la PHP 7.2 exista in 44 de locuri o conditionare is_resource($result), unde $result este raspunsul lui mysql_query();

Concluzie solutie de trecere platforma la PHP 7.2

Asadar, cu acest compromis de modificare a 44 de fisiere, treaba se apropie de rezolvare, esentialul facand-ul fisierul cu functiile wrapper inclusse cu require_once intr-un script comun apelat de fiecare pagina

Deci al 45-lea fisier este fisierul in care apelez require_once “fisier_functii_mysql_wrapper_la_mysqli.php”

Solutia functiilor wrapper pentru mysqli_ sunt denumite mysql_ Denumirea functiilor wrapper ca mysql_ completeaza ideea de functii wrapper cu rezultatul extraorindar ca nu mai este nevoie de update-ul functiilor originale mysql_ cu alte nume de xemplu pdo_ … in miile de fisiere ale platformei.

Traian Constantin Predan

Traian Constantin Predan

Inginer absolvent al Politehnicii București proiectează și construiește sisteme online. Lucrează proiecte extrem de diverse, îi plac viziunile noi care provoacă la dezvoltarea unor soluții tehnice eficiente și stabile.