Après la mise à jour de symfony4 vers symfony6, $_SERVER ne semble pas être renseigné par des variables GCP
P粉617597173
P粉617597173 2024-01-10 17:25:14
0
1
467

Ainsi, après la mise à jour de symfony4 vers symfony6, j'ai essayé de déployer sur le serveur de préprod mais cela n'a pas bien fonctionné car notre Kernel.php ne semble plus avoir de variables GCP dans la variable globale $_SERVER.

Il s'agit de la configuration de notre noyau où nous remplaçons la méthode getCacheDir pour déterminer le chemin du cache à utiliser avec symfony4.

public function getCacheDir(): string
{

    if ($this->onAppEngine()) 
    return "/tmp/" . $this->environment . '/cache';

    return $this->getProjectDir() . '/var/cache/' . $this->environment;
}

private function onAppEngine(): bool
{
    return isset($_SERVER['GAE_INSTANCE']);
}
La première chose à mentionner est que si je supprime ma condition (c'est-à-dire renvoyer le chemin /tmp directement dans getCacheDir), tout fonctionne bien (mais cela ne fonctionne pas dans un environnement de développement car ce n'est pas le bon chemin pour le cache en développement), donc je Je suis presque sûr (mais je peux me tromper) que la variable $server que je veux n'est plus renseignée.

Donc ce comportement est vraiment bizarre, je dois mentionner que notre site Web est multilingue. Lorsque j'arrive à l'URL de base (exemple.com) avant de rediriger vers l'URL localisée, j'essaie de mettre un dump ($server["gae_instance"]) et ici, je peux voir que nous avons la variable $_server (je vu la valeur de $_SERVER['GAE_INSTANCE'] vidée avant la redirection)

Alors sachez, il semble que nous ayons $_SERVER GAE_INSTANCE sur la première requête (example.com) mais une fois redirigé (vers example.com/fr) il n'existe plus (en donnant le mauvais chemin de cache, j'obtiens une erreur)

Je pense que c'est un changement entre symfony4 et symfony6 car nous n'avons apporté aucune modification à gcp (sauf la version php de l'application mais nous sommes passés de php7.4 à php8.1 et dans la documentation google ce n'est pas le cas semble affecter certains contenus https://cloud.google.com/appengine/docs/standard/php-gen2/runtime?hl=fr#php-8.1)

Je dois mentionner que nous avions un package de traduction (jmsi18n) que j'ai supprimé puisque nous utilisons maintenant le package de traduction symfony (je ne pense pas vraiment que ce soit la source du problème, mais je ne pense pas avoir je voulais rater quelque chose)

####modifier####

Voici un code de test et les journaux résultants (j'ai essayé print_r et syslog car je ne sais pas lequel enregistre)

J'ai d'abord essayé de renvoyer le répertoire cache sans condition et il y avait de nombreux journaux à suivre étape par étape, tout semblait bien se passer, tous les journaux attendus ont été envoyés (et le site Web fonctionnait)

Ensuite, j'ai essayé le même code (avec quelques journaux supplémentaires) mais dans la condition il revient et même si nous entrons dans la condition, l'erreur est ajoutée et cela devient vraiment bizarre, il peut être enchaîné mais le noyau demande plusieurs déclencheurs (et les logs gcp affichent deux 500 requêtes sur /fr, mais on passe toutes les conditions attendues à chaque fois)

P粉617597173
P粉617597173

répondre à tous(1)
P粉217784586

J'ai donc enfin compris quel était le problème, avec l'aide de JensV, je ne comprends toujours pas tout, cela peut être lié au réchauffement du cache, mais je ne suis pas sûr à 100%.

En creusant plus profondément dans mon code pour trouver la cause de l'erreur, j'ai fini par enquêter sur le noyau Symfony (vendor/symfony/http-kernel/Kernel.php) et j'ai trouvé cette ligne dans le retour de la méthode getKernelParameters, je ne le fais pas je comprends très bien pourquoi cela interférerait, je ne sais même pas si c'est pertinent

En fait, nous avons remplacé getCacheDir et getBuildDir, essentiellement, getBuildDir renvoie la méthode getCacheDir(), mais nous avons remplacé la méthode getBuildDir pour cibler un chemin différent (/workspace/var/cache) et le chemin précédent a fonctionné.

Donc, mon intuition est que getCacheDir et getBuildDir devraient se comporter de la même manière (puisqu'il s'agit d'un comportement natif)

J'ai donc restauré getBuildDir en renvoyant $this->getCacheDir() (je pensais pouvoir simplement supprimer cette méthode puisque nous ne remplaçons plus rien)

Tout fonctionne bien maintenant (j'ai même restauré la condition initiale d'isset($_server['gae_instance']) et quelques autres solutions de contournement que nous avons appliquées à d'autres bibliothèques)

Je suis toujours presque sûr que c'est getCacheDir qui a été appelé (puisque nous n'avons jamais touché à la méthode getBuildDir(), et nous avons pu obtenir un bon comportement en renvoyant simplement cacheDir sans condition, tandis que getBuildDir renvoyait toujours le chemin /var/cache de l'espace de travail au lieu de /tmp)

Donc je ne comprends vraiment pas l’intérêt ici, mais c’est enfin résolu !

Code final :

public function getCacheDir(): string
{
    if ($this->onAppEngine()) {
        return "/tmp/" . $this->environment . '/cache';
    }

    return $this->getProjectDir() . '/var/cache/' . $this->environment;
}

public function getBuildDir(): string
{
    return $this->getCacheDir();
}

private function onAppEngine(): bool
{
    return isset($_SERVER["GAE_INSTANCE"]);
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal