sql >> Databáze >  >> RDS >> Mysql

Neočekávaně narazíte na limit paměti PHP jediným dotazem PDO?

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 na false .
  • Pro mysqli musíte předat MYSQLI_USE_RESULT konstantní k query metoda.
  • Pro mysql musíte zavolat mysql_unbuffered_query místo mysql_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 nebo free 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ě.




  1. Omezení simultánních uživatelských relací pro konkrétní přihlášení na SQL Server

  2. Pivoting dat pomocí dvou sloupců

  3. Aspekty řetězců v .NET

  4. Jak vypočítat čtverec v SQL Server