Zarządzanie pamięcią i wskazówki dotyczące wydajności
Zwalniaj pamięć wcześniej, unikaj dużych kopii tablic i używaj generatorów dla dużych zbiorów danych
Zarządzanie pamięcią i wskazówki dotyczące wydajności to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.
Zarządzanie pamięcią w PHP
PHP używa zliczania odwołań oraz modułu zbierania cykli do zarządzania pamięcią. Każde żądanie rozpoczyna pracę ze świeżym stertą, ale procesy długotrwałe (workery, Horizon) mogą gromadzić wycieki pamięci.
memory_limit
Należy ustawić odpowiedni limit pamięci w pliku php.ini. Jego przekroczenie powoduje błąd krytyczny.
# php.ini:
memory_limit = 256M
// Check at runtime:
echo memory_get_usage(true) / 1024 / 1024 . " MB";
echo memory_get_peak_usage(true) / 1024 / 1024 . " MB peak";Usuwanie dużych zmiennych
W długiej funkcji należy jawnie zwalniać pamięć, gdy duże tablice lub obiekty nie są już potrzebne.
<?php
$data = loadLargeDataset();
processData($data);
unset($data); // free immediately, do not wait for end of scope
gc_collect_cycles(); // force garbage collection if circular referencesGeneratory dla dużych zbiorów danych
Należy używać generatorów do przetwarzania dużych plików lub wyników zapytań wiersz po wierszu, bez ładowania całości do pamięci.
<?php
function readCsvLines(string $file): Generator {
$fh = fopen($file, "r");
while (($line = fgetcsv($fh)) !== false) {
yield $line;
}
fclose($fh);
}
foreach (readCsvLines("large.csv") as $row) {
importRow($row);
}Unikanie kopiowania dużych tablic
PHP używa mechanizmu kopiowania przy zapisie dla tablic. Przypisanie tablicy do zmiennej nie powoduje jej skopiowania, dopóki jedna z nich nie zostanie zmodyfikowana. Duże tablice należy przekazywać przez referencję, gdy konieczna jest ich modyfikacja.
<?php
function processArray(array &$data): void {
// & avoids a copy when the parameter is modified
}Łączenie ciągów znaków w pętlach
Budowanie bardzo dużych ciągów znaków przez łączenie ich w pętli jest nieefektywne. Należy użyć tablicy i implode().
<?php
// Slow for large N:
$str = "";
foreach ($items as $item) $str .= $item->format()."\n";
// Faster:
$parts = [];
foreach ($items as $item) $parts[] = $item->format();
$str = implode("\n", $parts);Buforowanie tworzenia obiektów
Tworzenie instancji obiektów, szczególnie gdy wiąże się z wykonaniem logiki konstruktora, jest kosztowne w ciasnych pętlach. W miarę możliwości należy buforować instancje lub używać obiektów typu flyweight.
Unikanie wielokrotnych wywołań funkcji
Stałe wywołania funkcji należy przenieść poza pętle, jeśli ich wynik nie zmienia się w kolejnych iteracjach.
<?php
// Slow:
for ($i = 0; $i < count($items); $i++) { ... }
// Fast (count() called once):
$n = count($items);
for ($i = 0; $i < $n; $i++) { ... }Dostosowanie liczby procesów PHP-FPM
Liczbę procesów roboczych PHP-FPM należy skonfigurować na podstawie dostępnej pamięci i przewidywanej współbieżności. Przybliżona reguła: workers = RAM / (średnie zużycie pamięci przez proces roboczy).
OPcache i wstępne ładowanie
Należy włączyć OPcache (omówiony w poprzedniej lekcji) i wstępnie załadować często używane klasy frameworka. Eliminuje to narzut analizy i kompilacji przy każdym żądaniu.
Najpierw profilowanie
Przed optymalizacją zawsze należy wykonać profilowanie. Mikrooptymalizacje zastosowane w kodzie, który nie stanowi wąskiego gardła, są stratą czasu i pogarszają czytelność. Należy użyć Xdebug lub Blackfire, aby znaleźć rzeczywiście najczęściej wykonywaną ścieżkę.
Podsumowanie
W przypadku dużych zbiorów danych należy używać generatorów. Po zakończeniu pracy należy usuwać zmienne za pomocą unset. Należy unikać kopiowania dużych tablic. Stałe wywołania należy przenosić poza pętle. Przed optymalizacją należy profilować kod za pomocą Xdebug, aby znaleźć rzeczywiste wąskie gardła.
Szybkie sprawdzenie
Jaka jest główna korzyść ze stosowania generatorów PHP dla dużych zbiorów danych?
Często zadawane pytania
Czy lekcja „Zarządzanie pamięcią i wskazówki dotyczące wydajności” jest bezpłatna?
Tak — pełny tekst „Zarządzanie pamięcią i wskazówki dotyczące wydajności” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Zarządzanie pamięcią i wskazówki dotyczące wydajności”?
Zwalniaj pamięć wcześniej, unikaj dużych kopii tablic i używaj generatorów dla dużych zbiorów danych Ćwiczysz PHP Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć PHP Academy?
Nie wymagamy żadnego doświadczenia. PHP Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Zarządzanie pamięcią i wskazówki dotyczące wydajności”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji PHP Academy?
Tak. Każda lekcja PHP Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Profilowanie PHP za pomocą Xdebug
- OPcache: buforowanie kodu bajtowego
- Optymalizacja zapytań do bazy danych
- Zarządzanie pamięcią i wskazówki dotyczące wydajności