Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony]ContextListener - przekroczenie limitu pamięci
phpion
post 23.03.2022, 12:34:39
Post #1





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Witam,
mam problem z Symfony 4.4 + PHP 7.4 i zużyciem pamięci. Jest formularz z kilkoma polami i w momencie jego wysłania serwer wyrzuca błąd 502 lub symfoniową stronę błędu (różnie). Błąd tyczy przekroczenia pamięci w klasie ContextListener.

W kodzie kontrolera obslugującego formularz jest:
  1. $this->addFlash('success', 'Wysłano komunikat');
  2. return $this->redirectToRoute('prpo_msg_list');

i z tego co zdiagnozowałem to wiadomość flash prawidłowo się zapisuje (więc wcześniejszy kod wykonuje się prawidłowo), dopiero potem rzucany jest błąd. Jeśli w tym momencie wywołam adres spod trasy 'prpo_msg_list' to wczytuje się on prawidłowo + widzę dodany wcześniej komunikat flash.

Zrobiłem też inny test. Lokalnie podniosłem limit pamięci dla tej akcji do 1024M i zakomentowałem linijkę z przekierowaniem. W efekcie akcja post się wykonuje ale nie następuje przekierowanie więc mogę zobaczyć profiler. W momencie wczytania pustego formularza zużycie pamięci pokazywane przez profiler waha się w granicach 20-40MB (co odświeżenie różna wartość), natomiast po wysłaniu formularza postem wynosi... 400MB.

Wyświetlając informacje z profilera Symfony widzę, że największy wzrost pamięci odnotowywany jest w debug.security.authorization.vote (skok o kilkaset mega).

Idąc dalej: przekroczenie pamięci następuje w klasie ContextListener w linii:
  1. $session->set($this->sessionKey, serialize($token));

Zrzuciłem sobie zawartość $token na ekran i zauważyłem, że obiekt użytkownika zawiera m.in. wszystkie wiadomości (krótkie tekstowo, ilość ok. 20 więc bez szału) i poszedłem w tym kierunku. W encji widzę:

  1. /**
  2.   * @var \Doctrine\Common\Collections\Collection
  3.   *
  4.   * @ORM\ManyToMany(targetEntity="App\Module\PricesPolicy\Entity\PrpoMessage", inversedBy="receivers")
  5.   * @ORM\JoinTable(name="prpo_receiver",
  6.   * joinColumns={
  7.   * @ORM\JoinColumn(name="cms_auth_id", referencedColumnName="id")
  8.   * },
  9.   * inverseJoinColumns={
  10.   * @ORM\JoinColumn(name="prpo_message_id", referencedColumnName="id")
  11.   * }
  12.   * )
  13.   */
  14. private $prpoMessage;

Samo dojście do wyświetlenia dumpu $tokena zajmuje ok. 40 sekund. W momencie gdy zakomentuję fragment związany z @ORM\JoinTable są to 3 sekundy. No ale usunięcie tego fragmentu powoduje kolejne błędy w aplikacji.

Czy ktoś z Was spotkał się z takim zjawiskiem? Gdzie szukać przyczyny tak ogromnego zużycia pamięci?
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 7.06.2024 - 09:36