Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Nieoczekiwane przekroczenie limitu pamięci PHP za pomocą pojedynczego zapytania PDO?

Ding ding ding!

Podczas łączenia się z MySQL, PHP lubi używać buforowanych zapytań . Dzieje się tak niezależnie od metody używanej do połączenia. Podczas korzystania z zapytań buforowanych cały zestaw wyników jest pobierany natychmiast, a nie na żądanie. To jest zazwyczaj dobre pod względem wydajności, ponieważ jest mniej podróży w obie strony.

Ale jak wszystko w PHP, jest pewien problem. Jak wspomniano na stronie buforowania:

Używasz PHP 5.3, co oznacza, że ​​istnieje duża szansa, że ​​używasz mysqlnd.

Tutaj będziesz chciał wyłączyć buforowane zapytania. W każdym interfejsie PHP do MySQL robi się to inaczej:

  • W przypadku PDO musisz ustawić PDO::MYSQL_ATTR_USE_BUFFERED_QUERY atrybut do false .
  • Dla mysqli musisz przekazać MYSQLI_USE_RESULT stała do query metoda.
  • W przypadku mysql musisz zadzwonić na mysql_unbuffered_query zamiast mysql_query .

Pełne szczegóły i przykłady znajdują się na stronie.

Mam duże, niebuforowane zapytanie!

musisz poprawnie zamknij uchwyt instrukcji i zwolnij zbiór wyników przed wysłaniem kolejnego zapytania:

  • W PDO oznacza to wywołanie closeCursor na uchwycie wyciągu.
  • W mysqli oznacza to wywołanie free_result na uchwycie wyciągu lub free na uchwycie wyniku, w zależności od tego, z czym pracujesz.
  • W mysql oznacza to wywołanie mysql_free_result

Niewykonanie tego spowoduje błąd.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL — jak uzyskać trafne wyniki wyszukiwania

  2. Kolejność zagnieżdżenia SQL według?

  3. Jak działa parametr 'LIMIT' w sql?

  4. PHP mysql wstaw format daty

  5. CodeIgniter:Jak wykonać zapytanie Select (odrębna nazwa pola) MySQL