Foros del Web » Programando para Internet » PHP »

ob_flush()

Estas en el tema de ob_flush() en el foro de PHP en Foros del Web. Ejecuto una consulta Select que me devuelve un número alto de registros... por lo que el script que lo maneja no termina de ejecutarse completamente ...
  #1 (permalink)  
Antiguo 04/03/2003, 06:43
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
ob_flush()

Ejecuto una consulta Select que me devuelve un número alto de registros... por lo que el script que lo maneja no termina de ejecutarse completamente con todos los registros que devuelve mi consulta select.

Por tanto, hice uso de la instrucción PHP ob_flush() . Pero no consigo que se recorra completamente el bucle que trata cada uno de los registros devueltos.

Mi base de datos es Informix y la tabla sobre la que ejecuto la consulta contiene campos Blob. ¿Por qué comento esto? pues porque he probado a no meter en la consulta los campos de este tipo y mi script va muy bien, pero en el momento que le añado a la consulta los campos Blob, vuelve a no ejecutarse compeltamente mi script, quedándose colgado mi navegador.

No se si es que no hago un buen uso de ob_flush(), o es que una página HTML tienen límite de caracteres a mostrar en el navegador (porque imprimo bastantes datos por pantalla) o bien los campos blob es demasiado para el servidor.

¿alguna sugerencia?

Muchas gracias

Un beso
  #2 (permalink)  
Antiguo 04/03/2003, 06:47
Avatar de Cain  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 6.459
Antigüedad: 22 años, 3 meses
Puntos: 17
A mi me pasó lo mismo (con MySQL y sin ob_flush()) cuando intentaba que Javascript procesará un código generado a partir de PHP.

Lo que ocurría era, simplemente, que el código generado era demasiado largo para que Javascript lo interpretara, así que tuve que cambiar el sistema de procesar los datos.
__________________
M a l d i t o F r i k i
  #3 (permalink)  
Antiguo 04/03/2003, 07:02
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Y el código JavaScript se interpreta en el cliente por el navegador que es a lo que me refería cuando dije que el navegador tenía un límite.

Pero es curioso, porque incluso he reducido de forma considerable el texto a mostrar por pantalla... y sigue insertándome en la base de datos el mismo número de registros.

¿Alguien podría decir algo más al respecto?

Un beso

P.D.: Gracias Cain por responder tan rápido
  #4 (permalink)  
Antiguo 04/03/2003, 08:09
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
PHP tinene "time-out" (tiempo de ejecución maximo) para una aplicación ..

Por defecto suele estar a 30 segundos .. lo puedes ajustar en tiempo de ejecución con la función set_time_limit(0); al principio de tus scripts q hagan un proceso q le pueda llevar cierto tiempo ...

Eso puede ser una causa de que el proceso no termine en su totalidad ...

Un saludo,
  #5 (permalink)  
Antiguo 04/03/2003, 10:13
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
:cantar:


Tas lucio, chaval!!! Funcionó perfectamente.

Un besazo
  #6 (permalink)  
Antiguo 04/03/2003, 10:35
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Falsa alarma

Lo probé sin acordarme que le había quitado campos en la consulta... Cuando se los he vuelto a poner... volvió a fallar incluso se sigue parando la ejecución en el mismo punto... siempre me inserta el mismo número de registros.

Conforme le voy quitando campos blob me va insertando un mayor número de registros hasta que le quito los suficientes como para que se ejecute completamente el código.

O sea, que no es eso lo que ocurre. No se trata del tiempo de ejecución del script.

Snif!!

Gracias por el intento.

Beshitos
  #7 (permalink)  
Antiguo 04/03/2003, 11:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Podrías poner el código que usas .. todavia no me queda claro si haces solo un SELECT q te aroja bastantes datos .. o si con eso vas haciendo un "insert" por ahi .. o ahí se queda la cosa ..

El caso q en tu php.ini (si tienes acceso al servidor) tienes estas directivas ..

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30 ; Maximum execution time of each script, in seconds
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data (esto es en PHP 4.3.0 en adelante
memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)

