usando una tablas tabla registros registro para obtener mostrar listar formulario fila extraer eliminar desde datos como boton php symfony doctrine2 doctrine adodb-php

registros - mostrar tablas de una base de datos mysql en php



Recuperar todas las filas de la tabla en doctrina (3)

El enfoque normal es usar iterate () .

$q = $this->getDefaultEntityManager()->createQuery(''select u from AppBundle:Contractor c''); $iterableResult = $q->iterate(); foreach ($iterableResult as $row) { // do something }

Sin embargo, como la documentación de la doctrina dice que esto aún puede dar lugar a errores.

Los resultados pueden ser amortiguados por la base de datos cliente / conexión asignando memoria adicional no visible para el proceso de PHP. Para juegos grandes, esto puede matar fácilmente el proceso sin ninguna razón aparente.

El enfoque más fácil de esto sería simplemente crear consultas más pequeñas con compensaciones y límites.

//get the count of the whole query first $qb = $this->getDefaultEntityManager(); $qb->select(''COUNT(u)'')->from(''AppBundle:Contractor'', ''c''); $count = $qb->getQuery()->getSingleScalarResult(); //lets say we go in steps of 1000 to have no memory leak $limit = 1000; $offset = 0; //loop every 1000 > create a query > loop the result > repeat while ($offset < $count){ $qb->select(''u'') ->from(''AppBundle:Contractor'', ''c'') ->setMaxResults($limit) ->setFirstResult($offset); $result = $qb->getQuery()->getResult(); foreach ($result as $contractor) { // do something } $offset += $limit; }

Con estos conjuntos de datos pesados, es muy probable que supere el tiempo máximo de ejecución , que es de 30 segundos por defecto. Así que asegúrese de cambiar manualmente set_time_limit en su php.ini. Si solo quiere actualizar todos los conjuntos de datos con un patrón conocido, debería considerar escribir una gran consulta de actualización en lugar de crear un bucle y editar el resultado en PHP.

Tengo una tabla con más de 100.000 filas, y quiero seleccionar todo en doctrina y hacer algunas acciones con cada fila, en symfony2 con doctrina que trato de hacer con esta consulta:

$query = $this->getDefaultEntityManager() ->getRepository(''AppBundle:Contractor'') ->createQueryBuilder(''c'') ->getQuery()->iterate(); foreach ($query as $contractor) { // doing something }

pero luego tengo fuga de memoria, porque creo que escribió todos los datos en la memoria.

Tengo más experiencia en ADOdb, en esa biblioteca cuando lo hago:

$result = $ADOdbObject->Execute(''SELECT * FROM contractors''); while ($arrRow = $result->fetchRow()) { // do some action }

No tengo ninguna pérdida de memoria.

Entonces, ¿cómo seleccionar todos los datos de la tabla y no obtener pérdida de memoria con doctrine en symfony2?

Pregunta EDITAR

Cuando trato de eliminar foreach y simplemente iterar, también obtengo pérdida de memoria:

$query = $this->getDefaultEntityManager() ->getRepository(''AppBundle:Contractor'') ->createQueryBuilder(''c'') ->getQuery()->iterate();


Intenta usar este enfoque:

foreach ($query as $contractor) { // doing something $this->getDefaultEntityManager()->detach($contractor); $this->getDefaultEntityManager()->clear($contractor); unset($contractor); // tell to the gc the object is not in use anymore }

Espero que esto ayude


Si realmente necesita obtener todos los registros, le sugiero que use database_connection directamente. Mire su interfaz y elija el método que no cargará todos los datos en la memoria (y no asignará los registros a su entidad).

Podría usar algo como esto (suponiendo que este código esté en el controlador):

$db = $this->get(''database_connection''); $query = ''select * from <your_table>''; $sth = $db->prepare($query); $sth->execute(); while($row = $sth->fetch()) { // some stuff }

Probablemente no es lo que necesita porque es posible que desee tener objetos después de manejar toda la colección. Pero tal vez no necesites los objetos. De todos modos piensa en esto.