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
| Asset | Zweck |
|---|---|
scripts/compat.php | Shim: mysql_* → mysqli, ereg*/split → preg, userErrorHandler |
scripts/fix_barewords.php | Tokenizer-sicheres Anführungszeichen für Bareword-Array-Schlüssel |
scripts/fix_variable_variables.php | Behebt den Bruch der uniformen Variablensyntax von PHP 8 $$var['key'] |
scripts/check_signatures.php | Statischer LSP-Methodensignatur-Prüfer |
scripts/lint-all.sh | php -l-Durchlauf |
scripts/smoke-test.sh | HTTP-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/htaccess | Moderne Apache/PHP-FPM .htaccess |
templates/user.ini | PHP-FPM-Überschreibungen für Shared Hosting |
templates/timthumb.php | Sicherer GD-Thumbnail-Generator (ersetzt anfälliges TimThumb) |
deploy/deploy.sh | FTP- oder rsync-Bereitstellung; schließt Entwicklungsdateien aus; schreibt remote .env |
Goldene Regeln
- Sicherheit zuerst:
git init+ Basis-Commit vor jeder Änderung. Datenbank sichern. - Entblocken vor Refactoring: Der Shim bringt die gesamte Codebasis sofort zum Laufen.
- Eine zentrale DB-Schicht:
dbClasszuerst austauschen/einschränken; der Shim deckt rohemysql_*-Aufrufe ab. - Sicherheit frühzeitig: Gefährliche Tools und TimThumb entfernen, sobald die Seite rendert.
- Kontinuierlich überprüfen:
php -lnach 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.phpz. B. nachincludes/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 gebenfalsestatt eines Wurfs zurück) unduserErrorHandler()(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
breakauß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:
| Fehler | Korrektur |
|---|---|
ArgumentCountError: too few arguments | Nachfolgende Parameter mit Defaults versehen |
$this in statischer Methode | self::/static:: verwenden oder App-Kontext übergeben |
method_exists(null, ...) | is_object($x) && method_exists($x, ...) |
Cannot access offset of type string on string | is_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) undtemplates/env.example. - Verwenden Sie
templates/htaccessundtemplates/user.ini. - Mit
deploy/deploy.shbereitstellen.
.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
- PHP: 8.3 (oder 8.1+) auswählen;
mysqli,gd,mbstring,pdo_mysqlaktivieren. - DB: DB + Benutzer erstellen, den Dump importieren. Für MySQL 8:
Erwarten SieSET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';utf8_spanish_ci→utf8mb3_spanish_ci-Warnungen (oder führen Sie die utf8mb4-Migration durch). - Dateien: In
public_html/hochladen (docker/,tools/,router.php,_DOCS/,.git/ausschließen). - Berechtigungen: Verzeichnisse
755, Dateien644;recursos/cache/,.cache/,upload/beschreibbar (775/777). - Konfiguration: Remote
.enverstellen (deploy.sh macht das) undDB_*überprüfen. - Zugriff verweigern auf
.envin.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.xmlund/rssgeben 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/Fatalim Fehlerlog
Fallstricke, die immer beißen
mysqli_querywirft standardmäßig seit PHP 8.1+; rufen Siemysqli_report(MYSQLI_REPORT_OFF)auf, damit Legacyor die()/if($q=...)weiter funktioniert.php_flag/php_valuein.htaccessverursachen HTTP 500 unter PHP-FPM – verwenden Sie.user.ini.- PHP 8s uniforme Variablensyntax bricht
$$var['key']stillschweigend (schreibt die falsche Variable) – führen Siefix_variable_variables.phpaus. 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_cifü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.