El max_execution_time .. si es sobrepasado se te informa con un mensajito de PHP .. (igual si se produce pero no lo ves por tener desactivado q PHP te muestre mensajes de error ..).

Que versión de PHP usas y en que servidor (osese; tuyo tu PC .. o un servicio de hosting, en tal caso de pago o gratuito) .???

Un saludo,
  #8 (permalink)  
Antiguo 04/03/2003, 12:03
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Lo del php.ini ya lo modifiqué y sigue igual... está todo ilimitado... y nada..

Podría poner mi código pero un poco largo. :prohibido

Mi script consiste en pasar los datos de una base de datos, por tanto lo que hago es un select en la origen y voy insertando uno a uno los registros devueltos por este select en la bd destino. Uno a uno porque algunos campos necesitan un tratamiento especial como son los de tipo fecha, caracteres especiales en los de tipo varchar y los de tipo blob que son los que me están dando problemas ahora.

No me propongais alternativas para hacerlo desde la consola de informix, porque no se puede.. Es mas complejo de lo que parece, ya que la bd destino los nombres de los campos son ditintos, puede no tener alguno de la de origen e incluso la clave primaria cambia de tipo de dato, pero todo esto lo controla mi script, así que no nos salgamos de la cuestión.

Mi script es correcto ya que los registros anteriores que si logra ejecutar se actualizan perfectamente.

Muchas gracias
  #9 (permalink)  
Antiguo 04/03/2003, 12:07
Avatar de Cain  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 6.459
Antigüedad: 22 años, 3 meses
Puntos: 17
La alternativa que sí podrías considerar es la de partir el script en 2 (o en 3)

En lugar de procesar toda la base de datos de una tacada, hacerlo por pasos, para asegurarte que no se satura el sistema.
__________________
M a l d i t o F r i k i
  #10 (permalink)  
Antiguo 04/03/2003, 12:23
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Es justo lo que iba a empezar a probar... paginar la consulta.

Pensé que quizás si cierro la conexión a la base de datos, la liberaria de peso o algo así.

Pero claro, en informix la paginación da problemillas , lo sé porque una vez tuve que paginar una pagina web dinámica con acceso a informix y me daba problemas la función de ifx_fetchrow() para recoger un registro del medio....

Cruzaré los dedos.

Supongo que si hago un ifx_close(), el result tb lo pierdo.. no?


Un beso
  #11 (permalink)  
Antiguo 06/03/2003, 10:38
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5


He paginado la consulta y nada... Ocurre lo mismo..
He aumentado el Timeout del apache y tampoco....



¿Nadie tiene idea de porque ocurre? Tan limitado es?... Solo son 460 inserciones....

snif!
  #12 (permalink)  
Antiguo 06/03/2003, 10:40
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Y a Dios pongo por testigo que cierro todo lo que puedo...

ifx_free_result($result)

  #13 (permalink)  
Antiguo 06/03/2003, 11:25
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Otro apunte mas que no se si podria influir...

Cada insert que realizo lo guardo en un archivo de log, no se si el abrir el archivo cada vez que quiera insertar una linea también satura en exceso el servidor.

Un beso
  #14 (permalink)  
Antiguo 06/03/2003, 11:31
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Pues no.. no es eso.. porque le he quitado la opción de que me vaya creando un archivo de log y sigue quedándose en el mismo registro.

También he probado a ejecutar sólo ese registro que no llega a insertarse pero no da ningún problema, ni desde el script php ni desde la consola de informix. snif!


Esto empieza a parecer un monólogo
  #15 (permalink)  
Antiguo 06/03/2003, 11:43
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
A ver... puedes pegar el código que esta dando el problema?

__________________
Manoloweb
  #16 (permalink)  
Antiguo 06/03/2003, 11:48
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Avisé que era largo.

