CommunityRecherche & Datenanalysegithub.com

Legacy PHP → PHP 8.3/8.4 Modernisierer

In-Place-Upgrade von Legacy-PHP-5.x/7.x-Codebasen (benutzerdefiniertes CMS, TemplatePower, mysql_*, ereg, Short Tags, PHP4-Konstruktoren) zur Ausführung auf PHP 8.3/8.4, dann Bereitstellung ohne Docker über eine .env-Konfiguration und ein FTP/rsync deploy.sh. Verwenden Sie dies zur Modernisierung von Legacy-PHP-CMS/Websites und verwandten Legacy-Projekten oder wenn eine Legacy-Website auf Shared Hosting (cPanel/Plesk) über FTP umziehen muss.

Was ist 8.4 Modernisierer?

Dieses Skill-Paket automatisiert die Modernisierung von Legacy-PHP-Projekten (geschrieben für PHP 5.x/7.x) auf PHP 8.3/8.4, ohne dass eine vollständige Neuschreibung erforderlich ist. Es ist ideal für benutzerdefinierte CMS-, TemplatePower- und andere ältere Codebasen, die auf gemeinsam genutztem Hosting (cPanel/Plesk) oder direkt über FTP/rsync bereitgestellt werden müssen. Das Skill-Paket enthält eine Reihe von Skripten, die häufige Inkompatibilitäten beheben: einen Shim für veraltete Funktionen (mysql_*, ereg*), Tokenizer-basierte Korrekturen für Bareword-Array-Schlüssel und variable Variablen sowie einen statischen Methodensignatur-Checker. Das Verfahren stellt eine schrittweise, sichere Migration sicher: Erstellen einer Basislinie mit Git, Installieren des Kompatibilitäts-Shims, Ausführen mechanischer Korrekturen, Überprüfen von Methodensignaturen und schrittweises Beheben von Fehlern anhand einer echten Datenbank und Smoke-Tests. Neben der reinen Code-Modernisierung bietet das Skill-Paket Vorlagen für .env-basierte Konfiguration, moderne .htaccess- und user.ini-Dateien für gemeinsam genutztes Hosting, einen sicheren Thumbnail-Generator (ersetzt anfälliges TimThumb) und ein Bereitstellungsskript, das entweder FTP (lftp) oder rsync über SSH verwenden kann. Das gesamte System ist darauf ausgelegt, Lizenzänderungen zu minimieren und die Sicherheit während des gesamten Prozesses zu gewährleisten. Das Skill-Paket eignet sich am besten für Projekte, bei denen ein vollständiges Umschreiben nicht möglich ist und die Bereitstellung über Docker nicht gewünscht oder möglich ist. Es eignet sich sowohl für Entwickler, die einzelne Legacy-Sites migrieren, als auch für Agenturen, die mehrere ähnliche Legacy-CMS-Projekte verwalten.

Funktioniert mit~Claude Code~Codex CLI~Cursor✓OpenCode
npx skills add https://github.com/dbravoan/opencode-skills/tree/HEAD/skills/legacy-php8-modernizer

Installed? Explore more Recherche & Datenanalyse skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht 8.4 Modernisierer?

Wann Sie mich verwenden sollten

Verwenden Sie dieses Skill, wenn ein Legacy-PHP-Projekt (typischerweise ein benutzerdefiniertes CMS, das für PHP 5.x geschrieben wurde) Folgendes erfordert:

  • Ausführung auf PHP 8.3 / 8.4 ohne vollständige Neuschreibung und/oder
  • Bereitstellung auf Shared Hosting (cPanel/Plesk) über FTP, ohne Docker.

Typische Symptome: mysql_*, ereg/eregi, <?-Short-Tags, PHP4-Konstruktoren, Bareword-Array-Schlüssel ($row[Id]), $$var['key'], sizeof(null), MyISAM-Dump, TemplatePower-Vorlagen, Klartext-Zugangsdaten in config/defines*.php.

Was dieses Skill liefert

