tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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).