Gabriel
unread,Jan 26, 2011, 12:05:51 PM1/26/11Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to PHPes - PHP en español
Buenas tardes,
necesito traer 55,695 filas al ejecutar una query con PHP, el código
con el cual estoy probando es el siguiente:
<?php
//ini_set("memory_limit",'256M');
//SE ABRE LA CONEXION
$conexion = mysql_connect($servidor, $usuario, $password, true, 65536)
or die ("Falló la conexión al Servidor <br>Error: ".mysql_error()."<br>
\n");
mysql_select_db($base_datos, $conexion) or die("Falló la selección de
la Base de Datos <br>Error: ".mysql_error()."<br>\n");
// QUERY DE EJEMPLO, LA REAL DEVUELVE 55,695 FILAS
$sql = "SELECT campo1, campo2, campo3, campo4, campo5, campo6, campo7
FROM tabla_ejemplo
WHERE fecha BETWEEN '1983-01-01' AND '2011-01-20'
";
// SE UTILIZA PARA IR UNIENDO LOS DATOS DEVUELTOS EN CADA CICLO
$listado_para_reporte = Array();
// SE INICIALIZA EL INICIO Y EL RANGO DEL LIMITE A PEDIR
$inicio = 0;
$rango = 500;
do {
// SE DEFINE EL LIMITE PARA LA QUERY
$limite_para_documento = " LIMIT ".$inicio.", ".$rango."";
// SE INICIALIZA CON LA QUERY SIN EL LIMITE, PARA AGREGARSELO
MODIFICADO EN CADA CICLO
$sql_parcial = $sql;
// SE AGREGA EL LIMITE A LA QUERY PARCIAL
$sql_parcial .= $limite_para_documento;
//fputs(fopen('sql_auxiliar_'.
$r.'_armar_listado_para_reporte.txt', 'w'), print_r($sql_parcial,
true));
// SE EJECUTA LA QUERY PARCIAL
$resultado_parcial = mysql_query($sql_parcial);
$total_devueltos = mysql_num_rows($resultado_parcial);
// SI DEVUELVE ALGUN REGISTRO
if ($total_devueltos != 0) {
// SE UTILIZA UN VECTOR AUXILIAR
$i=0;
while ($row = mysql_fetch_array($resultado_parcial, MYSQL_ASSOC))
{
$vector_auxiliar[$i] = $row;
$i++;
}
//fputs(fopen('vector_auxiliar_'.
$r.'_armar_listado_para_reporte_M.txt', 'w'),
print_r($vector_auxiliar, true));
// SE LIBERA LA MEMORIA USADA POR LA QUERY PARCIAL
mysql_free_result($resultado_parcial);
// SE VA ARMANDO EL LISTADO A MEDIDA QUE SE OBTIENEN LOS DATOS
$listado_para_reporte = array_merge($listado_para_reporte,
$vector_auxiliar);
//fputs(fopen('LISTADO_REPORTE_AUX_'.
$inicio.'__armar_listado_para_reporte.txt',
'w'),print_r($listado_para_reporte, true));
}
// SE SIGUE CON LOS SIGUIENTES 500 REGISTROS (EN CASO DE EXISTIR)
$inicio += $rango;
} while ($total_devueltos == $rango);// CUANDO SE OBTENGAN MENOS DEL
RANGO YA NO HACE FALTA SEGUIR
// SE CIERRA LA CONEXION
mysql_close($conexion);
//fputs(fopen('LISTADO_COMPLETO_testear_otra_manera_sp.txt',
'w'),print_r($listado_para_reporte, true));
$cantidad = count($listado_para_reporte);
for ($f=0; $f < $cantidad; $f++){
$fila = &$listado_para_reporte[$f];
echo 'Campo 1: '.$fila['campo1'].'<br>';
echo 'Campo 2: '.$fila['campo2'].'<br>';
echo 'Campo 3: '.$fila['campo3'].'<br>';
echo 'Campo 4: '.$fila['campo4'].'<br>';
echo 'Campo 5: '.$fila['campo5'].'<br>';
echo 'Campo 6: '.$fila['campo6'].'<br>';
echo 'Campo 7: '.$fila['campo7'].'<br>';
echo '<hr>';
}
?>
Ejecuto la query con un LIMIT que se va modificando dentro de un do
while (con un rango de 500 registros), al ejecutar el script luego de
un tiempo indica que llegó al límite de memoria asignada en el
servidor, he modificado al principio del script la cantidad de memoria
hasta 256M y aún no alcanza.
Si ejecuto la query desde phpmyadmin me devuelve todas las filas sin
problemas y bastante rápido, por eso he probado con un procedimiento
almacenado en MySQL, al ejecutarlo con PHP también surge el mismo
problema.
Quisiera saber si han necesitado traer una cantidad muy grande de
filas y les ha pasado lo mismo, y si lo han podido solucionar.
Muchas gracias.