Foros del Web » Programando para Internet » PHP »

PHP OO Problemas al generar un log en txt (doble log)

Estas en el tema de Problemas al generar un log en txt (doble log) en el foro de PHP en Foros del Web. Buenas, estoy teniendo un problema muy raro. Estoy haciendo un generador de caminos aleatorios. Tengo una clase mapa, que tiene una grilla donde guardo el ...
  #1 (permalink)  
Antiguo 16/05/2011, 13:08
 
Fecha de Ingreso: septiembre-2008
Mensajes: 148
Antigüedad: 15 años, 7 meses
Puntos: 10
Problemas al generar un log en txt (doble log)

Buenas, estoy teniendo un problema muy raro. Estoy haciendo un generador de caminos aleatorios. Tengo una clase mapa, que tiene una grilla donde guardo el nombre del tile que corresponde a la posicion x,y. Luego genero una imagen con GD usando la grilla y la muestro en la pagina (en realidad la salida del php es la imagen). A raiz de unos problemitas que tenia al realizar el camino (aunque no viene al caso, me esta generando caminos rectos a pesar de a nivel logico colocar curvas). Asi que decidi a modo de debuggin hacer un log de lo que hace el codigo. En resumen tengo lo siguiente:

Código PHP:
Ver original
  1. <?
  2. class Mapa{
  3. //atributos varios
  4. function Mapa($_ancho,$_alto){//el constructor
  5.     Global $c;
  6.     $c++;
  7.     $this->logFile=fopen('Log-'.date("ydm").'-'.date("His").'.txt','a+');
  8.     fwrite($this->logFile,$c.'function Mapa($,$) on line 22'.chr(13).chr(10));
  9.     $this->ancho=$_ancho;
  10.     $this->alto=$_alto;
  11.     $this->inicializarGrilla();//No llama ninguna otra función
  12.     $this->crearCaminos();//Llama varias subfunciones...
  13.     fclose($this->logFile);
  14.     $this->pintarMapa(false);//Lee la grilla y construye una imagen png y la devuelve con header('Content-Type: image/png');
  15. }
  16. //los demás métodos
  17. }
  18. //fuera de la clase
  19. $c=0;
  20. $mapa=new Mapa(8,8);
  21. ?>

El problema es que me genera 2 logs (bien en un mismo archivo o en dos archivos):
1function Mapa($,$) on line 22
function inicializarGrilla() on line 24
function determinarEntrada() on line 22
Entrada: f7-c5 Orientación:90
1function Mapa($,$) on line 22
function inicializarGrilla() on line 24
function determinarEntrada() on line 22
Entrada: f0-c3 Orientación:270

Cuando me lo genera en dos archivos la diferencia es que el nombre de uno lleva el segundo 16 por ejemplo y el del otro el segundo 17.

Si comento la llamada al método pintarMapa() no sucede ese problema... pero pintarMapa simplemente lee de la grilla... y como se ve el archivo ya fue cerrado antes de la llamada a dicho método... no entiendo como puede afectar ese método a la generación de log.

Por cierto... el 1 al principio del log es la variable $c, que es global pero como se ve en el log... para el segundo log no se ha incrementado... es como si yo cargara la pagina 2 veces... sin embargo al momento de ver la imagen veo la correspondiente al primero log... el segundo log es como un log fantasma (que cuando me los crea en dos archivos, es el segundo archivo). Así que no es que yo recargue la pagina dos veces... de ser así, la imagen se correspondería con el segundo log y no con el primero.

Alguna sugerencia?
  #2 (permalink)  
Antiguo 16/05/2011, 13:40
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas al generar un log en txt (doble log)

Aquí el problema es que de algún modo estas ejecutando dos veces el método para guardar el log, así que mientras no detectes donde haces eso por mas código que muestres no va a ser posible ayudarte.

Simplemente has debug, según veo solo ejecutas lo del log aquí, pero... ¿seguro que es el único sitio donde lo haces?

Estoy casi seguro de que estás omitiendo algo, que a simple vista es difícil de saber.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 16/05/2011, 14:51
 
Fecha de Ingreso: septiembre-2008
Mensajes: 148
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: Problemas al generar un log en txt (doble log)

Es un solo archivo PHP, no hay includes ni nada por el estilo, lo que ves es como empieza y como termina, lo del medio que no esta son los métodos que se usan en el constructor, pero el único método que provoca el "fallo" es el pintarMapa.

