在重新加载页面之前,PHP $ _SESSION不可用。为什么?

时间:2010-10-25 19:19:07

标签: php session

我正在创建一个执行某些数据库查询的图表,然后使用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完成加载图像。那没用。

在打印数组之前,我也尝试过睡眠(10),但是没有用。

为什么会这样?

3 个答案:

答案 0 :(得分:2)

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

你可以:

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

答案 1 :(得分:1)

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

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

另一种解决方案是在src中请求您拥有上述代码的页面。因此,如果上面的代码位于test.php,您可以放置​​<img src="test.php?img=true&time=$time">。然后,如果你得到$_GET['img'],则显示图像,否则执行一些代码。这有意义吗?

答案 2 :(得分:0)

事件顺序:

  1. 浏览器请求主网页。
  2. PHP运行主页并将内容发送到浏览器。
  3. 浏览器收到该页面。
  4. 浏览器查看页面并发送加载图形等的请求
  5. PHP运行graph.php并将图形发送到浏览器。
  6. 浏览器将图形插入页面。
  7. 需要注意的重要一点是整个第2点发生在第5点发生之前。这意味着graph.php对$ _SESSION执行的任何操作都不会对主页中的代码可见,从而导致您看到的效果。

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

    你不能像使用单独的图形文件那样解决这个问题。

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

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

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

    希望有所帮助。