php mysql pdo yii2 php-7

php - informix connect



¿PDO de PHP7 ext lee todo el conjunto de resultados en la memoria? (1)

Desde que me actualicé a PHP7, me di cuenta de que algunas declaraciones SQL ya no funcionan y, en su lugar, se quedan sin memoria.

Tengo este código:

$query = Yii::$app->db->createCommand(''select * from tbl_title'')->query(); while ($row = $reader->read()) { var_dump($row); exit(); }

Y la abstracción de la base de datos de Yii2 es solo una capa extremadamente delgada sobre las PDO y no hace nada extra. query() no hace nada más que agregar una línea a un archivo de registro (Yii2) para crear perfiles y reader->read() solo llama a la función fetch() la secuencia PDO.

Pero se queda sin memoria citando el tamaño (espacio utilizado) de mi tabla, es decir, tratando de asignar 385 MB de memoria de proceso:

Se ha agotado el tamaño de memoria permitido de 134217728 bytes (se intentó asignar 385883840 bytes)

Como llave inglesa, si utilizo una consulta cuyo conjunto de resultados se ajusta por completo al límite de 128 MB del proceso de PHP, funciona.

Entonces, ¿ha cambiado PHP7 y puedo volver a cambiarlo?


No está directamente relacionado con PHP7. El problema se debe al nuevo controlador mysqlnd , por lo que puede experimentar el mismo problema incluso con PHP 5.x también. En realidad, es una corrección de errores, porque incluso antes de que la memoria todavía se asignara, pero no contaba para memory_limit .

Para evitar un problema de memoria, debe usar consultas sin búfer para los grandes conjuntos de resultados.

Entonces, para la consulta que está esperando un gran conjunto de datos, establezca la configuración adecuada de esta manera:

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, TRUE);

Para la lectura adicional, tengo una explicación decente en mi tutorial de PDO , gracias a Nikic, cuya crítica fue invaluable.