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:
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