Preskočiť na obsah
PHP Údržba 15. september 2026 · 14 min čítania

Migrácia starého PHP projektu bez výpadku

Aplikácia beží na PHP 5.6, hosting oznámil koniec podpory a pôvodný autor je nedostupný. Táto situácia je oveľa bežnejšia, než sa zdá — a dá sa vyriešiť bez prepisovania celej aplikácie od nuly. Tento článok popisuje postup migrácie starého PHP projektu na verziu 8.4: čo zistiť pred začiatkom, ktoré zmeny bolia najviac a ako to nasadiť po častiach.

DC

Dušan Chlpek

PHP vývojár, GEAR s.r.o. · 25+ rokov praxe

Prepísať, alebo migrovať?

Prvá otázka nie je technická. Prepis od nuly znie lákavo — nový kód, moderný framework, žiadne dedičstvo. V praxi je to najrizikovejšia možnosť. Stará aplikácia obsahuje roky nahromadených výnimiek, opráv a špeciálnych prípadov, ktoré nie sú nikde zdokumentované. Pri prepise sa strácajú a objavia sa až v produkcii, jedna po druhej.

Migrácia je naopak postupná a merateľná. Po každom kroku máte fungujúcu aplikáciu a viete sa vrátiť späť. Prepis odporúčam len vtedy, keď je splnená aspoň jedna z týchto podmienok:

Vo všetkých ostatných prípadoch je migrácia rýchlejšia, lacnejšia a bezpečnejšia.

Krok 1: zistite, s čím pracujete

Pred prvou zmenou kódu potrebujete obraz o rozsahu. Bez neho neviete odhadnúť čas ani riziko.

Automatická kontrola kompatibility

Nástroj PHPCompatibility prejde kód a vypíše konštrukcie, ktoré v cieľovej verzii nefungujú:

composer require --dev phpcompatibility/php-compatibility squizlabs/php_codesniffer

./vendor/bin/phpcs -p . \
  --standard=PHPCompatibility \
  --runtime-set testVersion 8.4 \
  --extensions=php \
  --ignore=vendor/,storage/ \
  --report=summary

Výstup je zoznam súborov s počtom chýb. Nepanikárte z vysokých čísel — veľká časť bývajú opakovania tej istej veci, ktoré opraví jeden nástroj hromadne.

Inventúra rozšírení a závislostí

# ktoré rozšírenia kód používa
grep -rhoE "\b(mysql_|ereg|mcrypt_|each\()" --include="*.php" . | sort | uniq -c

# aké externé knižnice sú v projekte
ls vendor/ 2>/dev/null || find . -name "*.php" -path "*lib*" -maxdepth 3

Staré projekty často nemajú Composer vôbec — knižnice sú skopírované do adresára a upravené. Každá takáto knižnica je samostatná položka v pláne: buď má modernú verziu na Packagiste, alebo ju treba nahradiť.

Zmapujte vstupné body

Pri aplikáciách bez smerovača je vstupným bodom každý PHP súbor dostupný cez web. Ich zoznam je zároveň zoznamom toho, čo treba otestovať.

Výsledkom auditu má byť dokument s počtom nekompatibilít podľa typu, zoznamom knižníc s náhradami, zoznamom vstupných bodov a odhadom času. Toto je podklad pre rozhodnutie, nie len technická poznámka.

Krok 2: záchranná sieť pred zmenami

Starý projekt spravidla nemá testy. Písať kompletné pokrytie pred migráciou je neúmerné — ale úplne bez siete sa migrovať nedá. Rozumný kompromis je zachytiť správanie zvonku.

Vyberte dvadsať najdôležitejších URL, zavolajte ich na súčasnej verzii a výstup si uložte. Po migrácii porovnáte:

#!/bin/bash
# zachyt-vystupy.sh — pred migráciou
while read -r cesta; do
  nazov=$(echo "$cesta" | tr '/?=&' '_')
  curl -s "https://stara-verzia.sk${cesta}" > "vystupy/${nazov}.html"
done < zoznam-url.txt

Po migrácii rovnaký skript spustíte proti novej verzii a porovnáte cez diff. Rozdiely v dynamických častiach (čas, tokeny) odfiltrujete, zvyšok sú kandidáti na chybu. Táto jednoduchá metóda zachytí prekvapivo veľkú časť regresií.

