因此,從 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 請求,但我們每次都會傳遞所有預期條件)###
所以我終於弄清楚了問題是什麼,在 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)
所以我真的不明白這裡的意思,但它終於解決了!
最終程式碼: