1. Home
  2. Tehniline
  3. PHP
  4. Kuidas testida ja uuendada aegunud PHP versiooniga Virtuaalservereid?

Kuidas testida ja uuendada aegunud PHP versiooniga Virtuaalservereid?

PHP versiooni testimine

Kui mõnes sinu virtuaalserveris on kasutusel aegunud PHP versioone, tekib selle kohta vastav hoiatus Minu Zone keskkonnas teenuste ülevaate lehele.

Klõpsates lehe päises olevale nupule Vaata pääsed ülevaate lehele, kus kuvatakse serveris olevaid aegunud PHP hoste (pea- ja alamdomeenid).

Kuna PHP versioonivahetus võib tekitada veebilehele veateateid ja versiooni vahetus võtab kuni 3 minutit, siis on soovitatav enne muudatust lehe toimivust testida.

Testimiseks klõpsa nimistus soovitud aadressi peale:

Peale seda avaneb testitav veebileht, kus päises on valik erinevate PHP versioonidega. Nende vahel valides näed tulemust erinevate PHP versioonidega. Näiteks:

PHP 5.6:

PHP 8.1:

Minimaalne PHP versioon, mida Zone lubab sul endale valida ongi PHP 5.6. Kuid arvesta, et ka see on aegunud – selles turvaauke enam arendaja poolt ei parandata, kuigi tehniliselt on võimalik seda veel toetada. Soovitav on uuendada PHP versioonile 8.0, kuna ka PHP 5.6 on aegunud ja ei saa enam turvauuendusi.

Kaasaegsete veebirakenduste nagu WordPress puhul soovitame proovida üleminekut PHP versioonile 8.0 või 8.1 tehes eelnevalt WP ja pluginate-teemade uuenduse.

Uuendamata veebirakenduste puhul võib üleminek PHP 8.x versioonile olla keeruline, sest erinevused 5.6 ja 7.x vahel on suured.

Sagedasemad vead versioonivahetusel

Täpitähtede asemel küsimärgid

PHP 5.6 lisab lehtedele vaikimisi UTF-8 tähekodeeringu kasutamisele viitava päise, vanemaid kodeeringuid kasutavatel lehtedel tuleb see eemaldada ja jätta kodeeringu tuvastamine brauserile.

Lihtsaim viis selleks on lisada veebi juurkataloogi htdocs fail .user.ini seadistusega:

default_charset = ''

Veateade Fatal error […]

Veebilehte ei kuvata ning lehe alguses on teade, näiteks:

Fatal error: Call to undefined function session_register() in [...]
Fatal error: Call to undefined function sqlite_open() in [...]
Fatal error: Call to undefined function wp_script_add_data() in [...]
Fatal error: Call-time pass-by-reference has been removed in [...]

Tegemist on pöördumisega funktsiooni poole, mis on PHP keelest eemaldatud või mille registreerimine mõne versiooniuuendusest tingitud probleemi tõttu ei õnnestu.

Erandiks on  Call-time pass-by-reference has been removed, mis on seotud muutusega PHP süntaksis.

Rakenduse viimiseks uuemale PHP versioonile on vajalik tuvastada vea täpne põhjus ja parandada koodi.

Veateade Fatal error: Incompatible file format

Veebilehte ei kuvata ning lehe alguses on veateade:

Fatal error: Incompatible file format: The encoded file has
format major ID 1, whereas the Loader expects 7
in /data[...]/htdocs/index.php on line 0

Võib kohata Zend Guardi abil krüptitud/litsentsitud rakenduste, ennekõike Sauruse puhul. PHP versiooni vahetamine versioonile 5.6 on võimalik ainult rakenduse koodi väljavahetamise ja uuendamisega (Sauruse tasulist tuge pakub viimasena Bonefarm). Veebi võib teisendada staatiliseks HTMLiks või viia üle tänapäevasele sisuhaldusele, näiteks WordPressile.

Veateade Warning: Cannot modify header information […]

Seda hoiatust kuvatakse, kui lehe genereerimise käigus on tekkinud teisi hoiatusi või veateateid, mille väljastamise tõttu ei ole võimalik saata HTTP päringu päiseid:

Warning: Cannot modify header information -
headers already sent by (output started at [...]wp-db.php:57)
in [...]

Ei oma iseseisvat tähendus, võib ignoreerida.

Veateade Warning […]

Veebilehe avamisel kuvatakse lehe alguses või mõnes komponendis teade:

Warning: Creating default object from empty value in [...]
Warning: file_put_contents(): Filename cannot be empty in [...]
Warning: get_class() expects parameter 1 to be object, string given in [...]
Warning: getimagesize(): Filename cannot be empty in [...]
Warning: Illegal string offset 'face' in [...]
Warning: Invalid argument supplied for foreach() in [...]

Mõne funktsiooni parameetri tüüp või väärtus ei vasta oodatule, seega mõni veebirakenduse funktsionaalsus võib toimida plaanitust erinevalt (enamasti lihtsalt soovitud sisu väljastamata jättes).

Kui funktsionaalsus ei ole oluline, siis võib ignoreerida ja keelata Warning teadete väljastamise, lisades veebi juurkataloogi htdocs faili .user.ini seadistusega:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING

