POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.
V PHP od verze 5.5 je k dispozici operátor yield. Ten funguje podobně jako return s jedním rozdílem.
Když ve funkci zavoláte return, tak se funkce ukončí a když tu samou funkci zavoláte znova, začne opět od začátku.
Když ve funkci zavoláte yield, tak se funkce ukončí, ale když ji zavoláte znova, začne přesně tam, kde skončila (tedy například bude pokračovat v cyklu).
Yield znamená v překladu něco jako „vynést“, v PHP si to můžete představit tak, že se „vynesou data“, aby se nemusela držet v paměti. Budu mít například následující dva programy, které vypíší čísla od 0 do 1000000.
Klasický příklad
$data = range(0, 1000000);
echo round((memory_get_usage()/1048576),2)." MB zabráno v paměti\n";
foreach ($data as $cislo) {
echo $cislo . " ";
}
Příklad s yield
function range_yield($zacatek, $konec) {
for ($i = $zacatek; $i <= $konec; $i++) {
yield $i;
}
}
$data = range_yield(0, 1000000);
echo round((memory_get_usage()/1048576),2)." MB zabráno v paměti\n";
foreach ($data as $cislo) {
echo $cislo . " ";
}
Porovnání zabrané paměti
Jak můžete z grafu vyčíst, tak se zabraná paměť u příkladu s yield s různými parametry nijak neměnila, kdežto paměťová náročnost u klasické příkladu podstatně rostla.
Yield se tedy hodí všude tam (a nejen tam), kde získáváme větší počet dat. Může to extrémě ulevit serveru při vyšší návštěvnosti.
Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)