【问题标题】:Set and get PHP Session on/from the server not on the client在服务器上/从服务器上而不是在客户端上设置和获取 PHP 会话
【发布时间】:2011-03-26 11:08:52
【问题描述】:

我在很大程度上依赖会话来获取不同计算机的实时更新时遇到了问题。所以这是场景:

[计算机 A] 管理页面: 如果单击按钮,则特定文本将显示在网站的每个页面上,无论是谁的计算机访问它。

[计算机 B] 客户端页面: 我必须实时查看页面上的文本,而不是在管理员单击按钮时加载它。

这是我的代码:

管理页面:admin.php

$("#newFight").click(function(){
                var newFight = "newFight="+1;
                $.ajax({
                    type:       "post",
                    url:        "../includes/newfight.php",
                    data:       newFight,
                    cache:      false,
                    success:    function(html){
                        if(html == 0){
                            alert("Open a Game First");
                        }
                        else if(html == 1){
                            $("#newFight").attr('disabled', 'disabled');
                            // Real time update of fight sequence
                            $("td#fightId").load('../includes/getfight_id.php');
                            $("td#fightHead").html("<em>Fight is on.</em>");
                        }
                    }
                });
            });

管理页面:newfight.php

session_start();
require_once('dbconn.php');
 if(isset($_POST['newFight'])){
        if($_POST['newFight'] == $_SESSION['gameActive']){
            // Make a new fight
            echo $msg = 1;
            $query = "INSERT INTO fights(fight_game_id) VALUES(".$_SESSION['game_id'].")";
            $execQuery = mysql_query($query);
            $last_id = mysql_insert_id();
            $_SESSION['fight_id'] = $last_id;
            $_SESSION['fight_active'] = 1;
        }
        if($_POST['newFight'] != $_SESSION['gameActive']){
            $msg = 0;
            echo $msg;
        }
    }
?>

这里的过程是这样的,如果一个按钮被点击,jQuery通过AJAX会对其进行处理并设置一个会话 ex: $_SESSION['button_clicked'] = 1;供用户参考,因此可以使用 setInterval(client's) 实时更新用户页面。

这里的客户端页面假设管理员点击按钮时会获得实时更新。

客户端页面:client.php

 $(function(){
            var auto_refresh = setInterval(
               function (){
                  $("td#fightHeadUser").load('../includes/fightheaduser.php');
               }, 1000);
 });

客户端页面:fightheaduser.php

session_start();
if(isset($_SESSION['fight_active']) && $_SESSION['fight_active'] == 1){
    echo "<em>Fight is on.</em>";
}
if(!isset($_SESSION['fight_active']) && $_SESSION['fight_active'] != 1){
    echo "<em>No fight yet.</em>";
}

所以我的问题是..它只在一台计算机上运行,​​所以当我打开两个浏览器(管理员和客户端)并单击按钮时,我可以看到客户端的页面是实时更新的,但是,当不同时计算机通过 LAN 访问客户端的页面,它无法在它们上运行。所以我怀疑这是因为会话只存储在我的电脑上,这就是它没有在其他电脑上工作的原因。

你认为我必须做什么?如果您能建议我一个好的但不同的解决方案,那么我很想尝试一下。

抱歉,我的问题很长。 TIA。

【问题讨论】:

    标签: php jquery ajax session client-server


    【解决方案1】:

    我认为你不能使用会话来解决这个问题,因为每个用户(连接)都会获得另一个会话并且无法从管理会话中获取数据。

    您可以使用环境变量。每个连接都可以读取这个。

    $_ENV
    

    【讨论】:

    • 那么你是说我应该用 $_ENV 替换上面代码中的每个 $_SESSION 吗?谢谢。
    • 在上面的代码中是的。仅将 $_SESSION 用于与用户相关的变量。 $_ENV 用于全局变量。
    • 谢谢,我的主机恢复后一定会试试这个。
    【解决方案2】:

    我假设客户想观看或打架时必须登录?为什么不使用数据库?所以你可以注册哪个是开的,你可以看历史等等等等。

    【讨论】:

    • 是的,他们必须登录,我也考虑过这一点,但我预计网站的流量会很大,如果我将它们放在 db 上,我认为这会完全减慢应用程序的速度。所以就目前而言,我正在考虑最快的解决方案。
    • 很公平,如果您希望您的网站有很多流量。但是知道你只存储一个战斗ID吗?没有别的(那与战斗有关)?
    • 哈哈,你说得有道理,它只是 id,但战斗按钮只是应用程序上的众多按钮之一,我实际上有 15 个不同的按钮执行相同的过程,存储到 db如果我完全用完解决方案,实际上是我最后的选择:P
    • 这也取决于您查询的方式..您的数据库结构如何等等..等等..我建议然后创建2个数据库..一个用于您所有的好数据和一个“session_db “..
    • 如果你想这样做:slideshare.net/webhostingguy/… 看这里也许你对这篇文章有什么看法
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2012-03-30
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多