$consulta_count="select count(*) AS num_reg from ag_flamenco";
$consultaInicial="select FIRST ".global_PAG." cod_tipo, cod_via, cod_mun, nombre_actfla, descrip_actfla, fechaini_actfla,fechafin_actfla,periodo_actfla, direccion_actfla, numero_actfla, masdir_actfla, cp_actfla, telefono_actfla, fax_actfla, email_actfla, url_actfla, engperiodo_actfla, freperiodo_actfla, gerperiodo_actfla, japperiodo_actfla, engdescrip_actfla, fredescrip_actfla, gerdescrip_actfla, japdescrip_actfla, engmasdir_actfla, fremasdir_actfla, germasdir_actfla, japmasdir_actfla, engnombre_actfla, frenombre_actfla, gernombre_actfla, japnombre_actfla, rowid from ag_flamenco";// ORDER BY rowid";
$nom_tabla="agenda";
//$campos_insert="fk_tact_fla, fk_via, fk_mun, nombre_act, descrip_act, fechaini_act, fechafin_act, periodo_act, direccion_act, numero_act, masdir_act, cp_act, tlf1_act, fax_act, email1_act, url_act, coment_act, engperiodo_act, freperiodo_act, gerperiodo_act, japperiodo_act, engdescrip_act, fredescrip_act, gerdescrip_act, japdescrip_act, engcoment_act, frecoment_act, japcoment_act, gercoment_act, engmasdir_act, fremasdir_act, germasdir_act, japmasdir_act, engnombre_act, frenombre_act, gernombre_act, japnombre_act";
$campos_insert="fk_tact_fla, fk_via, fk_mun, nombre_act, descrip_act, fechaini_act,fechafin_act,periodo_act, direccion_act, numero_act, masdir_act, cp_act, tlf1_act, fax_act, email1_act, url_act, engperiodo_act, freperiodo_act, gerperiodo_act, japperiodo_act, engdescrip_act, fredescrip_act, gerdescrip_act, japdescrip_act, engmasdir_act, fremasdir_act, germasdir_act, japmasdir_act, engnombre_act, frenombre_act, gernombre_act, japnombre_act";
$pk_nueva ="pk_act";
$fk_antigua="cod_tipo";
$nombreFichero="tipo_act_fla.txt";
$camposBlob="descrip_actfla,engdescrip_actfla,fred escrip_actfla,gerdescrip_actfla,japdescrip_actfla" ;
$camposFecha="fechaini_actfla,fechafin_actfla";

