W firmie jestem odpowiedzialny za utrzymanie, poprawę i rozbudowę najgorzej napisanej aplikacji w PHP na świecie, która na moje nieszczęście jest już trochę rozbudowana i operuje na dosyć istotnych danych, których jest dużo.
O "jakości" aplikacji może świadczyć fakt, że pierwszym moim zadaniem była optymalizacja tego w taki sposób, żeby na localhoście wykonywało się tak szybko jak na zdalnym serwerze (nazwa.pl), gdzie na localhoście trwało to ok. 90 sekund [!], na nazwie - ok 2 sekundy. Zapytań na jedno odświeżenie było wtedy ok 150.
Udało mi się to przyśpieszyć kosztem pamięci, ogólnie dla mnie to to powinno być napisane od zera, ale nikt nie będzie czekał 3 miesiące (co najmniej) na przepisanie czegoś co przecież działa - więc nikt nie zapłaci za 3 miesiące prac, których efektu nie widać.
Tylko, że teraz doszedł problem, że nazwa.pl ma memory_limit 64M
, w porządku, sądzę, że to i tak dużo, ale niestety - aplikacja przekracza tę wartość.
W tym momencie jedna z podstron (zawierająca jakieś tam dane z konkretnego miesiąca) wykonuje się do końca i wg memory_get_peak_usage
wartość szczytowa pamięci to 60,4MB.
Ok, tyle, że na localhoście wartość ta to 50,5MB.
Z początku sądziłem, że po prostu załadowane rozszerzenia do PHP też zabierają swoją pamięć, ale chyba nie, gdyż "w środku" kodu, a przed wykonaniem najbardziej męczącej części kodu - wartości te są odpowiednio: 5,5MB na nazwa.pl i 6,0MB na localhost (odwrotne proporcje) - a na nazwie.pl z pewnością jest więcej rozszerzeń niż na moim localhoście.
Jedyny trop na jaki wpadłem - nazwa ma 32bitowe środowisko, ja mam 64bitowe. Jeżeli to nie powinno powodować różnicy (nie znam się na architekturze komputerów) - to gdzie szukać sposobu na uwolnienie tych 10MB? Nie jest to sprawa różnic w działaniu garbage collectora, bo z tego co się orientuję - PHP wyzbiera śmieci nie wcześniej aż CPU znajdzie na to czas, ale nie później niż gdyby miało mu braknąć pamięci.
Kod i dane na których operuję są identyczne.