Foros del Web » Programando para Internet » PHP »

Problema. "Headers Already Sent"

Estas en el tema de Problema. "Headers Already Sent" en el foro de PHP en Foros del Web. Tengo un script para redimensionar imágenes (tal vez le sirva a alguien para reutilizar) con imagemagick pero de repente me ha empezado a dar error ...
  #1 (permalink)  
Antiguo 17/05/2012, 11:02
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Problema. "Headers Already Sent"

Tengo un script para redimensionar imágenes (tal vez le sirva a alguien para reutilizar) con imagemagick pero de repente me ha empezado a dar error de que las cabeceras ya han sido enviadas, cuando antes no lo hacía. ¿alguna idea? No se que hay mal.

Código PHP:
<?php
    
//VARIABLES
    
$rutaImagick "/ruta/a/mi/imagick6.7/bin";
    
$imagen $_GET["i"];
    
$ancho 0;
    
$alto 0;
    
$color white;
    if (isset(
$_GET["an"])) {$ancho $_GET["an"];}
    if (isset(
$_GET["al"])) {$alto $_GET["al"];}
    
//preparamos nombre de la imagen
    
$extension pathinfo($imagenPATHINFO_EXTENSION); //separamos extension (útil si más adelante queremos conservar extensión original del archivo
    
$nombreBase basename($imagen'.'.$extension); //separamos nombre base
    
$nombreImagen "RE." "$nombreBase$ancho" "ANx" "$alto" "AL" ".jpg"//todas las imágenes se convierten a jpg
    
if (file_exists($nombreImagen)) //Si existe no convertimos, mostramos directamente
    