function importaDatosConArray($consulta_count,$consultaInic ial,$nom_tabla,$campos_insert,$pk_nueva,$fk_antigu a,$nombreFichero,$camposBlob,$camposFecha) {
// $LOGFILE="log/".$nom_tabla.".log";
$TXTFILE="relacionTablas/".$nombreFichero;
if ( !($camposBlob == "") ) {
$camposBlob = str_replace ( ", ", ", ", $camposBlob);
//Array con los nombres de los campos tipo blob de la tabla antigua
$arrayBlob = explode (', ', $camposBlob);
}

if ( !($camposFecha == "") ) {
$camposFecha = str_replace ( ", ", ", ", $camposFecha);
//Array con los nombres de los campos que contienen una fecha (aaaa-mm-dd) de la tabla antigua
$arrayFecha = explode (', ', $camposFecha);
}

//Array asociativo que almacenará la correspondencia entre tipos y tipo_act_tur
$myArray = fichero2Array ($TXTFILE);

//Inicializamos puntero de consultas
$fila=0;
//Almacena el número de inserciones que no han dado error
$num_rows_insert=0;

//Conexión con la BD
$conn=pg_pconnect_("host='".global_DBSERVER."' port='5432' user='".global_DBUSER."' password='".global_DBPASSWD."' dbname='".global_DBNAME."'");
$conn_turismo=pg_pconnect2_("host='".global_DBSERV ER."' port='5432' user='".global_DBUSER."' password='".global_DBPASSWD."' dbname='".global_DBNAMETURISMO."'", "dbturismo");

$result_count=pg_exec_($conn,$consulta_count);
if( !$result_count )
{
print("<br>No se ha podido calcular el numero de registros<BR>\n");

//print Informix error message
print("<br>".ifx_error() . "<BR>\n");
print("<br>".ifx_errormsg() . "<BR>\n");
print("-------------------------------------------------------------------------<br>");
} else {
$row=pg_Fetch_Array_($result_count,$fila);
$num_rows=(int)$row["num_reg"];
}
echo "<br>".$num_rows." registros a ejecutar";
ifx_free_result($result_count);

/*
$types = ifx_fieldtypes ($result);
if (! isset ($types)) {
echo "ERROR en la consulta de tipos<br>";
}
for ($i=0; $i<count($types); $i++) {
$fname = key($types);
printf("%s : type = %s<br>\n", $fname, $types[$fname]);
next($types);
}
*/

ifx_textasvarchar(1);
$inicio=1;
while ($num_rows>0) {
if ($inicio==1) { // Es la primera consulta que ejecutamos
$consulta=$consultaInicial." ORDER BY rowid";
$inicio=0;
} else {
$consulta=$consultaInicial." WHERE rowid>".$row_id." ORDER BY rowid";
}
echo "<br>".$consulta;
$result=pg_exec_($conn,$consulta);

while( $row=pg_Fetch_Array_($result,$fila) ) {
$row_id=$row["rowid"];
echo "<br><br>".$row_id." fila";
//iniciamos la sentencia INSERT
$sentenciaINSERT = "INSERT INTO ".$nom_tabla." (".$campos_insert.") VALUES (";
//recorremos los campos de la consulta SELECT y añadimos su valores a la sentencia INSERT
for(reset($row); $fieldname=key($row); next($row)) {
$fieldvalue=$row[$fieldname];
if ( !($fieldname == "rowid") ) {
if ( !($fieldname == $fk_antigua) ) {
if( !(enArray($arrayBlob,$fieldname)) ) {
if( !enArray($arrayFecha,$fieldname) ) {
$fieldvalue=addslashes(htmlentities(trim($fieldval ue)));
$fieldvalue=mysql_escape_string($fieldvalue);
//Caracteres problemáticos en las consultas
$fieldvalue=str_replace("“", "&quot;", $fieldvalue);
$fieldvalue=str_replace("”", "&quot;", $fieldvalue);
$fieldvalue=str_replace("\"", "&quot;", $fieldvalue);
$fieldvalue=str_replace("–", "-", $fieldvalue);
//Construimos la sentencia INSERT INTO
$sentenciaINSERT = $sentenciaINSERT."'".$fieldvalue."', ";
} else {
//Transformamos la cadena fecha 'aaaa-mm-dd' en 'dd/mm/aaaa'
//Toma la fecha en formato ISO (AAAA-MM-DD) y la imprime en formato DD/MM/AAAA
list( $anyo, $mes, $dia ) = split( '[/.-]', $fieldvalue );
if (trim($dia)=="" || trim($mes) =="" || trim($anyo)=="") {
$sentenciaINSERT = $sentenciaINSERT."NULL,";
} else {
$sentenciaINSERT = $sentenciaINSERT."'".trim($dia)."/".trim($mes)."/".trim($anyo)."', ";
}
}
} else {
// crea identificadores de blob para una columna de tipo text y lo almacena en un array de valores blob
$fieldvalue=addslashes(htmlentities(trim($fieldval ue)));
$fieldvalue=mysql_escape_string($fieldvalue);
$fieldvalue=str_replace("“", "&quot;", $fieldvalue);
$fieldvalue=str_replace("”", "&quot;", $fieldvalue);
$fieldvalue=str_replace("\"", "&quot;", $fieldvalue);
$fieldvalue=str_replace("–", "-", $fieldvalue);
$blob[] = ifx_create_blob(0, 0, $fieldvalue);
// seguimos construyendo la consulta
$sentenciaINSERT = $sentenciaINSERT."?, ";
}

} else {
$sentenciaINSERT = $sentenciaINSERT.$myArray["$fieldvalue"].", ";
}
}
}
//suprimimos la última ', '
$sentenciaINSERT = substr($sentenciaINSERT,0,strlen($sentenciaINSERT)-1);
//finalizamos la sentencia INSERT
$sentenciaINSERT = $sentenciaINSERT.");";
//guardamos en el archivo de log la sentencia INSERT que se va a ejecutar
// log_Error($LOGFILE,"$sentenciaINSERT");
//ejecutamos la sentencia INSERT generada
echo "<br>".$num_reg." ".$sentenciaINSERT;
echo "<br>".$row["nombre_actfla"];

// if( !($result_insert = ifx_query($sentenciaINSERT, $conn_turismo)) )
if( !($result_insert = ifx_query($sentenciaINSERT, $conn_turismo, $blob)) )
{
print("<br>No se ha podido insertar un registro<BR>\n");

//print Informix error message
print("<br>".ifx_error() . "<BR>\n");
print("<br>".ifx_errormsg() . "<BR>\n");
print("--------------------------------------------------------------------");
} else {
$num_rows_insert++;
print "Registro insertado";
}
ifx_free_result($result_insert);
$fila++;
$num_rows--;
echo "<br>".$num_rows." filas quedan";
}
ifx_free_result($result);

pg_close_($conn);
pg_close_($conn_turismo);
$conn=pg_pconnect_("host='".global_DBSERVER."' port='5432' user='".global_DBUSER."' password='".global_DBPASSWD."' dbname='".global_DBNAME."'");
$conn_turismo=pg_pconnect2_("host='".global_DBSERV ER."' port='5432' user='".global_DBUSER."' password='".global_DBPASSWD."' dbname='".global_DBNAMETURISMO."'", "dbturismo");

ob_flush();
$fila=0;
}
pg_close_($conn);
pg_close_($conn_turismo);
echo "<br><br>".$num_rows_insert." registros insertados";
}
importaDatosConArray($consulta_count,$consultaInic ial,$nom_tabla,$campos_insert,$pk_nueva,$fk_antigu a,$nombreFichero,$camposBlob,$camposFecha);

