ホームページ  >  に質問  >  本文

symfony4 から symfony6 に更新した後、$_SERVER に GCP 変数が入力されないようです

そこで、symfony4 から symfony6 に更新した後、preprod サーバーにデプロイしようとしましたが、Kernel.php の $_SERVER グローバル変数に GCP 変数がなくなったようなので、うまく機能しませんでした。

これは、symfony4 で使用するキャッシュ パスを決定するために getCacheDir メソッドをオーバーライドするカーネル設定です。

リーリー まず最初に述べておきたいのは、条件を削除すると(つまり、getCacheDir で /tmp パスを直接返すと)すべてが正常に動作するということです(ただし、これは開発環境では動作しません。開発中のキャッシュの正しいパスではないためです)。私が必要とする $server 変数はもう設定されていないと確信しています (ただし、間違っている可能性もあります)。

したがって、この動作は非常に奇妙です。私たちの Web サイトは多言語であることを言及しなければなりません。ローカライズされた URL にリダイレクトする前にベース URL (example.com) に到達したら、ダンプ ($server["gae_instance"]) を書き込もうとします。ここで、$_server 変数があることがわかります (リダイレクトの前にダンプされた $_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 を試しました)

まず、キャッシュ ディレクトリを無条件で返してみました。段階的に追跡するログが多数ありました。すべてが正常に動作しているようで、予期したすべてのログが送信されました (Web サイトは実行されていました)

その後、同じコードを(いくつかの追加ログを使用して)試しましたが、返される条件では、条件を入力してもエラーが追加され、非常に奇妙になります。リンクされている可能性がありますが、カーネルはリクエストが起動します。複数回 (gcp ログには /fr 上の 2 つの 500 リクエストが表示されますが、毎回予期される条件をすべて渡します)

P粉617597173P粉617597173257日前394

全員に返信(1)返信します

  • P粉217784586

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

    そこで、JensV の助けを借りて、ようやく問題が何であるかを理解しました。まだすべてを理解しているわけではありません。キャッシュのウォーミングに関連している可能性がありますが、100% 確信はありません。

    エラーの原因を見つけるためにコードを深く掘り下げた結果、Symfony カーネル (vendor/symfony/http-kernel/Kernel.php) を調査し、getKernelParameters メソッドの戻り値でこの行を見つけました。なぜ干渉するのかよくわかりませんでした。関連性があるかどうかもわかりません

    実際には、getCacheDir と getBuildDir をオーバーライドしました。本質的に、getBuildDir は getCacheDir() メソッドを返しますが、別のパス (/workspace/var/cache) を見つけるために getBuildDir メソッドをオーバーライドし、過去のパスが機能しました。

    したがって、私の直感では、getCacheDir と getBuildDir は同じように動作するはずです (これはネイティブの動作であるため)

    そこで、 $this->getCacheDir() を返す getBuildDir を復元しました (何もオーバーライドしなくなったので、単純にそのメソッドを削除できると思いました)

    現在はすべて正常に動作しています (他のライブラリに対して行ったいくつかの回避策とともに、初期の isset($_server['gae_instance']) 条件も復元しました)

    getCacheDir が呼び出されていたことは今でもかなり確信しています (getBuildDir() メソッドに触れたことがなく、getBuildDir が引き続きワークスペース /var/ キャッシュ パスを返している間、単純に無条件に cacheDir を返すだけで良好な動作を得ることができたので) /tmp の代わりに)

    つまり、ここの意味はよくわかりませんが、最終的にはうまくいきました。

    最終コード:

    リーリー

    返事
    0
  • キャンセル返事