Zone vaikeseadistus on: error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

Veateade Deprecated […]

Veebilehe avamisel kuvatakse lehe alguses või mõnes komponendis teade:

Deprecated: Assigning the return value of new by reference is deprecated in [...]
Deprecated: Function set_magic_quotes_runtime() is deprecated in [...]
Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in [...]
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in [...]

Viidatud funktsioon, selle parameeter või süntaks kaob PHP järgmistest versioonides, aga see ei mõjuta valitud versiooni tööd.

Zone Virtuaalserverites on Deprecated teadete väljastamine vaikimisi keelatud, tõenäoliselt on muudetud seadistust rakenduse koodis, vähemtõenäoliselt globaalse php.ini või .user.ini abil (vt näidet Warning teate juurest).

Seadistuskoha tuvastamiseks sobib käsurealt otsing:

grep -r E_ALL .

Näiteks OpenCart 1.5 puhul annab see tulemuseks järgmised failid:

./vqmod/vqcache/vq2-system_startup.php:error_reporting(E_ALL);
./system/startup.php:error_reporting(E_ALL);
./php.ini:;error_reporting = E_ALL;

PHP koodis tuleks teha muudatus error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED ); ning .ini failides error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

Ühendus andmebaasiga ebaõnnestub

Kui peale PHP versiooni muutmist 5.6+ peale ühendus andmebaasiga ebaõnnestub, siis kontrollida ega andmebaasikasutajal ei ole kasutusel vana, 6-kohaline salasõna (vana krüptoga loodud salasõna).
Lahenduseks on ära vahetada andmebaasikasutaja salasõna. Uus salasõna töötab ka tagasiulatuvalt vanemate PHP versioonidega kui 5.6.

Navigatsioon ei tööta

Kui ei tööta navigatsioon lehtede vahel või vormi saatmise järel ei toimu soovitud tegevust, võib olla selle põhjuseks eeldus, et super-globaalsete muutujate GET, POST, Cookie (EGPCS) massiivid registreeritakse tavapärasteks muutujateks.

See PHP omadus aegus PHP versioonis 5.3.0 ja eemaldati PHP versioonis 5.4.0.

Näiteks on veebilehe menüü lingid päringusõne kujul domeen.ee/?lk=1 ja PHP-failis, kus on lehe laadimise loogika, kasutatakse super-globaalse $_GET['lk'] massiivi asemel muutujat $lk.
Samamoodi ka vormi saatmise puhul, kus vormi elemendi nime <input type="submit" name="form_1" value="Saada"> ei kontrollita super-globaalsest $_POST['form_1'] massiivist, vaid otse muutuja $form_1 kaudu.

Kuidas veenduda, et server kasutab tõesti uut versiooni?

PHP versiooni muutumine serveris võtab aega kuni 3 minutit. Uue PHP versiooni rakendumise kontrolliks on soovitav teha suvalise nimega .php fail, mille sisuks on:

<?php
phpinfo();

Minnes veebibrauseriga lehele example.com/suvaline-nimi.php kuvatakse PHP versiooni ja kõiki seadistusi (turvakaalutlustel soovitame faili seejärel kustutada).

Kui selgub, et koduleht uuema PHP versiooniga ei tööta, siis on võimalik tunni aja jooksul PHP versioon tagasi muuta. Seda saab teha haldusliideses pea- või alamdomeeni seadetes.
Juhis PHP versiooni muutmiseks.

PHP 5.6 → PHP 7.0

Muudeti errorite ja erandite käsitlemist

<?php
// PHP 5 ajastu kood, mis enam ei tööta.
function handler(Exception $e) { ... }
set_exception_handler('handler');

// PHP 5 ja 7'ga ühilduv.
function handler($e) { ... }

// PHP 7.
function handler(Throwable $e) { ... }
?>

Deprekeeriti PHP 4 stiilis construktor’id

Enam ei ole lubatud kasutada sama nime klassi sees oleva funktsiooni jaoks.

<?php
class foo {
    function foo() {
        echo 'I am the constructor';
    }
}
?>

Üleval olev näide kuvab errorit:

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; foo has a deprecated constructor in example.php on line 3

list() funktsioon ei tööta enam tagurpidi

<?php
list($a[], $a[], $a[]) = [1, 2, 3];
var_dump($a);
?>

PHP 5.6 väljund:

array(3) {
  [0]=>
  int(3)
  [1]=>
  int(2)
  [2]=>
  int(1)
}

PHP 7.0 väljund:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Täpsemalt on võimalik 5.6 → 7.0 migreerimise kohta lugeda PHP dokumentatsioonist

PHP 7.0 → PHP 8.0

PHP 7.0 → PHP 7.1

Varasemalt kuvati hoiatust, kui funktsioonile ei lisatud piisavalt argumente, kuid nüüdsest on tegemist fatal erroriga.

<?php
function test($param){}
test();
?>

Ülaltoodud näite puhul kuvatakse nüüd:

Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d