Última edición por Helbira; 06/03/2003 a las 11:52
  #17 (permalink)  
Antiguo 06/03/2003, 11:54
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Como no consigo que los tabuladores me los cambie por espacios para que se vea bien... os lo podeis descargar de:

http://www.andalucia.org/peticionConsultasAjena.zip

solo teneis que renombrar la extensión .zip por .php (no es un archivo zip real)

Un beso
  #18 (permalink)  
Antiguo 07/03/2003, 05:04
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5


Bueno, cuento mis últimas comprobaciones...

Lo tengo paginado de 100 en 100 registros. He optado por ejecutar mi script con los 100 primeros... Luego volver a lanzar el script con los siguientes 100, y asi sucesivamente.

Si lo ejecutado completo... sólo me insertaba 115 registros , cual es mi sorpresa al hacerlos por partes que en el segundo grupo de 100 registros que lanzaba sólo me insertaba 15!!! Entonces es de imaginar que lo que puede fallar es un registro concreto y nada de temas de memoria o tiempo de ejecución ni nada de eso. Sino que el fallo podía estar en los datos de mi Base de Datos antigua.

Pues bien, localizo el registro en cuestión, y ejecuto mi script sólo y exclusivamente para ese registro, y resulta que SE INSERTA CORRECTAMENTE :-0

:-p Una vez hecho esto... sigo ejecutando mi script por grupos de 100 en 100 y el tercer grupo.. como la seda, pero al cuarto vuelve a cascar... Repito la operacion insertando sólo en el que se me cuelga y ocurre lo mismo, se inserta bien, no hay problemas en los datos... y sigo ejecutando.

Pero claro, direis... Pues ya tienes la solución.. Pero es que todo esto tendría que hacerlo sólo con una tabla y en total son 97..

snif!

¿Alguna nueva propuesta?

Un beso
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:53.