Pregunta

Bueno, aquí está uno para los pros:

Desde hace un par de años, he estado trabajando en mi propia PHP ORM aplicación / ActiveRecord que puse el nombre de Pork.dbObject.

Se basa en la loosly 'hacer su propio sitio con rieles en 5 minutos a la película que todos vimos hace un par de años. Puede hacer cosas como:

$clients = dbObject::Search("Client", array("ID > 500")); 

o

$client = new Client(218); // fetch row with id 218 from client table

o

$projects = $client->Find('Project');

Esto obtendrá una o más filas de la base de datos, envolverlos en un DBOBJECT y devolverlos en una matriz, o volver falsa de no hay resultados.

Todo esto ha estado trabajando en perfecta de sitios y backends docenas, pero ahora mi colega lo está utilizando para crear una gran LogParser y aquí comienza los problemas de uso de memoria ..

Las consultas se pueden volver ejecuta más de 20.000 filas, tal vez incluso más, lo que por supuesto no es una cosa muy buena para envolver en una envoltura de objeto a la vez y volver como una sola matriz.

La solución obvia sería la de devolver un objeto que implementa la Iterator interfaz en lugar de una matriz. No debe ir a buscar al instante todos los registros del conjunto de resultados, pero sólo mantenga el recurso resultado para la consulta de base de datos generada y utilizar mysql_fetch_ * internamente cuando se recorre el objeto como si se tratara de una matriz.

Ahora llegamos a la pregunta real: ¿Puedo, sin ningún tipo de problemas que acabamos de hacer esto? Bases de datos son capaces de manejar varios conjuntos de resultados abiertos, y mezclarlas y mantenerlos en la memoria por un tiempo?

Por ejemplo, se ha podido recuperar 20 objetos, bucle de ellos, dejar que cada uno de estos 20 fetch otros 5, wich, a su vez también buscar a otros 3. Esto crearía un bucle donde se mantendrá un número de diferentes mangos resultado en la memoria.

Yo sé que no puedo serializar uno de estos objetos, pero voy a ser capaz de implementar esto sin ningún problema en PHP5, o serán interfaces de bases de darme problemas?

¿Fue útil?

Solución

Depende de qué base de datos que está utilizando y la configuración de la base de datos.

Para MySQL que necesita para asegurarse de que utiliza consultas búfer. En DOP configura de esta manera:

$myPdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

Esto significa que todos los datos serán enviados al cliente (no el mismo que ir a buscar todo en PHP).

El otro (probablemente peor) alternativa es abrir una nueva conexión de base de datos cada vez que se detecta una consulta que se ejecuta con un conjunto de resultados todavía abierto.

El mysql_query() utiliza una consulta tamponada, por lo que trabajará con varios conjuntos de resultados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top