Como determine eso? Lo que hice fue comentar todas las lineas del constructor (es decir Mapa($,$)), salvo obviamente las que corresponden a la apertura, escritura y cierre del archivo en ESE método (en otros métodos solo escribo una linea que indica que método se ejecuto).

Luego a medida que descomentaba cada linea hacia una carga de la pagina. Ninguno de los otros métodos genera un doble log. Solo el método de pintarMapa(), pero veras que el método pintarMapa() se ejecuta luego de cerrar el archivo. Esto lo remarco por que olvide comentar que agregue la posibilidad de guardar la imagen como archivo o simplemente mostrarla. De haber dos ejecuciones del código implicaría que se generaran 2 imágenes para los respectivos logs. Pero no ocurre esto... solo se genera una imagen. Es decir que:

Código PHP:
Ver original
  1. <?
  2.     class Mapa{
  3.     //atributos varios
  4.     function Mapa($_ancho,$_alto){//el constructor
  5.         Global $c;
  6.         $c++;
  7.         $this->logFile=fopen('Log-'.date("ydm").'-'.date("His").'.txt','a+');
  8.         fwrite($this->logFile,$c.'function Mapa($,$) on line 22'.chr(13).chr(10));
  9.         $this->ancho=$_ancho;
  10.         $this->alto=$_alto;
  11.         $this->inicializarGrilla();//No llama ninguna otra función
  12.         $this->crearCaminos();//Llama varias subfunciones...
  13.         fclose($this->logFile);
  14.         //$this->pintarMapa(false);// NOTAR QUE ESTA COMENTADA
  15.     }
  16.     //los demás métodos
  17.     }
  18.     //fuera de la clase
  19.     $c=0;
  20.     $mapa=new Mapa(8,8);
  21.     ?>
Si ejecuto el codigo con la linea del pintarMapa() comentado todo lo anterior se ejecuta una vez.
Si lo ejecuto sin comentarlo. Se crean dos "logs", y el primero corresponde a la única imagen generada.
Casi es como si no tuviera sentido lo que digo, si tienes alguna sugerencia de como detectar el error soy todo ojos... lo que si, soy novato en php, hice lo del log por que no se como obtener un reporte o un debug linea a linea en php, eso es posible? como lo hago? o a que te refieres con que simplemente haga un debug?
  #4 (permalink)  
Antiguo 16/05/2011, 14:56
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas al generar un log en txt (doble log)

Pues de hecho no hacía falta que repitieras lo que es bastante claro, lo que si me sigue intrigando ya que van dos veces que lo mencionas.

¿Quieres mostrar tal cual el método de pintarMapa()?

Si dices que por ahí va el tiro entonces muestra lo que tienes, no tiene sentido que nos hables de dicho método y no muestres nada.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 16/05/2011, 19:16
 
Fecha de Ingreso: septiembre-2008
Mensajes: 148
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: Problemas al generar un log en txt (doble log)

Si, lo muestro... pero veras que no tiene nada raro que afecte la generación del log.

Código PHP:
Ver original
  1. function pintarMapa($guardar){
  2.     $tile=imagecreatefrompng("tierra0.png");
  3.     $map=imagecreatetruecolor($this->ancho*imagesx($tile),$this->alto*imagesy($tile));
  4.      
  5.     for($col=0;$col<$this->alto;$col++)
  6.         for($fil=0;$fil<$this->ancho;$fil++){
  7.             if($this->grilla[$fil][$col]['tipo']=='tierra'){
  8.                 $tile=imagecreatefrompng($this->grilla[$fil][$col]['tipo'].rand(0,9).".png");
  9.                 $tile=imagerotate($tile,rand(0,3)*90,0);
  10.             }
  11.             else if($this->grilla[$fil][$col]['tipo']=='cruce')
  12.                 $tile=imagecreatefrompng($this->grilla[$fil][$col]['tipo'].".png");
  13.             else
  14.                 $tile=imagecreatefrompng($this->grilla[$fil][$col]['tipo'].$this->grilla[$fil][$col]['orientacion'].".png");
  15.             imagecopyresampled( //Copia del origen y la pega en el destino
  16.                 $map, //Imagen destino, donde se pega
  17.                 $tile, //Imagen origen, a copiar o parte de ella
  18.                 $col*imagesx($tile), //Origen x del rectangulo a pegar de la imagen destino
  19.                 $fil*imagesy($tile), //Origen y del rectangulo a pegar de la imagen destino
  20.                 0, //Origen x del rectangulo a copiar de la imagen origen
  21.                 0, //Origen y del rectangulo a copiar de la imagen origen
  22.                 imagesx($tile), //Ancho del rectangulo a pegar en la imagen destino
  23.                 imagesy($tile), //Alto del rectangulo a pegar en la imagen destino
  24.                 imagesx($tile), //Ancho del rectangulo a copiar de la imagen origen
  25.                 imagesy($tile) //Alto del rectangulo a copiar de la imagen origen
  26.             );
  27.             //imagefttext($map, 12, 0, $col*imagesx($tile), $fil*imagesy($tile)+15, 0, 'linuxbolium.ttf', $this->grilla[$fil][$col]['tipo'].'-'.$this->grilla[$fil][$col]['orientacion']);
  28.         }
  29.     if($guardar==true)
  30.         imagepng($map, "salida".alfanumerico(8).".png");// Damos salida a la imagen final a un archivo
  31.     else{
  32.         header('Content-Type: image/png');
  33.         imagepng($map);
  34.     }
  35.     // Destruimos las imágenes
  36.     imagedestroy($map);
  37.     imagedestroy($tile);
  38. }

