Napotkałem przerażający komunikat o błędzie, prawdopodobnie poprzez żmudny wysiłek, PHP zabrakło pamięci:
Wyczerpano dozwolony rozmiar pamięci #### bajtów (próbowano przydzielić #### bajtów) w pliku.php w linii 123
Zwiększenie limitu
Jeśli wiesz, co robisz i chcesz zwiększyć limit, zobacz memory_limit :
ini_set('memory_limit', '16M');
ini_set('memory_limit', -1); // no limit
Strzec się! Możesz tylko rozwiązać objaw, a nie problem!
Diagnozowanie wycieku:
Komunikat o błędzie wskazuje na linię z pętlą, która moim zdaniem przecieka lub niepotrzebnie gromadzi pamięć. Wydrukowałem memory_get_usage()
instrukcje na końcu każdej iteracji i widzę, że liczba powoli rośnie, aż osiągnie limit:
foreach ($users as $user) {
$task = new Task;
$task->run($user);
unset($task); // Free the variable in an attempt to recover memory
print memory_get_usage(true); // increases over time
}
Dla celów niniejszego pytanie załóżmy najgorszy wyobrażalny kod spaghetti ukrywa się w globalnej zakres gdzieś w $user
lubTask
.
Jakie narzędzia, sztuczki PHP lub debugowanie voodoo mogą pomóc mi znaleźć i rozwiązać problem?