AssetZweck
scripts/compat.phpShim: mysql_* → mysqli, ereg*/split → preg, userErrorHandler
scripts/fix_barewords.phpTokenizer-sicheres Anführungszeichen für Bareword-Array-Schlüssel
scripts/fix_variable_variables.phpBehebt den Bruch der uniformen Variablensyntax von PHP 8 $$var['key']
scripts/check_signatures.phpStatischer LSP-Methodensignatur-Prüfer
scripts/lint-all.shphp -l-Durchlauf
scripts/smoke-test.shHTTP-Smoke-Test einer URL-Liste
templates/defines.php.env-Lader + DB-Konstanten (funktioniert mit und ohne Docker)
templates/env.example.env-Vorlage (DB_* + FTP_*)
templates/htaccessModerne Apache/PHP-FPM .htaccess
templates/user.iniPHP-FPM-Überschreibungen für Shared Hosting
templates/timthumb.phpSicherer GD-Thumbnail-Generator (ersetzt anfälliges TimThumb)
deploy/deploy.shFTP- oder rsync-Bereitstellung; schließt Entwicklungsdateien aus; schreibt remote .env

Goldene Regeln

  1. Sicherheit zuerst: git init + Basis-Commit vor jeder Änderung. Datenbank sichern.
  2. Entblocken vor Refactoring: Der Shim bringt die gesamte Codebasis sofort zum Laufen.
  3. Eine zentrale DB-Schicht: dbClass zuerst austauschen/einschränken; der Shim deckt rohe mysql_*-Aufrufe ab.
  4. Sicherheit frühzeitig: Gefährliche Tools und TimThumb entfernen, sobald die Seite rendert.
  5. Kontinuierlich überprüfen: php -l nach jedem Batch, dann Smoke-Test jeder URL.

Vorgehensweise

0. Basislinie

git init -q && git add -A && git commit -qm "baseline: legacy PHP"
find . -name '*.php' -not -path './node_modules/*' | wc -l

Speichern Sie eine Liste der echten öffentlichen URLs (aus der DB/Sitemap) für scripts/smoke-test.sh.

1. Kompatibilitäts-Shim installieren

  • Kopieren Sie scripts/compat.php z. B. nach includes/compat.php.
  • Laden Sie es ganz oben im Bootstrap, vor jedem Legacy-Code:
    include_once(__DIR__.'/../includes/compat.php');
    
  • Es stellt mysql_*, ereg/eregi/ereg_replace/eregi_replace/split, mysqli_report(MYSQLI_REPORT_OFF) (SQL-Fehler geben false statt eines Wurfs zurück) und userErrorHandler() (unterdrückt PHP 5s alte E_NOTICE „undefined index/variable“).
  • Registrieren Sie den Handler einmal:
    if (function_exists('userErrorHandler')) set_error_handler('userErrorHandler');
    

2. Mechanische Korrekturen (Skripte)

php scripts/fix_barewords.php            # Trockenlauf
php scripts/fix_barewords.php --apply
php scripts/fix_variable_variables.php   # Trockenlauf
php scripts/fix_variable_variables.php --apply
scripts/lint-all.sh

Dann beheben, was lint noch meldet:

  • Short-Tags: <? → <?php (grep <\(?!php|=|xml)).
  • PHP4-Konstruktoren: function ClassName() → function __construct().
  • Geschweifte-Klammer-String-Offsets: $s{0} → $s[0].
  • Unerlaubtes break außerhalb von Schleifen/Switches (fatal in PHP 8).
  • Variable-Variablen in ${...}: Barewords in Anführungszeichen setzen / ${$var['k']} verwenden.

3. Signaturen, statisch & Null-Sicherheit

php scripts/check_signatures.php

Fügen Sie für jeden MISMATCH Standardparameter zur Kind-Methode hinzu (z. B. $tabla = null). Dann zur Laufzeit beheben, wenn Fatals auftauchen:

FehlerKorrektur
ArgumentCountError: too few argumentsNachfolgende Parameter mit Defaults versehen
$this in statischer Methodeself::/static:: verwenden oder App-Kontext übergeben
method_exists(null, ...)is_object($x) && method_exists($x, ...)
Cannot access offset of type string on stringis_array($x) vor $x['k'] umordnen
Undefined constant "X"Bareword-Schlüssel/Konstanten in Anführungszeichen setzen
sizeof/count/array_keys(null)is_array($x) ? ... : ..., (array)$x
foreach(null)foreach ((array)$x as ...)
Accessing static property X as non static$this->prop → self::$prop

4. Gegen die echte DB ausführen und iterieren

Konfiguration auf die DB verweisen, dann jede URL anfordern. Pro Test einen Fatal beheben, bis scripts/smoke-test.sh null Fehler meldet und das Log keine Warnungen enthält.

5. Sicherheit (frühzeitig durchführen)

  • Ersetzen Sie TimThumb durch templates/timthumb.php.
  • Löschen Sie scanner.php, chmod777.php, info.php, verstreute Debug-Skripte.
  • Lassen Sie .htaccess .env, .git, config/defines.php, Dotfiles verbieten.
  • Rotieren Sie committete DB-Passwörter; verschieben Sie Geheimnisse in .env.
  • Empfehlen Sie CSRF-Tokens, CSP/HSTS, Ratenbegrenzung, Prepared Statements.

