PHP - Grabado de Query SQL a Excel via PHP

 
Vista:

Grabado de Query SQL a Excel via PHP

Publicado por Teo (3 intervenciones) el 25/11/2015 03:14:47
Hola,

Recientemente me cruce con una situación que me complica bastante, no por el echo de hacerlo, sino, por lo que demora el proceso.

Tengo 2 servidores,

1) Servidor XAMPP
2) Servidor SQL

La situación es que, del servidor SQL (2), necesito que los resultados de una Query realizada en PHP (1) se graben en un excel y se descarguen a traves del navegador.

Mis alternativas fueron:

a)
Generar query, crear el archivo con PHPExcel con los resultados de la query (22.000 registros aprox),
Demora alrededor de 4min.

b)
Generar query, ejecutar desde servidor SQL el envio por mail del resultado en CSV o TXT,
Demora alrededor de 4min

c)
Generar query, crear tabla en HTML y plasmar los registros ahí
Demora alrededor de 45seg

d)
Utilizar bcp utility para generar un archivo excel basado en la query, se guarda en el servidor SQL (2)
Demora 1 a 5seg

Estoy necesitando algo efectivo para pegar los 22.000 registros o más en un excel y descargarlo desde el navegador,
Algún método más efectivo?
BCP es la única opción más rápida que encuentro, el archivo con BCP pesa 1,5Mb (nada...)
Con PHPExcel pesa 6,5Mb

El problema no es el tamaño de archivo, sino la demora que encuentro en el navegador
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Grabado de Query SQL a Excel via PHP

Publicado por xve (6935 intervenciones) el 25/11/2015 09:09:39
Hola Teo, entiendo que la demora no es del SQL en ejecutar la consulta, sino en generar el resultado, es decir en el servidor 1

Porque no generar un archivo csv, y en vez de enviarlo por correo lo pones para descargar desde la web? generar un archivo con 22000 lineas, no tarda nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Grabado de Query SQL a Excel via PHP

Publicado por Teo (3 intervenciones) el 25/11/2015 15:26:15
Estimado,

Gracias por tu respuesta,

Paso a mostrarte mi porción de código, tome ejemplos de código que vi por Internet.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
include '../php/config.php';
$start = microtime(true);
$query = " Consulta... ";
 
$data = '';
$row_lista=odbc_exec($con, $query);
while(odbc_fetch_row($row_lista))
{
    $registro = '';
    for($i=1;$i<=odbc_num_fields($row_lista);$i++) {
        $valor = odbc_result($row_lista,$i);
        if(!isset($valor) || $valor == "")  {
            $valor = ";"; //En este caso, ";" Separa columnas
        } else {
            $valor = str_replace('"', '""', $valor);
            $valor = '"' . $valor . '"' . ";"; //Si cambia el separador antes, cambia este ";" tambien
        }
        $registro .= $valor;
    }
    $data .= trim($registro)."\n";
}
 
//Evitando problemas con datos que contenga retornos "\r"
$data = str_replace("\r", "", $data);
 
//Por si no hay nada..
if ($data == "") {
    $data = "\nNo se encontraron registros\n";
}
 
$header = "Certificado;Terminal;Terminal Fecha;Tipo Ingreso;Vendido;Existente;Correcto;Verificar;Conciliaciado;Solicitado;Inconsistente;Repetido;Anulado;Con cambios;Cambios observacion;CTM Fecha Ingreso;CTM Terminal;CTM Operacion;CTM Medio Ingreso;CTM Observaciones;";
 
//Descarga archivo CSV con historial de certificaciones
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=CON191015103829.csv");
header("Pragma: no-cache");
header("Expires: 0");
$end = microtime(true);
echo ($end - $start)." segundos\n";
echo $header."\n".$data."\n";

Con 27.300 registros aprox., demoro entre 10 y 12segs y el archivo final resulto en 3mb.
Hasta ahora es el mejor resultado, también tener en cuenta que cambie la forma de procesar lo que recibo, prácticamente cargue la variable y grabe directamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Grabado de Query SQL a Excel via PHP

Publicado por xve (6935 intervenciones) el 25/11/2015 21:42:15
Hola Teo encuentro exagerado que con 27000 registros tarde 10 segundos... o la maquina es muy lenta, o no hay ningún índice... Nosotros movemos millones de registros en menos de un segundo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Grabado de Query SQL a Excel via PHP

Publicado por Teo (3 intervenciones) el 26/11/2015 17:15:04
Ahí chequeo los indices,
como se agregaron columnas, por ahí me salte el indice de esas nuevas columnas.

la consulta es algo asi
1
2
3
4
5
6
7
8
9
SET NOCOUNT ON;
SELECT
  CO.*
 ,C.A ,C.B ,C.C ,C.D ,C.E
 FROM [base].[dbo].[TablaA] CO
 LEFT JOIN [base].[dbo].[TablaB] C ON C.NRO = CO.NRO
 WHERE CO.ID = 'CODIGO'
 ORDER BY CO.A DESC, CO.B DESC, CO.D DESC;
SET NOCOUNT OFF

El indice en tablaA CO.ID existe, pero me demora igual,
Siguiendo el plan, pierdo el 58% en el join, aunque la tablaB tambien tiene indices por C.NRO..

Algun consejo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar