Pasar valores entre scripts PHP en esta situación particular

Así que en mi marcado HTML tengo una etiqueta de imagen como esta:

<img src="image_generation.php" alt="template" id="image" />

Y el atributo 'src' se vincula a un script PHP que genera una imagen utilizando un par de variables definidas allí, que en su mayoría se generan aleatoriamente.

Ahora, lo que quiero poder hacer es acceder a esas variables aleatorias en la página que incluye el script de generación de imágenes. Supongo que podría enviar cookies y acceder a ellas después de la etiqueta de la imagen, ya que técnicamente deberían estar disponibles para el archivo incluido. No quiero enviar demasiada información, solo un par de variables (10-20). No estoy seguro de si, en ese caso, las sesiones serían una mejor opción, ya que tendría que enviar varias cookies. Las sesiones también plantean un problema ya que el script de inclusión obtiene la sesión anterior y tendría que actualizar la página para obtener los valores de la imagen generada anteriormente. Supongo que también podría configurar una base de datos y acceder a la base de datos en el script incluido, pero las variables son temporales y tendría que eliminarlas y eso me parece mucho alboroto.

El script de generación de imágenes termina con:

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

Y no se puede enviar nada al navegador antes de la llamada de encabezado o, de lo contrario, la imagen no se mostrará. Si utilizo cookies o sesiones, la image_generation.php tendría que enviar la imagen y establecer la(s) cookie(s)/sesión.

Ninguna de las opciones (cookies, sesiones o DB) realmente me convence, ya que hay problemas con cada una en esta situación particular. ¿Puedes pensar en una manera de resolver esto? Gracias.

EDICIÓN PRINCIPAL #1: Incluir el script obtiene una sesión de la imagen generada previamente sin actualizar / Configurar cookies y/o una sesión en el script incluido antes / después de enviar la imagen sin almacenamiento en búfer de salida no representa un problema.

preguntado el 29 de julio de 12 a las 13:07

2 Respuestas

Puedes utilizar una $_SESSION, pero para que la sesión esté disponible en el mismo script que incluía el <img> (que se habría ejecutado antes que la secuencia de comandos de la imagen), necesitaría realizar llamadas AJAX a través de JavaScript. Un controlador AJAX que se ejecuta en window.onload debe tener acceso a la $_SESSION creado por el script de la imagen, ya que la imagen debería haberse cargado completamente cuando se ejecuta.

Ejemplo de controlador de PHP getsession.php:

header('Content-type: application/json');
// Simply part of the session into JSON
// Obviously you would want to limit this to only the variables 
// that should be sent back, so you don't expose the session on the client side!
echo json_encode(array($_SESSION['var1'],$_SESSION['var2']));
exit();

Ejemplo de llamada AJAX (usando jQuery ya que será fácil comenzar)

// Variable to hold the object returned by PHP
var imgPHPSession;
$(window).load(function() {
  $.ajax({
    url: 'getsession.php',
    dataType: 'json',
    success: function(data) {
      imgPHPSession = data;
    }
  });
});

Actualizar:

Se puede hacer completamente en PHP, pero requeriría cambiar un poco su diseño para que las variables necesarias para generar la imagen se creen en $_SESSION por el guión principal. Luego están disponibles en $_SESSION a image_generation.php para ser usado según sea necesario, pero ya son conocidos por el script principal.

Update 2:

Dado que las variables de imagen contienen información sobre cómo fue creada, si la imagen no es demasiado grande, puede crearla en el script principal y almacenarla en el disco. El script image_generation.php todavía se puede usar como el <img src>, pero su propósito sería recuperar la imagen correcta del disco y devolverla al navegador y eliminarla del disco cuando ya no se necesite. Él $_SESSION entonces está disponible tanto para el script principal como para el de imagen.

Respondido 29 Jul 12, 17:07

Esto es excelente, Michael, pero ¿puedes pensar en una forma de usar principalmente PHP? Además de usar una base de datos, por supuesto. - víbora aturdida

@hallaplay835 La única forma en que puedo pensar es configurar los vars en $_SESSION en el script principal y recuperarlos de $_SESSION en el guión de la imagen. - Michael Berkowski

Los vars se establecen en el script de generación de imágenes, no en el script principal porque contienen información sobre CÓMO se generó la imagen aleatoria. El problema es recuperar esos vars del script de generación de imágenes en el script principal (después de la etiqueta img) y mostrarlos, sin tener que actualizar la página. - víbora aturdida

@hallaplay835 ¿La imagen es muy grande? ¿Puede generarlo en el script principal y guardarlo en el disco temporalmente allí? Luego puede usar image_generation.php como src para leerlo desde el disco y generarlo, y luego eliminarlo si ya no lo necesita. - Michael Berkowski

Gracias, eso es lo que haré. Las imágenes tienen un tamaño de 5 KB; si la carga del servidor es demasiado alta, cambiaré al enfoque AJAX. - víbora aturdida

Puede pasar sus parámetros al atributo src, por ejemplo:

<img src="image_generation.php/user/1/name/tom/param1/variable2"

or

<img src="image_generation.php?user=1&name=tom

esta solución le permite olvidarse de la sesión, las cookies: no tiene estado

Php puede hacer trucos inteligentes con el búfer mediante la función ob_*, por lo que al comienzo de su secuencia de comandos puede llamar a ob_start () para almacenar en búfer cada salida de php, lo que le permite evitar todos los errores de 'Encabezado ya enviado'.

Su image_generation.php no necesita enviar ninguna cookie. Este script recibirá una cookie con sessionid (el navegador adjunta información de cookies a cada solicitud al servidor) lo que hace posible identificar la sesión del usuario en el lado de php; después de eso, tiene acceso a todos los parámetros de la sesión.

Respondido 29 Jul 12, 14:07

Si entiendo la pregunta del OP, las variables son establecido por el script de la imagen, por lo que aún no estarán disponibles para colocar en el img src. - Michael Berkowski

@Michael: sí, estoy de acuerdo, lo entendí de manera opuesta. Esperemos que hallaplay835 pueda remodelar un poco su diseño. - oscuridad

@Michael: exactamente, las variables están configuradas por el script de imagen, por lo que no puedo usarlas en src. Incluso si uso el almacenamiento en búfer de salida, no se podrá acceder al contenido de $_SESSION desde el script incluido hasta que actualice la página, pero luego de actualizar los valores en $_SESSION serán los de la imagen generada anteriormente y no la que se muestra actualmente. (¿Por qué es esto?). - víbora aturdida

@hallaplay835 si cuando actualiza, la secuencia de comandos de la imagen se vuelve a llamar (como sería) y no se protege contra la configuración de nuevas variables aleatorias en ella, se establecerán nuevas, pero la secuencia de comandos que contiene se ejecuta primero y, por lo tanto, obtiene la anterior sesión. Tendrá que usar ajax como describí en mi respuesta para obtener la sesión en la página original sin actualizar. O cambie el diseño para que no sea el script de imagen el que establece la sesión. - Michael Berkowski

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.