6. Konfiguration + Bereitstellung

  • Verwenden Sie templates/defines.php (.env-Lader) und templates/env.example.
  • Verwenden Sie templates/htaccess und templates/user.ini.
  • Mit deploy/deploy.sh bereitstellen.

.env-System

config/defines.php lädt .env aus dem Projektstamm, fällt auf getenv() und schließlich auf sichere Defaults zurück. Dadurch bleibt Docker funktionsfähig (gleiche DB_*-Schlüssel) während die FTP-Bereitstellung zu einer Ein-Datei-Bearbeitung wird.

.env (niemals committen):

DB_HOST=localhost
DB_NAME=cpaneluser_termospa
DB_USER=cpaneluser_termospa
DB_PASS=super-secret
DB_SUBDIRECTORIO=

Bereitstellung (ohne Docker)

Shared Hosting (cPanel/Plesk) Checkliste

  1. PHP: 8.3 (oder 8.1+) auswählen; mysqli, gd, mbstring, pdo_mysql aktivieren.
  2. DB: DB + Benutzer erstellen, den Dump importieren. Für MySQL 8:
    SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';
    
    Erwarten Sie utf8_spanish_ci → utf8mb3_spanish_ci-Warnungen (oder führen Sie die utf8mb4-Migration durch).
  3. Dateien: In public_html/ hochladen (docker/, tools/, router.php, _DOCS/, .git/ ausschließen).
  4. Berechtigungen: Verzeichnisse 755, Dateien 644; recursos/cache/, .cache/, upload/ beschreibbar (775/777).
  5. Konfiguration: Remote .env erstellen (deploy.sh macht das) und DB_* überprüfen.
  6. Zugriff verweigern auf .env in .htaccess.

deploy.sh

./deploy.sh ftp          # lftp reverse mirror
./deploy.sh ftp --dry-run
./deploy.sh rsync        # rsync über SSH

Es liest .env (FTP_HOST/USER/PASS/PATH/TLS, oder SSH_*), staged nur die Laufzeitdateien, schreibt ein nur-remote .env, das nur DB_* enthält (damit FTP-Zugangsdaten nie auf dem Server landen), lädt hoch und gibt die Schritte für Berechtigungen/DB aus.


Verifikations-Checkliste

  • scripts/lint-all.sh → alles sauber
  • scripts/smoke-test.sh urls.txt → 0 Fehler
  • Startseite / Produkt / Projekt / News / Kontaktseiten rendern
  • /sitemap.xml und /rss geben gültiges XML zurück
  • /imagenes/thumbnail/... gibt ein Bild zurück (GD + Rewrite)
  • /administracion/login/ lädt; Login + ein Content-Manager funktioniert
  • Kontaktformular sendet ab
  • Admin-Bild-Upload schreibt in upload/
  • Keine PHP Warning/Fatal im Fehlerlog

Fallstricke, die immer beißen

  • mysqli_query wirft standardmäßig seit PHP 8.1+; rufen Sie mysqli_report(MYSQLI_REPORT_OFF) auf, damit Legacy or die() / if($q=...) weiter funktioniert.
  • php_flag / php_value in .htaccess verursachen HTTP 500 unter PHP-FPM – verwenden Sie .user.ini.
  • PHP 8s uniforme Variablensyntax bricht $$var['key'] stillschweigend (schreibt die falsche Variable) – führen Sie fix_variable_variables.php aus.
  • include()-relative Pfade werden relativ zum Skriptverzeichnis/CWD aufgelöst; bevorzugen Sie __DIR__.
  • Nicht mehr in PHP 8: mysql_*, ereg*, split, create_function, each, Magic Quotes.
  • OPcache zwischenspeichert alte Dateien: starten Sie FPM/Apache nach Bearbeitungen neu.
  • UTF-8: SET NAMES utf8mb4; bevorzugen Sie InnoDB + utf8mb4_unicode_ci für neue Arbeiten.

Schwesterprojekte

Diese CMS-Projekte teilen dieselbe Architektur. Führen Sie dasselbe Verfahren durch, passen Sie nur den Bootstrap-Pfad und das Thumbnail-Rewrite-Ziel an. Kopieren Sie scripts/ in das tools/ des Ziels und führen Sie vom Projektstamm aus.

Verwandte Skills