Jak przechwycic blad `allowed memory exhausted` oraz wyswietlic odpowienija informacje dla user'a

0

Witam,

Czy istnieje jakas mozliwosc, zeby zlapac allowed memory exhausted blad i wyswietlic odpowienia komunikat na frond-endzie? try{} catch{} blok nie lapie tego bledu. Musi byc to mozliwe do wylapania? Niby to nie jest PHP problem a problem po stronie serwera, ustawien php.ini. Ale moze da rade jakos to ladnie przejsc?

Uzywam phpoffice/phpspreadsheet biblioteki. I przy ladowaniu pliku xls z formulami, PHP stara sie wykonac te formuly i wywala allowed memory exhausted blad.

1

@poniatowski:

W różnych jezykach jest z zasady bardzo trudno ładnie taki błąd obsłużyć. Aplikacja w praktyce jest w stanie śmierci klinicznej

Tak jakbyś facetowi z trwającym zawałem kazał komuś ładnie ten fakt zrelacjonować,

0

Błąd jest na poziomie core PHP. Nigdy nie musiałem ale możesz próbować pisać własny core error handler.
Tylko to zła droga. W końcu PHP na chwilę przestaje działać i apka umiera.
Czemu nie zwiększysz ilości dozwolonej pamięci w php.ini? Domyślnie to tylko 128MB Alternatywnie czemu przy ładowaniu excela nie wyłączysz wykonywania formuł jeśli wiesz, że tu jest problem?
Kiedyś parkowałem bardzo duże excele i niesety skończyło się na dołożeniu RAM do serwera i zwiększeniu na ten skrypt konkretny limitu na bliski całości dostępnego RAM(chyba to było 8GB).

0

Moze i tak, nie jestem pewny. Ale jak idzie jakos to obluzyc i wyswietlic informacje. To wole to zrobic niz zabic cala aplikacje.

0

No właśnie ją zabijasz.

0

Jak ja zabije? Wytlumacz doklanie?

1

No błąd masz na poziomie Core PHPa. Jak on leci to aplikacja już nie żyje. Tak jak błąd parsowania pliku ze skryptem.

Edit.
Zobacz dokumetacje:
https://www.php.net/manual/en/function.set-error-handler.php
i tutaj
https://forum.phalcon.io/discussion/14765/cant-catch-php-memory-exhausted-error-with-phalcons-beforeexcept

0

Kumam, tylko ze taki blad dalej idzie ogarnac. To jest blad serwera, ale mozna dalej go obsluzyc i wyswietlic zgrabna wiadomosc, zamiast wyrzucac jakies linije kodu zrodlowego na front-end.

1

A po co masz coś rzucać na front end przy takim błędzie? 500 powinno iść.
Ciągle uważam, że chcesz rzeźbić w brązowym.
Zwiększ ten limit albo wyłącz te formuły.

0

Jeżeli ustalisz sobie jakąś granicę odrobinę poniżej twojego limitu pamięci to możesz cyklicznie sprawdzać zużycie pamięci przy pomocy funkcji https://www.php.net/manual/en/function.memory-get-usage.php
W razie przekroczenia tej granicy (ale przed przekroczeniem limitu z php.ini) rzuć i obsłuż własny wyjątek.

Niestety nie mam pojęcia jak takie cykliczne sprawdzanie używanej pamięci wypada wydajnościowo.

0

To nie jest do końca prawda żę aplikacja nie żyje, ona żyje - próbuje zaalokować pamięć, ale jej się to nie udaje. Technicznie dałoby się to przechwycic.

Tylko że wtedy PHP rzuca "fatal error", a nie wyjątek, więc nie da się go złapać. (chyba od którego PHP się dopiero da).

1 użytkowników online, w tym zalogowanych: 0, gości: 1