【问题标题】:PHP $_SESSION not available until the page is reloaded. Why?PHP $_SESSION 在页面重新加载之前不可用。为什么?
【发布时间】:2011-04-30 09:39:51
【问题描述】:

我正在创建一个执行一些数据库查询的图表,然后使用 GD 函数构建图表,然后还将数据库中的信息放入存储在 $_SESSION['my_data'] 中的数组中。此图使用 img 标签显示在网页上。

<img src="my_graph.php?time=$time">

<?
    print_r($_SESSION['my_data']);
?>

问题是当我 print_r() 来自会话变量的数组时,它不会打印当前的图形数据;它打印上次加载页面时图表中的数据。它就像一个 cookie。

我尝试在将数组存储到会话后立即放置 session_write_close(),因为我认为 $_SESSION 可能已被锁定,直到 my_graph.php 完成加载图像。那没用。

我还尝试在打印数组之前放置 sleep(10),但没有奏效。

为什么会这样?

【问题讨论】:

  • 将html图像放入php标签没有错误??
  • 您是否在 my_graph.php 中设置了 $_SESSION?如果是这种情况,您必须重新加载它才能看到更改。请求的页面被呈现(您拥有的代码),然后浏览器请求 my_graph.php。但是你已经打印了你的 $_SESSION。
  • @MatTheCat 抱歉在stackoverflow中输入错误
  • @Jason 是的,我就是这样做的。感谢您指出这一点

标签: php session


【解决方案1】:

我想,当你的 web 服务器执行 PHP 代码来绘制我们的页面时,它已经初始化了 $_SESSION 数组。并且这个数组在当前脚本运行时没有更新。当浏览器找到图像标签时,它会向 Web 服务器发出另一个请求,该服务器执行图像生成脚本,该脚本会在另一个运行时更新 $_SESSION 数组。

你可以:

  • 在您的网页生成代码中进行所有计算
  • 或在图像生成脚本完成计算并在 $_SESSION 数组中设置所有必要数据后重新加载页面

【讨论】:

    【解决方案2】:

    如果您在mygraph.php 中设置$_SESSION['my_data'],则在您的浏览器请求mygraph.php 之前,您将永远不会看到您的$_SESSIONchange。在将输出刷新到浏览器之前,这永远不会发生(这将在您已经 print_r() $_SESSION 之后)。

    您也许可以尝试flush() 并希望浏览器在您完成执行之前请求图像,我从未尝试过(不确定它是否会起作用)。不过,有时您必须用空格填充输出,直到大约 2k(如果我没记错的话)。不过,我不会推荐这个。

    另一种解决方案是在src 中请求您在上面有代码的页面。因此,如果您上面的代码在test.php 中,您可以输入&lt;img src="test.php?img=true&amp;time=$time"&gt;。然后如果你得到$_GET['img'],显示一个图像,否则执行一些代码。这有意义吗?

    【讨论】:

      【解决方案3】:

      事件顺序:

      1. 浏览器请求主网页。
      2. PHP 运行主页并将内容发送到浏览器。
      3. 浏览器接收页面。
      4. 浏览器查看页面并发送请求以加载图形等。
      5. PHP 运行 graph.php 并将图形发送到浏览器。
      6. 浏览器将图形插入页面。

      需要注意的重要一点是,第 2 点的全部发生在第 5 点发生之前。这意味着 graph.php 对 $_SESSION 所做的任何事情都不会对主页中的代码可见,从而导致您看到的效果。

      这是网页的本质:图形文件与 PHP 主程序是分开的。

      您无法像现在这样使用单独的图形文件来解决这个问题。

      我可以想到一种方法来实现它,但这将是一个完全重写(由您决定是否值得!)

      可以使用 Javascript 创建图表。如果您在主页中生成 javascript 代码来执行此操作,则可以在图形生成代码期间设置 $_SESSION,稍后将在程序中使用它。

      如果您决定这样做,您应该查看 gRaphael 库来帮助您。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        相关资源
        最近更新 更多