Alates PHP 7.1’st on võimalik lisada tüübinime ette küsimärk. Küsimärgi lisamine tähendab, et funktsiooni argument ja tagastatav väärtus võivad olla kas null või määratud tüüp. Lisaks võeti kasutusele ka void tüüp.

Täpsemalt on võimalik 7.0 → 7.1 migreerimise kohta lugeda PHP dokumentatsioonist

PHP 7.1 → PHP 7.2

Varem oli võimalik number_format(-0.01) funktiooniga tagastada väärtus “-0”, kuid nüüdsest on see parandatud ja kuvatakse “0”.

Enam ei tohi olla parse_str() funktsioon ilma teise argumendita.

Lisatud on uus tüüp object.
Jagatud laiendid ei vaja enam faililaiendite määramist (.so Unix’is ja .ddl failid Windowsis).

Täpsemalt on võimalik 7.1 → 7.2 migreerimise kohta lugeda PHP dokumentatsioonist

PHP 7.2 → PHP 7.3

PHP versioonis 7.3 deprekeeriti tõstutundmatud konstantid.

Alates versioonist 7.3 ei vaja Heredoc ja Nowdoc stringid enam lõppu semikoolonit ega uut tühja rida ja seega lõppevad need isegi siis, kui sisaldavad oma kehas lõpusilti.
Kui PHP 7.3+ koodis sisaldab doc-string endas lõpusilti, siis määratakse koheselt string lõppenuks ning see võib tekitada palju süntaksi vigu. Järgnev doc-string lõppeb juba teise “FOO” juures.

<?php
$str = <<<FOO
    abcdefg
    FOO
FOO;
?>

Täpsemalt on võimalik 7.2 → 7.3 migreerimise kohta lugeda PHP dokumentatsioonist

PHP 7.3 → PHP 7.4

Versioonis 7.4 said klassid toe tüüpide määramiseks:

<?php
class User {
    public int $id;
    public string $name;
}
?>

Deprekeeriti nested ternary toimingud ehk nüüdsest peavad pesastatud kolmekomponendilised toimingud operatsioonide järjekorra määramiseks kasutama sulgusid.

<?php
1 ? 2 : 3 ? 4 : 5; // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok
?>

Sulgusid ei ole vaja, kui pesastatakse keskmist operandi:

<?php
1 ? 2 ? 3 : 4 : 5 // ok
?>

Lisaks deprekeeriti ka massiivi ja stringi offset süntaks, mis kasutas looksulge. Nüüdsest kasutage $var{$idx} asemel $var[$idx].

PHP Fatal error: Array and string offset access syntax with curly braces is no longer supported in

Deprekeeriti funktsioon is_real(), nüüdsest kasutada selle asemel is_float().

Täpsemalt on võimalik 7.3 → 7.4 migreerimise kohta lugeda PHP dokumentatsioonist

PHP 7.4 → PHP 8.0

Suurim muudatus esineb stringi ja numbrite võrdlusel. Palju võidakse kasutada 0 == “”, mis varem oli tõene, kuid nüüd on väär.

Võrdlus Enne Pärast
0 == "0" true true
0 == "0.0" true true
0 == "foo" true false
0 == "" true false
42 == " 42" true true
42 == "42foo" true false

Reserveeriti kaks uut sõna: match ja mixed.

Klassiga sama nimega meetodeid ei tõlgendata enam konstruktoritena. Selle asemel tuleks kasutada meetodit __construct ().

Eemaldati võimalus defineerida tõstutundmatuid konstante.

Täpsemalt on võimalik 7.4 → 8.0 migreerimise kohta lugeda PHP dokumentatsioonist

PHP 8.0 → PHP 8.3

PHP 8.0 → PHP 8.1

Kui staatilisi muutujaid kasutav klass päritakse, siis nüüdsest säilitavad muutujad oma väärtuse.

<?php
class A {
    public static function counter() {
        static $counter = 0;
        $counter++;
        return $counter;
    }
}

class B extends A {}
var_dump(A::counter()); // int(1)
var_dump(A::counter()); // int(2)
var_dump(B::counter()); // int(3), eelnevalt int(1)
var_dump(B::counter()); // int(4), eelnevalt int(2)
?>

Täpsemalt on võimalik 8.0 → 8.1 migreerimise kohta lugeda PHP dokumentatsioonist

PHP 8.1 → PHP 8.2

Lisati atribuut tundlike parameetrite peitmiseks

Lisati #[\SensitiveParameter] atribuut tundlike andmete eemaldamiseks backtrace’idest.

Täpsemalt on võimalik 8.1 → 8.2 migreerimise kohta lugeda PHP dokumentatsioonist

PHP 8.2→ PHP 8.3

php.ini toetab nüüd varu-/vaikeväärtuse süntaksit.

<?php
/*
/path/to/user.ini sisaldab järgmist seadistust:

listen = localhost:${DRUPAL_FPM_PORT:-9000}
*/

$user_ini = parse_ini_file('/path/to/user.ini');
echo $user_ini['listen']; // localhost:9000
?>

Täpsemalt on võimalik 8.2 → 8.3 migreerimise kohta lugeda PHP dokumentatsioonist

Updated on 10. mai 2024
Was this article helpful?

Related Articles