Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Wyciek pamięci
SmokAnalog
post 4.02.2018, 13:09:10
Post #1





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Witajcie,

nie do końca wiem jak w PHP narazić się na wyciek pamięci, ale chyba właśnie padłem jego ofiarą. Mam skrypt konsolowy, który czyta po kolei strony z zewnętrznego serwera i zawsze po około 40-50-ciu tysiącach iteracji otrzymuję błąd w stylu:

Cytat
PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 421888 bytes) in ... on line 36


A to mój kod (uprościłem dla przykładu):

  1. for ($id = $initialId;; $id += 1) {
  2. echo 'Trying #' . $id . ': ';
  3.  
  4. try {
  5. $html = file_get_contents('http://domena.com/page/' . $id);
  6.  
  7. // ...
  8. } catch (Exception $exception) {
  9. echo 'FAIL';
  10. }
  11. }


Linia 36. to:
  1. $html = file_get_contents('http://domena.com/page/' . $id);


Czy po kroku iteracji zawartość $html dalej jest trzymana w pamięci? Jakoś nie chce mi się w to wierzyć.

Ten post edytował SmokAnalog 4.02.2018, 13:09:52
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
com
post 6.02.2018, 19:56:49
Post #2





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


przy
  1. <?php
  2. set_error_handler(function ($severity, $message, $file, $line) {
  3. if (!(error_reporting() & $severity)) {
  4. // This error code is not included in error_reporting
  5. return;
  6. }
  7.  
  8. throw new ErrorException($message, 0, $severity, $file, $line);
  9. });
  10.  
  11. $n = 0;
  12.  
  13. while (true) {
  14. try {
  15. $content = file_get_contents('http://forum.php.pl/test.php');
  16. } catch (Exception $e) {
  17. echo "FAIL" . PHP_EOL;
  18. unset($e);
  19. }
  20. echo $n++ . ' ' . memory_get_usage() . PHP_EOL;
  21. }


Kod
582 366144
FAIL
583 366144
FAIL
584 366144
FAIL
585 366144
FAIL
586 366144
FAIL
587 366144
FAIL
588 366144


Ten parametr w zasadzie nic nie zmienia, tylko mamy trochę większe zużycie ale ono nie rośnie dzięki temu że kasujemy referencje do poprzedniego.

Cytat
It is because exceptions include a backtrace, containing all the arguments given to the error handling closure. The fifth argument of ErrorException given is $context, an array containing all local variables, including the previous $e.


Cytat
Pytanie jeszcze o co chodzi z tym parametrem w memory_get_usage, bo wg dokumentacji jest to:


W źródle dokładnie to wygląda tak:
Kod
if (real_usage) {
        return AG(mm_heap)->real_size;
} else {
        size_t usage = AG(mm_heap)->size;
        return usage;
}


Ten post edytował com 6.02.2018, 20:05:26
Go to the top of the page
+Quote Post

