---
title: "Kā testēt un atjaunināt serverus ar novecojušām PHP versijām?"
canonical_url: "https://www.zone.lv/help/lv/kb/ka-testet-un-atjauninat-serverus-ar-novecojusam-php-versijam/"
post_type: "ht_kb"
published: "2020-02-06T09:38:03+00:00"
modified: "2020-02-06T09:38:03+00:00"
language: "lv"
author: "postsync"
taxonomies:
  ht_kb_category:
    - name: "PHP"
      url: "https://www.zone.lv/help/lv/kb-categories/php/"
  ht_kb_tag:
    - name: "php"
      url: "https://www.zone.lv/help/lv/kb-tags/php/"
---

# Kā testēt un atjaunināt serverus ar novecojušām PHP versijām?

## PHP versijas testēšana

Ja daži no taviem virtuālajiem serveriem izmanto novecojušas PHP versijas, lapā My Zone Overview parādīsies brīdinājums.

![](https://www.zone.lv/static/sites/5/Zone-ee-Webadmin-legacy-php_eng.png)

Noklikšķinot uz pogas View lapas augšdaļā, tu nonāksi pārskata lapā, kurā redzami serverī esošie novecojušie PHP hosti (galvenais domēns un apakšdomēni).

Tā kā PHP versijas maiņa var izraisīt kļūdu paziņojumus vietnē un izmaiņas var aizņemt līdz 3 minūtēm, pirms maiņas ieteicams notestēt vietnes darbību.

Lai testētu, sarakstā noklikšķini uz vajadzīgās adreses:

![](https://www.zone.lv/static/sites/5/Zone-ee-Webadmin-test-url_eng.png)

Atvērsies testa lapa ar PHP versiju izvēli galvenē. Pārslēdzoties starp tām, tu redzēsi rezultātu ar dažādām PHP versijām. Piemēram:

**PHP 5.6:**

[![](https://www.zone.lv/static/sites/5/php-staging-56.png)](https://www.zone.lv/help/kb/kuidas-naha-ja-uuendada-aegunud-php-versioone/php-staging-56/)

**PHP 8.1:**

[![](https://www.zone.lv/static/sites/5/php-staging-81.png)](https://www.zone.lv/help/kb/kuidas-naha-ja-uuendada-aegunud-php-versioone/php-staging-81/)

 Minimālā PHP versija, ko Zone ļauj izvēlēties, ir PHP 5.6, taču ņem vērā, ka tā arī ir novecojusi — tai vairs netiek izlaisti izstrādātāju labojumi drošības ievainojamībām, lai gan tehniski tā joprojām var tikt atbalstīta. Ieteicams atjaunināt uz PHP 8.0, jo PHP 5.6 ir novecojusi un vairs nesaņem drošības atjauninājumus.

**Mūsdienīgas tīmekļa lietotnes**, piemēram, WordPress, atbalsta jaunākās PHP versijas, un pēc WordPress spraudņu un tēmu atjaunināšanas ieteicams pāriet uz PHP 8.0 vai 8.1.

Atjaunināt **neatjauninātas tīmekļa lietotnes** uz PHP 8.x var būt sarežģīti, jo atšķirības starp 5.6 un 7.x ir lielas.

## Zināmās atjaunināšanas problēmas

### Umlauti tiek aizstāti ar jautājuma zīmēm

![](https://www.zone.lv/static/sites/5/umaleht.png)

Noklusējuma PHP 5.6 konfigurācija pievieno UTF-8 kodējumu HTTP atbildes galvenei, un vecākām vietnēm, kas vietnes tekstā vai meta datos izmanto citu kodējumu, var būt nepieciešams šo galveni noņemt.

Vienkāršākais risinājums ir pievienot `.user.ini` ar šādu iestatījumu tīmekļa servera saknes mapē `htdocs`:

```apacheconf
default_charset = ''
```

### Kļūdas paziņojums Fatal error \[…\]

Vietne netiek parādīta, un lapas augšdaļā redzams paziņojums, piemēram:

```
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 [...]
```

Tas ir izsaukums funkcijai, kas ir izņemta no PHP valodas, vai arī to nevar reģistrēt atjaunināšanas problēmas dēļ.

Izņēmums ir `Call-time pass-by-reference has been removed,` kas ir izņemts [PHP sintakses izmaiņu](https://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available) dēļ.

Lai atjauninātu lietotni uz jaunāku PHP versiju, ir jānosaka precīzs kļūdas cēlonis un jāizlabo kods.

### Kļūdas paziņojums Fatal error: Incompatible file format

Vietne netiek parādīta, un lapas augšdaļā parādās kļūdas paziņojums:

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

Var rasties lietotnēm, kas ir šifrētas/licencētas ar [Zend Guard](https://github.com/sauruscms/Saurus-CMS-Community-Edition), īpaši Saurus. PHP atjaunināšana līdz 5.6 versijai ir iespējama tikai, aizstājot un atjauninot lietotnes kodu (Saurus maksas atbalstu nodrošina [Bonefarm](https://bonefarm.com)). Vietni var pārveidot par statisku HTML vai migrēt uz mūsdienīgu satura pārvaldību, piemēram, WordPress.

### Kļūdas paziņojums: Cannot modify header information \[…\]

Šis brīdinājums tiek parādīts, ja lapas ģenerēšanas laikā rodas citi brīdinājumi vai kļūdu paziņojumi, kuru dēļ nevar nosūtīt HTTP pieprasījuma galvenes:

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

Tam nav patstāvīgas nozīmes, to var ignorēt.

### Kļūdas paziņojums Warning \[…\]

Atverot tīmekļa lapu, lapas augšdaļā vai kādā no tās komponentēm parādās paziņojums:

```
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 [...]
```

Dažu funkciju parametra tips vai vērtība neatbilst gaidītajam, kas nozīmē, ka daļa tīmekļa lietotnes funkcionalitātes var darboties citādi, nekā paredzēts (visbiežāk vienkārši netiek parādīts vajadzīgais saturs).

Ja funkcionalitāte nav svarīga, tu vari ignorēt un atspējot `Warning` paziņojumus, pievienojot `.user.ini` failu savas vietnes saknes direktorijā `htdocs` ar šādiem iestatījumiem:

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

Zone noklusējuma iestatījums ir: `error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED`

### Kļūdas paziņojums Deprecated \[…\]

Atverot vietni, lapas augšdaļā vai kādā no tās komponentēm parādās paziņojums:

```
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 [...]
```

Norādītā funkcija, parametrs vai sintakse pazudīs nākamajās PHP versijās, taču tas neietekmēs izvēlētās versijas darbību.

Zone virtuālajos serveros `Deprecated` paziņojumu izvade pēc noklusējuma ir atspējota, visticamāk lietotnes koda konfigurācijas izmaiņu dēļ, retāk — caur globālo `php.ini` vai `.user.ini` (skat. piemēru `Warning` paziņojumā).

Lai atrastu iestatījuma vietu, var izmantot komandrindas meklēšanu:

```
grep -r E_ALL .
```

Piemēram, OpenCart 1.5 gadījumā tas dos šādus failus:

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

PHP kods jāmaina uz `error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED );` un `.ini` failos uz `error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED`

### Neizdodas datubāzes savienojums

Ja pēc PHP maiņas uz 5.6+ versiju neizdodas savienojums ar datubāzi, pārbaudi, vai datubāzes lietotājs neizmanto veco 6 ciparu paroli (veco kriptogrāfisko paroli).

Risinājums ir nomainīt datubāzes lietotāja paroli. Jaunā parole darbosies arī atpakaļsaderīgi ar PHP versijām, kas ir vecākas par 5.6.

### Navigācija nedarbojas

Ja navigācija starp lapām nedarbojas vai pēc formas iesniegšanas nenotiek pieprasītā darbība, tas var būt saistīts ar pieņēmumu, ka superglobālie GET, POST, Cookie (EGPCS) masīvi ir reģistrēti kā parasti mainīgie.

Šī PHP iespēja tika atzīta par novecojušu PHP 5.3.0 un izņemta PHP 5.4.0.

Piemēram, tīmekļa lapas izvēlnei ir saites ar vaicājuma virkni formā `domeen.ee/?lk=1`, un PHP failā, kas satur lapas ielādes loģiku, tiek izmantots mainīgais `$lk` superglobālā masīva `$_GET['lk']` vietā.
Līdzīgi formas iesniegšanai, kur formas elementa nosaukums `<input type="submit" name="form_1" value="Saada">` netiek pārbaudīts pret superglobālo masīvu `$_POST['form_1']`, bet tieši pret mainīgo `$form_1`.

### Kā pārbaudīt, kura PHP versija tiek izmantota?

PHP versijas maiņa serverī var aizņemt līdz 3 minūtēm. Lai pārbaudītu, kura versija pašlaik tiek izmantota, pievieno .php failu ar nejaušu nosaukumu savas vietnes saknes mapē `htdocs`, kurā ir:

```
<?php
phpinfo();
```

Tu vari apskatīt izvadi, apmeklējot `example.com/random-name.php` (drošības apsvērumu dēļ iesakām šo failu izdzēst).

Ja izrādās, ka vietne ar jaunāku PHP versiju nedarbojas, ir iespējams stundas laikā nomainīt PHP versiju atpakaļ. To var izdarīt Webhosting pārvaldībā galvenā domēna vai apakšdomēna iestatījumos.
[Instrukcijas PHP versijas maiņai.](https://www.zone.lv/help/en/kb/how-to-change-php-version-in-the-web-server/)

### PHP 5.6 → PHP 7.0

**Mainīta kļūdu un izņēmumu apstrāde**

```
<?php
// PHP 5 laikmeta kods, kas salūzīs.
function handler(Exception $e) { ... }
set_exception_handler('handler');

// Saderīgs ar PHP 5 un 7.
function handler($e) { ... }

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

**Novecojuši PHP 4 stila konstruktori**

Metodēm nevar būt tāds pats nosaukums kā klasei, kurā tās ir definētas.

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

Iepriekšējais piemērs izvadīs:

```
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() vairs nepiešķir mainīgos apgrieztā secībā**

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

PHP 5.6 izvade:

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

PHP 7.0 izvade:

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

Uzzini vairāk par 5.6 → 7.0 migrāciju [PHP dokumentācijā](https://www.php.net/manual/en/migration70.php)

### PHP 7.0 → PHP 8.0

**PHP 7.0 → PHP 7.1**

Iepriekš, izsaucot lietotāja definētas funkcijas ar pārāk maz argumentiem, tika izvadīts brīdinājums. Tagad šis brīdinājums ir paaugstināts līdz Error izņēmumam.

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

Iepriekšējais piemērs izvadīs kaut ko līdzīgu:

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

Sākot ar PHP 7.1, ir iespējams atzīmēt atgrieztās vērtības kā nullable, pievienojot tipa nosaukumam jautājuma zīmi. Tas nozīmē, ka papildus norādītajam tipam kā arguments var tikt padots null vai arī null var tikt atgriezts kā vērtība.

Papildus ir ieviests void tips.

Uzzini vairāk par 7.0 → 7.1 migrāciju [PHP dokumentācijā](https://www.php.net/manual/en/migration71.php)

**PHP 7.1 → PHP 7.2**

Iepriekš funkcija number\_format() varēja atgriezt -0. Tagad tas ir izlabots, un atgrieztā vērtība -0.01 tagad izvada “0” nevis “-0”.

Par novecojušu atzīmēta [parse\_str()](https://www.php.net/manual/en/function.parse-str.php) funkcijas izmantošana bez otrā argumenta.

Pievienots jauns tips ar nosaukumu *object* .

Koplietotajiem paplašinājumiem vairs nav jānorāda faila paplašinājums (`.so` Unix vai `.dll` Windows). Tas tiek iespējots php.ini failā, kā arī [dl()](https://www.php.net/manual/en/function.dl.php) funkcijā.

Uzzini vairāk par 7.1 → 7.2 migrāciju [PHP dokumentācijā](https://www.php.net/manual/en/migration72.php)

**PHP 7.2 → PHP 7.3**

Reģistrnejutīgu konstanti deklarēšana ir atzīta par novecojušu. True nodošana kā trešais arguments define() tagad ģenerēs novecošanas brīdinājumu.

Elastīgās heredoc/nowdoc sintakses ieviešanas dēļ doc virknes, kas savā saturā ietver beigu etiķeti, var izraisīt sintakses kļūdas vai interpretācijas izmaiņas. Piemēram:

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

iepriekš atkāptā `FOO` parādīšanās nebija ar īpašu nozīmi. Tagad tā tiks interpretēta kā heredoc virknes beigas, un sekojošais `FOO;` izraisīs sintakses kļūdu. Šo problēmu vienmēr var atrisināt, izvēloties beigu etiķeti, kas neparādās virknes saturā.

Uzzini vairāk par 7.2 → 7.3 migrāciju [PHP dokumentācijā](https://www.php.net/manual/en/migration73.php)

**PHP 7.3 → PHP 7.4**

Klases īpašības tagad atbalsta tipu deklarācijas:

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

Par novecojušiem atzīti ligzdoti ternārie operatori bez skaidrām iekavām:

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

Iekavas *nav* nepieciešamas, ligzdojot vidējā operandā, jo tas vienmēr ir nepārprotami un to neietekmē asociativitāte:

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

Masīvu un virkņu nobīdes piekļuves sintakse, izmantojot figūriekavas, ir novecojusi. Izmanto `$var[$idx]` nevis `$var{$idx}`.

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

Arī [is\_real()](https://www.php.net/manual/en/function.is-real.php) funkcija ir novecojusi — tās vietā izmanto [is\_float()](https://www.php.net/manual/en/function.is-float.php).

Uzzini vairāk par 7.3 → 7.4 migrāciju [PHP dokumentācijā](https://www.php.net/manual/en/migration74.php)

**PHP 7.4 → PHP 8.0**

Nestrikti salīdzinājumi starp skaitļiem un neskaitliskām virknēm tagad darbojas, pārveidojot skaitli par virkni un salīdzinot virknes. Salīdzinājumi starp skaitļiem un skaitliskām virknēm turpina darboties kā iepriekš. Īpaši tas nozīmē, ka `0 == "not-a-number"` tagad tiek uzskatīts par false.

SalīdzinājumsPirmsPēc`0 == "0"`**`true`****`true`**`0 == "0.0"`**`true`****`true`**`0 == "foo"`**`true`****`false`**`0 == ""`**`true`****`false`**`42 == " 42"`**`true`****`true`**`42 == "42foo"`**`true`****`false`**Jauni rezervēti vārdi: match un mixed.

Metodes ar tādu pašu nosaukumu kā klase vairs netiek interpretētas kā konstruktori. Tā vietā jāizmanto [\_\_construct()](https://www.php.net/manual/en/language.oop5.decon.php#object.construct) metode.

Iespēja definēt reģistrnejutīgas konstantes ir izņemta. Trešais arguments [define()](https://www.php.net/manual/en/function.define.php) vairs nedrīkst būt true.

Uzzini vairāk par 7.4 → 8.0 migrāciju [PHP dokumentācijā](https://www.php.net/manual/en/migration80.php)

### PHP 8.0 → PHP 8.3

**PHP 8.0 → PHP 8.1**

Ja metode, kas izmanto statiskos mainīgos, tiek mantota (bet netiek pārrakstīta), mantotā metode tagad koplietos statiskos mainīgos ar vecāka metodi:

```
<?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), previously int(1)
var_dump(B::counter()); // int(4), previously int(2)
?>
```

Uzzini vairāk par 8.0 → 8.1 migrāciju [PHP dokumentācijā](https://www.php.net/manual/en/migration81.php)

**PHP 8.1 → PHP 8.2**

**Pievienots atribūts sensitīvu parametru slēpšanai**

Pievienots `#[\SensitiveParameter]` atribūts, lai paslēptu sensitīvus datus atpakaļizsekojumos (backtrace).

Uzzini vairāk par 8.1 → 8.2 migrāciju [PHP dokumentācijā](https://www.php.net/manual/en/migration82.php)

**PHP 8.2→ PHP 8.3**

php.ini tagad atbalsta rezerves/noklusējuma vērtības sintaksi:

```
<?php
/*
/path/to/user.ini contains the following settings:

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

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

Uzzini vairāk par 8.2 → 8.3 migrāciju [PHP dokumentācijā](https://www.php.net/manual/en/migration83.php)
