PHP Academy · Oppitunti

Muistinhallinta ja suorituskykyvinkit

Vapauttakaa muistia ajoissa, välttäkää suurten taulukkokopioiden luomista ja käyttäkää generaattoreita suurille aineistoille.

Oppitunti 4/413 vaihetta

Muistinhallinta ja suorituskykyvinkit on ilmainen PHP Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu PHP Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. PHP Academy-kurssilla on yhteensä 4 oppituntia.

PHP:n muistinhallinta

PHP käyttää viitelaskentaa ja syklien kerääjää roskienkeruuseen. Jokainen pyyntö aloitetaan uudella kekomuistilla — pitkään käynnissä olevat prosessit (työprosessit, Horizon) voivat kerryttää muistivuotoja.

memory_limit

Asettakaa tiedostossa php.ini sopiva muistiraja. Sen ylittäminen aiheuttaa vakavan virheen.

# 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";

Suurten muuttujien vapauttaminen

Vapauttakaa muisti erikseen, kun suuria taulukoita tai olioita ei enää tarvita pitkän funktion aikana.

<?php
$data = loadLargeDataset();
processData($data);
unset($data); // free immediately, do not wait for end of scope
gc_collect_cycles(); // force garbage collection if circular references

Generaattorit suurille tietojoukoille

Käyttäkää generaattoreita suurten tiedostojen tai kyselytulosten käsittelyyn yksi rivi kerrallaan ilman, että kaikkea ladataan muistiin.

<?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);
}

Välttäkää suurten taulukoiden kopiointia

PHP käyttää taulukoille copy-on-write-mekanismia. Taulukon sijoittaminen muuttujaan ei kopioi sitä, ennen kuin jompaakumpaa niistä muokataan. Välittäkää suuret taulukot viitteellä, kun niitä on muutettava.

<?php
function processArray(array &$data): void {
    // & avoids a copy when the parameter is modified
}

Merkkijonojen yhdistäminen silmukoissa

Merkkijonon muodostaminen yhdistämällä osia silmukassa on tehotonta erittäin suurille merkkijonoille. Käyttäkää taulukkoa ja funktiota 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);

Olioiden luonnin välimuistitus

Olioiden instansiointi, erityisesti konstruktorin suorittaman logiikan yhteydessä, on suoritusintensiivisissä silmukoissa kallista. Tallentakaa instanssit välimuistiin tai käyttäkää flyweight-olioita aina kun mahdollista.

Välttäkää toistuvia funktiokutsuja

Siirtäkää silmukoiden ulkopuolelle vakiot palauttavat funktiokutsut, jos tulos ei muutu iteraatioiden välillä.

<?php
// Slow:
for ($i = 0; $i < count($items); $i++) { ... }

// Fast (count() called once):
$n = count($items);
for ($i = 0; $i < $n; $i++) { ... }

PHP-FPM-työntekijöiden säätäminen

Määrittäkää PHP-FPM-työntekijöiden määrä käytettävissä olevan muistin ja odotetun samanaikaisuuden perusteella. Suuntaa-antava sääntö: työntekijät = RAM / (työntekijän keskimääräinen muistin käyttö).

OPcache ja esilataus

Ottakaa käyttöön OPcache, jota käsiteltiin edellisessä oppitunnissa, ja esilatakatkaa usein käytetyt framework-luokat. Tämä poistaa jokaisen pyynnön yhteydessä syntyvän jäsentämisen ja kääntämisen aiheuttaman kuormituksen.

Profiloikaa ensin

Profiloikaa aina ennen optimointia. Pullonkaulaan liittymättömään koodiin tehdyt mikro-optimoinnit tuhlaavat aikaa ja heikentävät luettavuutta. Käyttäkää Xdebugia tai Blackfirea todellisen kuuman suorituspolun löytämiseen.

Yhteenveto

Käyttäkää generaattoreita suurten tietojoukkojen käsittelyyn. Poistakaa muuttujat käytöstä, kun niitä ei enää tarvita. Välttäkää suurten taulukoiden kopioita. Siirtäkää vakiot palauttavat kutsut silmukoiden ulkopuolelle. Profiloikaa Xdebugilla todellisten pullonkaulojen löytämiseksi ennen optimointia.

Pikatarkistus

Mikä on PHP-generaattoreiden tärkein hyöty suurten tietojoukkojen käsittelyssä?

Aloita maksutta

Opi PHP tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
49
Oppitunnit
195

Usein kysytyt kysymykset

Onko oppitunti ”Muistinhallinta ja suorituskykyvinkit” ilmainen?

Kyllä – oppitunnin ”Muistinhallinta ja suorituskykyvinkit” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko PHP Academy-kurssin, päivitä CoddyKit PROhon. PHP Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Muistinhallinta ja suorituskykyvinkit”?

Vapauttakaa muistia ajoissa, välttäkää suurten taulukkokopioiden luomista ja käyttäkää generaattoreita suurille aineistoille. Harjoittelet PHP Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni PHP Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin PHP Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Muistinhallinta ja suorituskykyvinkit”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä PHP Academy-oppitunnilla?

Kyllä. Jokainen PHP Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. PHP:n profilointi Xdebugilla
  2. OPcache: tavukoodin välimuisti
  3. Tietokantakyselyjen optimointi
  4. Muistinhallinta ja suorituskykyvinkit
← Takaisin: PHP Academy