首页  >  问答  >  正文

从 symfony4 更新到 symfony6 后,$_SERVER 似乎没有由 GCP 变量填充

因此,从 symfony4 更新到 symfony6 后,我尝试在 preprod 服务器上部署,但效果不佳,因为我们的 Kernel.php 在 $_SERVER 全局变量中似乎不再有 GCP 变量。

这是我们的内核配置,我们在其中重写 getCacheDir 方法,以确定与 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']);
}
首先要提到的是,如果我删除我的条件(即直接在 getCacheDir 中返回 /tmp 路径),一切都会正常工作(但这在开发环境中不起作用,因为它不是缓存的正确路径在开发中)所以我很确定(但我可能是错的)我想要的 $server var 不再被填充。

所以这种行为真的很奇怪,我不得不提的是我们的网站是多语言的。当我在重定向到本地化 url 之前到达基本 url (example.com) 时,我尝试放置一个转储($server["gae_instance"]),在这里,我可以看到我们确实有 $_server var (我在重定向之前看到了转储的 $_SERVER['GAE_INSTANCE'] 的值)

所以知道,似乎我们在第一个请求(example.com)上确实有 $_SERVER GAE_INSTANCE 但一旦重定向(到 example.com/fr)它就不再存在(给出了错误的缓存路径,我得到错误)

我确实认为这是 symfony4 和 symfony6 之间的变化,因为我们没有对 gcp 进行任何更改(除了应用程序的 php 版本,但我们从 php7.4 传递到 php8.1 并且在 google 文档中,它似乎不会影响某些内容 https://cloud.google.com/appengine/docs/standard/php-gen2/runtime?hl=fr#php-8.1)

我必须提到,我们曾经有一个翻译包(jmsi18n),我删除了,因为我们现在使用 symfony 翻译包,(我真的不认为这是问题的根源,但我不认为想要错过一些东西。)

#编辑

#这里有一些测试代码和生成的日志(我尝试过 print_r 和 syslog 因为我不确定哪个正在记录)

首先,我尝试无条件返回缓存目录,并且有许多日志要逐步遵循,一切似乎都正常,所有预期的日志都已发送(并且网站正在运行)

###然后我尝试了相同的代码(带有一些附加日志),但在条件中返回,即使我们输入条件,错误也会附加,它变得非常奇怪,它可能是链接的,但内核是一个请求多次触发(并且 gcp 日志显示 /fr 上有两个 500 请求,但我们每次都会传递所有预期条件)###
P粉617597173P粉617597173306 天前444

全部回复(1)我来回复

  • P粉217784586

    P粉2177845862024-01-11 10:45:19

    所以我终于弄清楚了问题是什么,在 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"]);
    }

    回复
    0
  • 取消回复