Il contesto
Migrando un progetto verso PHP 8.4, diverse cose che funzionavano in locale sono esplose al deploy sul mio VPS Ubuntu.
Bug 1 — Parametri nullable impliciti
PHP 8.4 deprecа i nullable impliciti:
// Deprecated sur PHP 8.4
public function toHtml(string $content = null): string

// Correct
public function toHtml(?string $content = null): string
Rector automatizza la correzione di tutta la codebase:
vendor/bin/rector process src --dry-run
Bug 2 — Datetime e fuso orario
Sul VPS, le date uscivano con un fuso diverso dal locale. La regola che salva: memorizzare in UTC, convertire alla visualizzazione.
# config/packages/doctrine.yaml
doctrine:
    dbal:
        server_version: '8.4'
{{ post.publishedAt|date('d M Y', 'Europe/Paris') }}
Bug 3 — La cache di prod rivela tutto
APP_ENV=dev maschera errori di compilazione del container. Testare sempre in prod prima di fare push:
php bin/console cache:clear --env=prod
php bin/console cache:warmup --env=prod
composer dump-autoload --optimize --no-dev
È stato il warmup di prod a far emergere un servizio non istanziabile che dev tollerava tramite lazy-loading.
Cosa mi porto a casa
  • Testare sempre con APP_ENV=prod prima di fare deploy.
  • Rector è indispensabile per gli aggiornamenti di versione di PHP.
  • Fuso orario: memorizzare in UTC, convertire alla visualizzazione. Sempre.