在这种特殊情况下,在PHP脚本之间传递值

Passing values between PHP scripts in this particular situation

本文关键字:之间 脚本 PHP 特殊情况下      更新时间:2024-04-07

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

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

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

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

图像生成脚本以结束

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

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

没有一个选项(cookie、会话或DB)真正让我信服,因为在这种特殊情况下,每个选项都有问题。你能想办法解决这个问题吗?谢谢

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

您可以使用$_SESSION,但要使会话在包含<img>标记的同一脚本中可用(该标记在图像脚本之前执行),您需要通过JavaScript进行AJAX调用。在window.onload上运行的AJAX处理程序应该可以访问图像脚本创建的$_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然后可用于主脚本和图像脚本。

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

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

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

这个解决方案让你忘记会话,cookie-它是无状态的

Php可以通过ob_*函数对缓冲区进行巧妙的处理,因此在脚本开始时,您可以调用ob_start()来缓冲每个Php输出,这可以避免所有"Header already send"错误。

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