首页 > 解决方案 > 如何处理 PHP 中所有用户的全局变量相同?

问题描述

我想使用将在所有用户之间共享的全局变量使用 php 创建简单的多人游戏,而不使用套接字。

我尝试编写具有名为“connections”的全局变量和代码来处理带有名为“myName”的url参数的GET请求的php服务器。当用户向 php 服务器发送 GET 请求时,“connections”会递增并作为 GET 响应发送回用户。

<?php
    $connections = 0;
    if(isset($_GET['myName'])) {
        $connections = $connections+ 1;
        echo json_encode($connections);
        exit();
    }
?>
<html>
    <head>
    </head>
        <body>
        <form action="Test/testServer.php">
            <input type="text" name="myName">
            <input type="submit" value="submit">
        </form>
    </body>
</html>

我是 php 新手,也许我错过了关于 php 服务器实际工作方式的一些信息。我希望“连接”是在整个“服务器寿命”中发送 GET 请求的连接用户的数量。

标签: phpservermultiplayer

解决方案


PHP 是一种服务器端语言,一旦程序执行完毕,一切的状态就被遗忘了。因此,在下一次请求中,除非存储在缓存中,否则不会存在。

但是,您可以使用数据库之类的东西来存储数据。您可以像这样连接到您的数据库:

new PDO('mysql:host=localhost;dbname=yourDb;charset=utf8mb4', 'username', 'password', array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
));

要执行,您可以使用准备好的语句。

// (new PDO) is your pre-instanced PDO
$stmt = (new PDO)->Prepare('SELECT id FROM test WHERE email = ? LIMIT 1');
$stmt->execute(array('foo@bar.com'));
$stmt->fetch(); // Array ( 'id' => (int) 1 )

在您的情况下,您需要设置一个数据库来注册连接。当一个新玩家加入时,对于一个完全基本的(无安全性)示例,您可以存储他的 ID。

session_start();
// new PDO is your pre-instanced PDO
$con = new PDO;
$con->Prepare('INSERT INTO players (username) VALUES (?)')->execute(array('foo'));
$_SESSION['player.id.insecure'] = $con->lastInsertId();

然后,您要实现的一切都归结为您的基础架构。您可以在此处阅读有关PDO的更多信息。


推荐阅读