>  Q&A  >  본문

Symfony4에서 Symfony6으로 업데이트한 후 $_SERVER가 GCP 변수로 채워지지 않는 것 같습니다.

그래서 Symfony4에서 Symfony6으로 업데이트한 후 preprod 서버에 배포를 시도했지만 Kernel.php가 더 이상 $_SERVER 전역 변수에 GCP 변수를 갖고 있지 않은 것 같아서 제대로 작동하지 않았습니다.

이것은 getCacheDir 메소드를 재정의하여 Symfony4와 함께 사용할 캐시 경로를 결정하는 커널 구성입니다.

으아악 가장 먼저 언급해야 할 점은 조건을 제거하면(즉, getCacheDir에서 직접 /tmp 경로를 반환하면) 모든 것이 잘 작동한다는 것입니다(그러나 이는 개발 중인 캐시에 대한 올바른 경로가 아니기 때문에 개발 환경에서는 작동하지 않습니다). 내가 원하는 $server var가 더 이상 채워지지 않는다고 확신합니다(하지만 틀릴 수도 있습니다).

이 동작은 정말 이상합니다. 저희 웹사이트가 다국어를 지원한다는 점을 말씀드리고 싶습니다. 현지화된 URL로 리디렉션하기 전에 기본 URL(example.com)에 도달하면 덤프($server["gae_instance"])를 넣으려고 하는데 여기에 $_server var( I 리디렉션 전에 덤프된 $_SERVER['GAE_INSTANCE'] 값을 확인했습니다)

첫 번째 요청(example.com)에는 $_SERVER GAE_INSTANCE가 있는 것 같지만 일단 리디렉션되면(example.com/fr) 더 이상 존재하지 않습니다(잘못된 캐시 경로를 제공하면 오류가 발생합니다)

GCP에 어떤 변경도 하지 않았기 때문에 이것이 Symfony4와 Symfony6 간의 변경이라고 생각합니다(애플리케이션의 PHP 버전을 제외하고 php7.4에서 php8.1로 전달했지만 Google 문서에서는 변경하지 않았습니다). 일부 콘텐츠에 영향을 미칠 것 같습니다 https://cloud.google.com/appengine/docs/standard/php-gen2/runtime?hl=fr#php-8.1)

우리는 지금 심포니 번역 패키지를 사용하고 있기 때문에 제거한 번역 패키지(jmsi18n)를 가지고 있었다는 점을 언급해야 합니다. (실제로 그것이 문제의 원인이라고 생각하지는 않지만, 뭔가 놓치고 싶었어요 )

####수정####

여기에 몇 가지 테스트 코드와 결과 로그가 있습니다(어느 것이 로깅되고 있는지 확신할 수 없기 때문에 print_r과 syslog를 시도했습니다)

먼저 캐시디렉토리를 무조건 반환해봤는데 차근차근 따라해야 할 로그가 많았고 모든게 괜찮은 것 같았고 예상했던 로그도 모두 전송되었습니다(그리고 웹사이트도 실행중이었습니다)

그런 다음 동일한 코드(일부 추가 로그 포함)를 시도했지만 조건에서 반환되고 조건을 입력하더라도 오류가 추가되고 정말 이상해집니다. 연결될 수 있지만 커널은 하나의 요청으로 여러 번 트리거됩니다( gcp 로그에는 /fr에 대한 두 개의 500개 요청이 표시되지만 매번 예상되는 조건을 모두 통과합니다.)

P粉617597173P粉617597173257일 전395

모든 응답(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/cache 경로를 여전히 반환하는 동안 무조건 캐시Dir을 반환함으로써 좋은 동작을 얻을 수 있었기 때문입니다.) /tmp 대신)

    그래서 여기서의 요점을 정말 이해하지 못했지만 드디어 해결되었습니다!

    최종 코드:

    으아악

    회신하다
    0
  • 취소회신하다