Posty w temacie
- SmokAnalog   [PHP] Wyciek pamięci   4.02.2018, 13:09:10
- - com   PHP to język interpretowany, on przetwarza pokolei...   4.02.2018, 14:35:22
- - SmokAnalog   Dzięki, ale to chyba nie jest odpowiedź na moje py...   4.02.2018, 14:43:12
- - trzczy   Czasami ograniczenia pamięci wkurzają. Np. niezaję...   4.02.2018, 15:05:00
- - com   https://github.com/php/php-src/blob/master/...ard/...   4.02.2018, 15:07:53
- - darko   Wyciek pamięci, a wyczerpanie dozwolonego limitu z...   4.02.2018, 15:15:16
- - SmokAnalog   @darko tylko co ma do tego brak warunku? Ma mielić...   4.02.2018, 15:25:30
- - trueblue   Coś się poprawia dodając unset($html) i/lub h...   4.02.2018, 15:36:30
- - com   Ale zacznijmy od tego że PHP, nie koniecznie jest ...   4.02.2018, 16:03:15
- - darko   Nie zrozumieliśmy się. Problemy ze zwalnianiem pam...   4.02.2018, 16:10:39
- - phpion   Nie jest przypadkiem tak, że dla konkretnego adres...   4.02.2018, 16:42:02
- - SmokAnalog   @phpion Jestem pewien. Jedna strona nie ma 512 MB....   4.02.2018, 17:03:35
- - phpion   Do zmiennej $html wczytujesz ponad 500 Mb dan...   4.02.2018, 20:40:46
- - SmokAnalog   Eee, jakim cudem wczytuję do zmiennej $html 5...   4.02.2018, 20:58:58
- - markuz   memory_get_usage Po prostu sprawdź w którym momen...   4.02.2018, 21:15:21
- - SmokAnalog   Masz rację, że to nie dowód. Sam o tym napisałem p...   4.02.2018, 21:24:55
- - markuz   Nic nie myślę, po prostu to sprawdź tą funkcją    4.02.2018, 21:27:05
- - SmokAnalog   Jasne. Sprawdzę jak dotrę do domu   4.02.2018, 21:29:15
- - phpion   Mój błąd, przeczytałem ze wczytujesz więcej niż 50...   4.02.2018, 21:38:39
- - SmokAnalog   Owszem, ale na logikę: to nie znaczy, że to ta lin...   4.02.2018, 23:04:46
- - Pyton_000   Jeśli używasz PHP7 to w teorii powinno Ci samo wyw...   5.02.2018, 12:23:26
- - SmokAnalog   Wyrzuca stary, dobry warning na PHP 7.2.   5.02.2018, 12:30:49
- - com   Ciężko jest odtworzyć Twój błąd nawet z zastosowan...   5.02.2018, 18:14:06
- - markuz   [PHP] pobierz, plaintext <?php set_error_h...   5.02.2018, 22:28:49
- - SmokAnalog   Pobawiłem się trochę Twoim i moim przykładem. Wnio...   5.02.2018, 22:53:35
- - markuz   Bez wyjątków nie pobiera więcej pamięci: [PHP] po...   5.02.2018, 23:02:09
- - SmokAnalog   I to też jest bardzo ciekawa obserwacja. Masz jaki...   5.02.2018, 23:07:50
- - markuz   Nie mam pomysłów. Wrzuć link do stackoverflow jak ...   5.02.2018, 23:33:33
- - SmokAnalog   Temat już wisi. Nie będę linkował, ale podzielę si...   6.02.2018, 00:36:13
- - com   [PHP] pobierz, plaintext <?phpset_error_handler...   6.02.2018, 19:15:58
- - SmokAnalog   @com zobacz, co pisaliśmy wyżej. Bez unset też będ...   6.02.2018, 19:23:01
- - com   SmokAnalog ale unset jest na Exception, nie ma sta...   6.02.2018, 19:30:52
- - SmokAnalog   Chyba rzeczywiście jest coś w tym co mówisz, ale ź...   6.02.2018, 19:39:51
- - com   przy [PHP] pobierz, plaintext <?phpset_error_h...   6.02.2018, 19:56:49
|- - SmokAnalog   Cytat(com @ 6.02.2018, 19:56:49 ) Ten...   6.02.2018, 20:10:33
- - com   ha faktycznie ślepy jestem 2097152 > 366144 No...   6.02.2018, 20:15:45
- - SmokAnalog   Dzisiaj całą noc chodził crawlerek bez żadnej zady...   7.02.2018, 13:30:13
- - com   super ciekawe co tam crawlujesz   7.02.2018, 21:12:53
- - darko   CytatIt is because exceptions include a backtrace,...   8.02.2018, 11:30:29
- - SmokAnalog   Czy ja wiem czy takie dziwne? Zrobiłem jeszcze je...   8.02.2018, 14:48:23
- - com   Ale jest, bo nie wywołany jest destruct na starym ...   8.02.2018, 17:56:29
- - darko   Jeśli masz znaczną ilość faili, to może przed prób...   9.02.2018, 23:36:39
- - SmokAnalog   Darko, nie obraź się, ale wszystkie Twoje odpowied...   9.02.2018, 23:52:51
|- - vokiel   Cytat(SmokAnalog @ 9.02.2018, 23:52:5...   10.02.2018, 13:56:35
- - darko   To teraz Ty się nie obraź, bo już mnie lekko irytu...   10.02.2018, 02:29:44
- - SmokAnalog   No ciekawe jak przyśpieszysz w kodzie crawlera prz...   10.02.2018, 03:52:36
|- - darko   Cytat(SmokAnalog @ 10.02.2018, 03:52...   10.02.2018, 14:06:37
- - phpion   Panowie, nie ma się co tak napinać. Każdy z Was wn...   11.02.2018, 19:35:00


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: 28.04.2024 - 17:45