Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Unerwartetes Erreichen des PHP-Speicherlimits mit einer einzigen PDO-Abfrage?

Ding-Ding-Ding!

Beim Verbinden mit MySQL verwendet PHP gerne gepufferte Abfragen . Dies gilt unabhängig davon, welche Methode Sie zum Herstellen einer Verbindung verwenden. Wenn Sie gepufferte Abfragen verwenden, wird die gesamte Ergebnismenge sofort abgerufen, anstatt auf Ihre Anfrage hin abgerufen zu werden. Dies ist normalerweise der Fall gut für die Leistung, da es weniger Roundtrips gibt.

Aber wie alles in PHP gibt es einen Haken. Wie auf der Pufferseite angegeben:

Sie verwenden PHP 5.3, was bedeutet, dass Sie wahrscheinlich mysqlnd verwenden.

Hier sollten Sie gepufferte Abfragen deaktivieren. Das wird in jeder PHP-Schnittstelle zu MySQL anders gemacht:

  • Für PDO müssen Sie PDO::MYSQL_ATTR_USE_BUFFERED_QUERY festlegen Attribut auf false .
  • Für mysqli müssen Sie den MYSQLI_USE_RESULT übergeben Konstante zur query Methode.
  • Für MySQL müssen Sie mysql_unbuffered_query aufrufen statt mysql_query .

Vollständige Details und Beispiele finden Sie auf der Seite.

Große, fette ungepufferte Abfragen!

Sie müssen Schließen Sie das Anweisungshandle ordnungsgemäß und geben Sie die Ergebnismenge frei, bevor Sie eine weitere Abfrage ausführen:

  • In PDO bedeutet dies den Aufruf von closeCursor auf dem Statement-Handle.
  • In mysqli bedeutet dies den Aufruf von free_result auf dem Statement-Handle oder free auf dem Ergebnishandle, je nachdem, womit Sie arbeiten.
  • In mysql bedeutet dies den Aufruf von mysql_free_result

Andernfalls wird ein Fehler ausgegeben.