Oznámení
Jak na efektivní práci s pamětí PHP při získávání výsledků z DB
před 9 lety
- Proki
- Backer | 66
Zdravím, zabývám se nyní optimalizací načítání získávaných dat z databáze do PHP. Jsou možné minimálně dvě možnosti, jak řádky načíst a následně zpracovat (viz zdrojový kód níže). Zajímalo by mě, který z nich je efektivnější, a případně i kdy se vyhazují výjimky v případě, kdy dojde při vykonávání dotazu k chybě.
<?php
$items = dibi::query("SELECT * FROM news");
foreach ($items as $item) {
// práce se záznamem
}
$items = dibi::query("SELECT * FROM news")->fetchAll();
foreach ($items as $item) {
// práce se záznamem
}
?>
Při zkoumání zdrojových kódů jsem přišel na následující. Dejme tomu že nemáme zanedbatelné množství vrácených řádků (např. stránkování po 100). Při používání prvního způsobu se vykoná dotaz a následně se postupně získávají jednotlivé řádky z databáze. Nevýhodou je to, že nemůžu najednou pracovat s celou kolekcí záznamů, ale při obyčejných výpisech to vůbec nevadí. Druhý způsob mě přijde jako dosti neefektivní, jelikož všechny řádky jsou nejprve načteny do oblasti paměti v PHP a teprve následně s nimi uživatel nějak pracuje, což může být ve většině případů dosti neefektivní.
Je můj náhled na tuto situaci správný nebo se mýlím?
před 9 lety
- David Grudl
- Nette Core | 6806
Ano, fetchAll() zachází s pamětí zcela nejhůř, protože celou strukturu drží v poli objektů. Pokud je to možné, je lepší se mu vyhnout. Také daleko lépe s pamětí zachází unbuffered přístup, který se dá na některých ovladačích zapnout (MySQL, MySQLi, SQLite), na některých je zapnutý defaultně (PDO, SQLite3).