{
        
Header("Content-Type: image/jpeg");
        
readfile($nombreImagen);
    }
    else
    {
        if (
$ancho!=&& $alto==0//Si no tiene alto o es 0 es que la imagen se reduce a proporción
        
{
            
$conversion "$rutaImagick/convert -quality 90% $imagen";
            
exec("$rutaImagick/convert $conversion -scale $ancho $nombreImagen");
            
Header("Content-Type: image/jpeg"); // se envia la cabecera...
            
readfile($nombreImagen);
        }
        else if(
$ancho==&& $alto!=0//Si sólo tiene definido el alto
        
{
            
$medida "x" $alto;
            
$conversion "$rutaImagick/convert -quality 90% $imagen";
            
exec("$rutaImagick/convert $conversion -scale $medida $nombreImagen");
            
Header("Content-Type: image/jpeg"); // se envia la cabecera...
            
readfile($nombreImagen);
        }
        else 
//ninguno de los 2 es 0. Se pone la imagen al tamaño exacto deseado rellenando espacios vacíos con el color seleccionado
        
{
            
$medida $ancho "x" $alto;
            
//exec("convert $imagen -resize $medida -background $color -compose Copy -gravity center -extent $medida $nombreImagen");
            //CODIGO FUNCIONANDO BIEN POR CONSOLA:  convert tal.jpg -resize 300x50 -background white -gravity center -extent 300x50 output.jpg        
            
$conversion "$rutaImagick/convert -quality 90% $imagen";
            
$conversion "$rutaImagick/convert $conversion -scale $ancho $nombreImagen"//reducimos antes a escala
            
exec("$rutaImagick/convert $conversion -scale $medida -background $color -gravity center -extent $medida $nombreImagen");
            
Header("Content-Type: image/jpeg"); // se envia la cabecera...
            
readfile("$nombreImagen");
        }
    }
?>
Hay algunas cosas raras a la hora de convertir porque al tener tan poca memoria tengo muchos problemas con imágenes grandes, y lo estoy intentando solucionar, pero es que ahora ni si quiera puedo ver ninguna imagen por el citado error. ¿Veis algo raro?

Gracias!

En ninguno de los 3 casos me funciona, tanto si envío sólo el ancho, como si envío el alto como si envío ambas cosas. Lo intento ver desde la url del archivo pasandole por URL los parámetros deseados, el tema es que antes me funcionaba. No lo entiendo.

Olvidaba el error, que es este:
Código:
Warning: Cannot modify header information - headers already sent by (output started at /homepages/39/d296597816/htdocs/admin/uploads/redimensionador.php:1) in /homepages/39/d296597816/htdocs/admin/uploads/redimensionador.php on line 26
En la 26 o en la que esté el "header" es la línea que me marca.

Última edición por alyciashape; 17/05/2012 a las 11:12
  #2 (permalink)  
Antiguo 17/05/2012, 11:32
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 13 años
Puntos: 160
Respuesta: Problema. "Headers Already Sent"

En realidad no es un error, es un warning que es todo lo contrario, pero si lees lo que dice es que no podes enviar nada por pantalla antes de invocar al header() y vos estas haciendo un exec() antes.. fijate si le encontras la vuelta por ahi...
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #3 (permalink)  
Antiguo 17/05/2012, 11:36
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Problema. "Headers Already Sent"

De hecho el mismo error te lo dice, la salida empezó en la línea 1, verifica que tu archivo este codificado como UTF-8 sin BOM, o que no tengas ninguna salida de texto antes de la etiqueta de apertura <?php.

Saludos.
  #4 (permalink)  
Antiguo 17/05/2012, 11:36
 
Fecha de Ingreso: mayo-2012
Mensajes: 61
Antigüedad: 12 años, 6 meses
Puntos: 23
Respuesta: Problema. "Headers Already Sent"

el error headers already sent se produce cuando tratas de enviar información al cliente, después de enviarse ya información.

la función exec envia datos al cliente, por lo que no puedes ejecutar un header después..

Saludos!

EDITO:

No.. no es por exec, acabo de probarlo..
Por otro lado he probado tu script y me funciona.

Trata de ver como comentan arriba, la codificación de los ficheros

Saludos!

Última edición por pfranco; 17/05/2012 a las 11:51
  #5 (permalink)  
Antiguo 17/05/2012, 12:01
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: Problema. "Headers Already Sent"

Gracias a todos por los consejos,

El fichero lo abro así tal cual pasando imagen, ancho y alto desde la url. No llamo a este fichero desde ninguna otra página si no que la uso directamente. Creo que empezó a fallar desde que un compañero me cambió el fichero de carpeta. No se si eso tendrá algo que ver?
  #6 (permalink)  
Antiguo 17/05/2012, 12:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Problema. "Headers Already Sent"

Revisa lo que te digo, abre el archivo y verifica que no tenga el BOM porque eso hace que se envíen cabeceras antes de que se procese el header.
  #7 (permalink)  
Antiguo 17/05/2012, 19:40
 
Fecha de Ingreso: abril-2010
Ubicación: Saltillo Mexico
Mensajes: 83
Antigüedad: 14 años, 7 meses
Puntos: 4
Respuesta: Problema. "Headers Already Sent"

intenta poner en la primer linea:

Código PHP:
ob_start(); 
y en la ultima linea:

Código PHP:
ob_end_flush(); 
  #8 (permalink)  
Antiguo 18/05/2012, 07:02
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: Problema. "Headers Already Sent"

Creo que ha sido lo del "BOM" que ha comentado el compañero. Tras leer por la web pues he intentado eliminar esos caracteres invisibles pero me ha resultado imposible. No se como encontrarlos.

Yo estoy utilizando notepad++ para hacer la web. Me gusta que sólo me coloree el texto y punto. ¿Es posible que aún así no pueda ver esos caracteres? No se como puedo saber si están ahí o no.

El tema es que antes no daba ningún problema, fué desde que mi compañero le metió mano, creo que el entró en el fichero, cambió algo para ver si le funcionaba, y su editor probablemente añadió el BOM (aunque admito que aun no me enteré muy bien del tema del BOM).

Para solucionarlo copié el texto y pegué en un fichero nuevo y adios problema. Pero claro, quisiera saber como eliminar el BOM de un fichero porque no logro descubrir como.

¡Gracias a todos!
No se si lo de ob_start me funcionaría, no lo he probado aún, pero me lo apunto en la lista de cosas para aprender, porque no conocía esa instrucción.


PD: aprovecho para preguntar, si quiero acceder a algo que está 2 directorios antes es correcto ../../archivo.php ?

Última edición por alyciashape; 18/05/2012 a las 07:35
  #9 (permalink)  
Antiguo 18/05/2012, 10:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Problema. "Headers Already Sent"

Es sencillo, en el Notepad++ selecciona el menu de Encoding -> UTF-8 without BOM y listo.

Saludos.

Etiquetas: headers, variables
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:58.