Ding ding ding!
Při připojování k MySQL PHP rád používá bufferované dotazy . To platí bez ohledu na to, jakou metodu připojení používáte. Při použití dotazů s vyrovnávací pamětí je celá sada výsledků načtena okamžitě namísto toho, aby byla načtena, když se zeptáte. Toto je obvykle dobré pro výkon, protože je méně zpátečních cest.
Ale jako všechno v PHP, i tady to má svůj háček. Jak je uvedeno na stránce ukládání do vyrovnávací paměti:
Používáte PHP 5.3, což znamená, že je velká šance, že používáte mysqlnd.
Zde budete chtít vypnout dotazy s vyrovnávací pamětí. V každém rozhraní PHP k MySQL se to dělá jinak:
- Pro PDO budete muset nastavit
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
atribut nafalse
. - Pro mysqli musíte předat
MYSQLI_USE_RESULT
konstantní kquery
metoda. - Pro mysql musíte zavolat
mysql_unbuffered_query
místomysql_query
.
Úplné podrobnosti a příklady jsou na stránce.
Velký tlustý dotaz bez vyrovnávací paměti dostal!
Musíte správně zavřete popisovač příkazu a uvolněte sadu výsledků před zadáním dalšího dotazu:
- V PDO to znamená volání
closeCursor
na popisovači příkazů. - V mysqli to znamená volání
free_result
na popisovači příkazu nebofree
na rukojeti výsledku, v závislosti na tom, s čím pracujete. - V mysql to znamená volání
mysql_free_result
Pokud tak neučiníte, dojde k chybě.