0

所以在我的 HTML 标记中,我有一个像这样的图像标记:

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

'src' 属性链接到一个 PHP 脚本,该脚本使用其中定义的几个变量生成图像,这些变量大多是随机生成的。

现在,我想要做的是访问包含图像生成脚本的页面中的那些随机变量。我想我可以发送 cookie 并在图像标签之后访问它们,因为它们在技术上应该可以随时用于包含文件。我不想发送太多信息,只是几个(10-20)变量。不确定在这种情况下会话是否是更好的选择,因为我必须发送几个 cookie。会话也会带来问题,因为包含脚本会获取旧会话,我必须刷新页面才能获取先前生成的图像的值。我想我也可以设置一个数据库并在包含脚本中访问数据库,但是这些变量是临时的,我必须删除它们,这对我来说似乎很麻烦。

图像生成脚本结束于:

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

并且在标头调用之前不能将任何内容发送到浏览器,否则图像将不会显示。如果我使用 cookie 或会话,则image_generation.php必须同时发送图像并设置 cookie/会话。

没有一个选项(cookies、会话或数据库)真正让我信服,因为在这种特殊情况下每个选项都存在问题。你能想出解决这个问题的方法吗?谢谢。

主要编辑#1: 包含脚本获取先前生成的图像的会话而不刷新/设置 cookie 和/或包含脚本中的会话之前/之后发送图像而没有输出缓冲不会造成问题。

4

2 回答 2

1

您可以将参数传递给 src 属性,例如:

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

或者

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

这个解决方案让你忘记会话、cookies——它是无状态的

PHP 可以通过 ob_* 函数对缓冲区进行巧妙的处理,因此在脚本的开头,您可以调用 ob_start() 来缓冲每个 php 输出,它可以让您避免所有“标头已发送”错误。

您的 image_generation.php 不需要发送任何 cookie。该脚本将接收带有 sessionid 的 cookie(浏览器将 cookie 信息附加到对服务器的每个请求),这使得在 php 端识别用户会话成为可能 - 之后您可以访问每个会话参数。

于 2012-07-29T13:02:14.110 回答
1

您可以使用$_SESSION, 但要使会话在包含该<img>标记的同一脚本中可用(这将在图像脚本之前执行),您需要通过 JavaScript 进行 AJAX 调用。运行的 AJAX 处理程序window.onload应该可以访问$_SESSION由图像脚本创建的,因为图像在执行时应该已经完全加载。

示例 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();

示例 AJAX 调用(使用 jQuery,因为它很容易上手)

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

更新:

它可以完全在 PHP 中完成,但需要稍微更改您的设计,以便生成图像所需的变量$_SESSION由主脚本创建。然后它们可$_SESSION用于 image_generation.php 以根据需要使用,但主脚本已经知道它们。

更新 2:

由于图像变量包含有关如何创建的信息,如果图像不是太大,您实际上可以在主脚本中创建它并将其存储到磁盘。image_generation.php 脚本仍可用作<img src>,但其目的是从磁盘检索正确的图像并将其返回给浏览器,并在不再需要时将其从磁盘中删除。然后$_SESSION可用于主脚本和图像脚本。

于 2012-07-29T12:50:37.083 回答