Yo se que puede parecer redundante mis explicaciones... pero es que simplemente no tiene sentido. Es como si existiese un bug al crear un archivo de imagen con gd luego de haber creado un archivo de texto con las funciones file.
  #6 (permalink)  
Antiguo 16/05/2011, 20:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Problemas al generar un log en txt (doble log)

Ejecuta tu código desde la consola (aunque te genere el código en pantalla) y verifica, si te genera los mismos resultados, es muy probable que tu browser este aplicando algún tipo de prefetching.

Saludos.
  #7 (permalink)  
Antiguo 16/05/2011, 20:12
 
Fecha de Ingreso: septiembre-2008
Mensajes: 148
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: Problemas al generar un log en txt (doble log)

Me hablaste en chino basico, solo se ingles y castellano :P, no en serio, no entendi ni lo de ejecutar el codigo en consola ni lo de prefetching, soy novato.

Pero encontre el problema...
Código PHP:
Ver original
  1. <?
  2. function caracteresAleatorios($caracteres,$length){
  3.     $randhexa='';
  4.     for($i=0;$i<$length;$i++)
  5.         $randhexa = $randhexa.substr($caracteres,rand(0,strlen($caracteres)-1),1);
  6.     return $randhexa;
  7. }
  8.  
  9. function alfanumerico($length){
  10.     $alfanumerico='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  11.     return caracteresAleatorios($alfanumerico,$length);
  12. }
  13.  
  14. class Clase{
  15.     var $cad;
  16.     function Clase(){
  17.         $this->cad=alfanumerico(5);
  18.         $file=fopen('algo'.$this->cad.'.txt','a+');
  19.         for($i=1;$i<10;$i++)
  20.             fwrite($file,'Linea '.$i.chr(13).chr(10));
  21.         fclose($file);
  22.         $this->crearImagen();
  23.     }
  24.     function crearImagen(){
  25.         $img=imagecreatetruecolor(100,100);
  26.         imagepng($img, "salida".$this->cad.".png");
  27.         //header('Content-Type: image/png');
  28.         imagepng($img);
  29.         imagedestroy($img);
  30.     }
  31. }
  32. $c=new Clase();
  33. ?>

Si prueban esto y le descomentan la linea del header() resulta que en el log pone linea del 1 al 9 y luego repite de nuevo... lo mismo que me sucede en mi otro php. En el otro php al tener datos random (hay una celda distinta de las demás) se verifica que la imagen solo se crea una vez, y que el primer log es el que le corresponde, en este caso no, por que la imagen es negra y el log muy genérico.

EDITADO:
si modifican $this->cad=alfanumerico(5).date('His'); crea 2 logs y 2 imagenes...

EDITADO2:
No es un bug...
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.

Última edición por LhaN; 16/05/2011 a las 20:21
  #8 (permalink)  
Antiguo 16/05/2011, 22:02
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas al generar un log en txt (doble log)

Bingo!

Oda al RTFM

Y es verdad, nadie se hubiera imaginado eso, hasta que se lee con atención.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Etiquetas: doble, log, txt
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:06.