Nach dem Update von Symfony4 auf Symfony6 scheint $_SERVER nicht mit GCP-Variablen gefüllt zu sein
P粉617597173
P粉617597173 2024-01-10 17:25:14
0
1
396

Nach dem Update von Symfony4 auf Symfony6 habe ich versucht, auf dem Preprod-Server bereitzustellen, aber es hat nicht gut funktioniert, da unsere Kernel.php anscheinend keine GCP-Variablen mehr in der globalen Variablen $_SERVER hat.

Dies ist unsere Kernel-Konfiguration, in der wir die getCacheDir-Methode überschreiben, um den Cache-Pfad zu bestimmen, der mit Symfony4 verwendet werden soll.

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']);
}
Als Erstes muss ich erwähnen, dass alles einwandfrei funktioniert, wenn ich meine Bedingung entferne (d. h. den /tmp-Pfad direkt in getCacheDir zurückgebe) (dies funktioniert jedoch nicht in einer Entwicklungsumgebung, da es nicht der richtige Pfad für den Cache in der Entwicklung ist), also ich Ich bin mir ziemlich sicher (aber ich könnte mich irren), dass die von mir gewünschte $server-Variable nicht mehr gefüllt ist.

Dieses Verhalten ist also wirklich seltsam. Ich muss erwähnen, dass unsere Website mehrsprachig ist. Wenn ich zur Basis-URL (example.com) komme, bevor ich zur lokalisierten URL umleite, versuche ich, einen Dump ($server["gae_instance"]) zu erstellen, und hier kann ich sehen, dass wir die Variable $_server (I) haben sah den Wert von $_SERVER['GAE_INSTANCE'], der vor der Umleitung ausgegeben wurde)

Wissen Sie also, es scheint, dass wir $_SERVER GAE_INSTANCE bei der ersten Anfrage (example.com) haben, aber nach der Umleitung (zu example.com/fr) existiert es nicht mehr (wenn ich den falschen Cache-Pfad angebe, erhalte ich eine Fehlermeldung)

Ich denke, das ist eine Änderung zwischen Symfony4 und Symfony6, da wir keine Änderungen an GCP vorgenommen haben (außer der PHP-Version der Anwendung, aber wir sind von PHP7.4 auf PHP8.1 umgestiegen, und in den Google-Dokumenten ist das nicht der Fall Scheint Auswirkungen auf einige Inhalte zu haben (https://cloud.google.com/appengine/docs/standard/php-gen2/runtime?hl=fr#php-8.1)

Ich muss erwähnen, dass wir früher ein Übersetzungspaket (jmsi18n) hatten, das ich entfernt habe, weil wir jetzt das Symfony-Übersetzungspaket verwenden (ich glaube nicht wirklich, dass das die Ursache des Problems war, aber ich glaube nicht, dass ich wollte etwas verpassen. )

####bearbeiten####

Hier ist ein Testcode und die resultierenden Protokolle (ich habe print_r und syslog ausprobiert, da ich nicht sicher bin, welches Protokoll protokolliert)

Zuerst habe ich versucht, das Cache-Verzeichnis bedingungslos zurückzugeben, und es gab viele Protokolle, denen ich Schritt für Schritt folgen musste. Alles schien in Ordnung zu sein, alle erwarteten Protokolle wurden gesendet (und die Website lief)

Dann habe ich den gleichen Code ausprobiert (mit einigen zusätzlichen Protokollen), aber in der Bedingung, die er zurückgibt, und selbst wenn wir die Bedingung eingeben, wird der Fehler angehängt und es wird wirklich seltsam, es könnte verkettet sein, aber der Kernel fordert mehrere Auslöser an (und Die GCP-Protokolle zeigen zwei 500-Anfragen auf /fr, aber wir erfüllen jedes Mal alle erwarteten Bedingungen)

P粉617597173
P粉617597173

Antworte allen(1)
P粉217784586

所以我终于弄清楚了问题是什么,在 JensV 的帮助下,我仍然不明白一切,它可能与缓存预热有关,但我不是 100% 确定。

深入研究我的代码,寻找错误的原因,我最终调查了 Symfony 内核 (vendor/symfony/http-kernel/Kernel.php),并在 getKernelParameters 方法的返回中找到了这一行,我不太明白为什么它会干扰,甚至不确定它是否相关

事实上,我们重写了 getCacheDir 和 getBuildDir,本质上,getBuildDir 返回 getCacheDir() 方法,但我们重写了 getBuildDir 方法,以定位不同的路径 (/workspace/var/cache) 和过去的路径工作。

所以我的直觉是 getCacheDir 和 getBuildDir 应该表现相同(因为这是本机行为)

所以我恢复了 getBuildDir 返回 $this->getCacheDir() (我认为我可以简单地删除该方法,因为我们不再覆盖任何内容)

现在一切正常(我什至恢复了初始 isset($_server['gae_instance']) 条件以及我们为其他库所做的一些其他解决方法)

我仍然非常确定它是被调用的 getCacheDir (因为我们从未接触过 getBuildDir() 方法,并且我们能够通过简单地无条件返回 cacheDir 来获得良好的行为,而 getBuildDir 仍在返回工作区/var/cache 的路径而不是/tmp)

所以我真的不明白这里的意思,但它终于解决了!

最终代码:

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"]);
}
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!