Selepas mengemas kini daripada symfony4 kepada symfony6, $_SERVER nampaknya tidak diisi oleh pembolehubah GCP
P粉617597173
P粉617597173 2024-01-10 17:25:14
0
1
445

Jadi selepas mengemas kini daripada symfony4 kepada symfony6, saya cuba menggunakan pelayan preprod tetapi ia tidak berfungsi dengan baik kerana Kernel.php kami nampaknya tidak lagi mempunyai pembolehubah GCP dalam pembolehubah global $_SERVER.

Ini ialah konfigurasi kernel kami di mana kami mengatasi kaedah getCacheDir untuk menentukan laluan cache untuk digunakan dengan 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']);
}
Perkara pertama yang perlu disebutkan ialah jika saya mengalih keluar keadaan saya (iaitu mengembalikan laluan /tmp terus dalam getCacheDir) semuanya berfungsi dengan baik (tetapi ini tidak berfungsi dalam persekitaran pembangunan kerana ia bukan laluan yang betul untuk cache dalam pembangunan ) jadi saya Saya cukup pasti (tetapi saya mungkin silap) bahawa $server var yang saya mahukan tidak lagi diisi.

Jadi perangai ni memang pelik, kena sebut laman web kita ni multi-lingual. Apabila saya sampai ke url asas (example.com) sebelum mengubah hala ke url setempat, saya cuba meletakkan dump ($server["gae_instance"]) dan di sini, saya dapat melihat bahawa kita mempunyai $_server var ( I melihat nilai $_SERVER['GAE_INSTANCE'] dibuang sebelum ubah hala)

Jadi, ketahuilah, nampaknya kita mempunyai $_SERVER GAE_INSTANCE pada permintaan pertama (example.com) tetapi setelah diubah hala (ke example.com/fr) ia tidak lagi wujud (memberi laluan cache yang salah, saya mendapat Ralat)

Saya rasa ini adalah perubahan antara symfony4 dan symfony6 kerana kami tidak membuat sebarang perubahan pada gcp (kecuali versi php aplikasi tetapi kami meneruskan daripada php7.4 kepada php8.1 dan dalam dokumen google ia tidak nampak Akan menjejaskan beberapa kandungan https://cloud.google.com/appengine/docs/standard/php-gen2/runtime?hl=fr#php-8.1)

Saya mesti nyatakan bahawa kami pernah mempunyai pakej terjemahan (jmsi18n) yang saya keluarkan kerana kami kini menggunakan pakej terjemahan symfony, (Saya tidak fikir itu adalah punca masalah, tetapi saya rasa saya tidak mahu merindui sesuatu)

####edit####

Berikut adalah beberapa kod ujian dan log yang terhasil (saya cuba print_r dan syslog kerana saya tidak pasti yang mana satu log)

Mula-mula saya cuba mengembalikan direktori cache tanpa syarat dan terdapat banyak log untuk mengikuti langkah demi langkah, semuanya kelihatan baik-baik saja, semua log yang dijangka telah dihantar (dan laman web sedang berjalan)

Kemudian saya mencuba kod yang sama (dengan beberapa log tambahan) tetapi dalam keadaan ia kembali dan walaupun kita memasukkan keadaan ralat itu dilampirkan dan ia menjadi sangat pelik, ia mungkin dirantai tetapi kernel adalah satu permintaan beberapa pencetus (dan log gcp menunjukkan dua 500 permintaan pada /fr, tetapi kami melepasi semua syarat yang dijangkakan setiap kali)

P粉617597173
P粉617597173

membalas semua(1)
P粉217784586

Jadi akhirnya saya dapat tahu apa masalahnya, dengan bantuan JensV, saya masih tidak faham semuanya, mungkin berkaitan dengan pemanasan cache, tetapi saya tidak pasti 100%.

Menggali lebih dalam ke dalam kod saya untuk mencari punca ralat, saya akhirnya menyiasat kernel Symfony (vendor/symfony/http-kernel/Kernel.php) dan menemui baris ini dalam pemulangan kaedah getKernelParameters, saya tidak cukup faham mengapa ia Akan mengganggu, malah tidak pasti sama ada ia berkaitan

Malah, kami mengatasi getCacheDir dan getBuildDir, pada asasnya, getBuildDir mengembalikan kaedah getCacheDir(), tetapi kami mengatasi kaedah getBuildDir untuk menyasarkan laluan berbeza (/workspace/var/cache) dan laluan lalu berfungsi.

Jadi perasaan saya ialah getCacheDir dan getBuildDir harus berkelakuan sama (kerana ini adalah tingkah laku asli)

Jadi saya memulihkan getBuildDir mengembalikan $this->getCacheDir() (saya fikir saya boleh mengalih keluar kaedah itu kerana kami tidak lagi mengatasi apa-apa)

Semuanya berfungsi dengan baik sekarang (saya malah memulihkan keadaan isset($_server['gae_instance']) dan beberapa penyelesaian lain yang kami lakukan untuk perpustakaan lain)

Saya masih agak pasti ia adalah getCacheDir yang dipanggil (kerana kami tidak pernah menyentuh kaedah getBuildDir() dan kami dapat memperoleh tingkah laku yang baik dengan hanya mengembalikan cacheDir tanpa syarat, manakala getBuildDir masih mengembalikan laluan /var/cache ruang kerja bukannya /tmp)

Jadi saya benar-benar tidak faham maksud di sini, tetapi ia akhirnya diselesaikan!

Kod akhir:

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"]);
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!