Na kritické biznis toky — objednávka, platba, prihlásenie — napíšte skutočné testy. Investícia niekoľkých dní sa vráti pri prvom nasadení.

Krok 3: migrujte po verziách, nie skokom

Najčastejšia chyba je zmeniť PHP z 5.6 rovno na 8.4 a riešiť lavínu chýb naraz. Postupujte po major verziách: 5.6 → 7.0 → 7.4 → 8.0 → 8.4. Po každom kroku aplikácia beží a viete, ktorá zmena čo spôsobila.

Najbolestivejší skok: 5.6 na 7.0

<?php
// pôvodne
$vysledok = mysql_query("SELECT * FROM pouzivatelia WHERE email = '$email'");
$riadok = mysql_fetch_assoc($vysledok);

// po migrácii
$prikaz = $pdo->prepare('SELECT * FROM pouzivatelia WHERE email = :email');
$prikaz->execute(['email' => $email]);
$riadok = $prikaz->fetch(PDO::FETCH_ASSOC);

Skok 7.4 na 8.0

Zmena porovnávania je najzradnejšia časť celej migrácie. Aplikácia nespadne — len začne inak vyhodnocovať podmienky. Prejavuje sa ako „niekedy sa nezobrazí zľava" alebo „občas sa neodošle e-mail". Práve na toto slúži porovnávanie výstupov pred a po.

Rector na hromadné úpravy

Veľkú časť mechanických zmien zvládne Rector automaticky. Nastavte cieľovú verziu a púšťajte ho po dávkach:

<?php
// rector.php
use Rector\Config\RectorConfig;

return RectorConfig::configure()
    ->withPaths([__DIR__ . '/app', __DIR__ . '/src'])
    ->withPhpSets(php74: true)   // v ďalšom kroku php80, php84
    ->withPreparedSets(deadCode: true);
./vendor/bin/rector process --dry-run   # najprv náhľad
./vendor/bin/rector process

Rector neopraví všetko a občas sa mýli. Každú dávku commitnite samostatne a prejdite zmeny okom, hlavne pri kóde, ktorý pracuje s typmi.

Krok 4: prostredie a knižnice

Zmena verzie PHP je len časť práce. Spolu s ňou zvyčajne treba riešiť aj okolie:

Krok 5: nasadenie po častiach

Migrovanú verziu nenasadzujte naraz pre všetkých. Osvedčený postup má tri fázy:

  1. Paralelná prevádzka — nová verzia beží na inej doméne alebo porte s kópiou databázy. Vy a klient ju používate niekoľko dní.
  2. Obmedzené spustenie — časť prevádzky (interní používatelia, malé percento návštevníkov) ide na novú verziu, zvyšok na starú. Porovnávate chybovosť a časy odpovedí.
  3. Prepnutie — celá prevádzka na novú verziu, pričom stará zostáva pripravená na okamžitý návrat aspoň týždeň.

Nasadzujte v čase najnižšej prevádzky — pri slovenskom e-shope býva najpokojnejšie utorkové ráno, nie piatok popoludní. A nikdy nie deň pred dovolenkou.

Po prepnutí je kľúčový dohľad. Prvé dni sledujte chyby, časy odpovedí a fronty podstatne pozornejšie než bežne — postup popisujem v článku o monitoringu PHP aplikácie.

Čo získate okrem podpory

Migrácia sa často obhajuje len tým, že stará verzia už nedostáva bezpečnostné záplaty. To je dobrý dôvod, ale nie jediný:

Zhrnutie: postup migrácie

Beží vaša aplikácia na nepodporovanom PHP?

Migrujem staré PHP projekty na aktuálne verzie — aj tie, ku ktorým nie je dokumentácia ani pôvodný autor. Začíname auditom, po ktorom dostanete rozsah, cenu a zoznam rizík písomne.

Ďalšie články

Zavolať E-mail Dopyt

Ochrana súkromia

Táto stránka využíva cookies pre nevyhnutné fungovanie. Rešpektujeme vaše súkromie a legislatívu GDPR.