在PHP中,如何处理所有用户都相同的全局变量?

在PHP中,如何处理所有用户都相同的全局变量?,php,server,multiplayer,Php,Server,Multiplayer,我想用php创建一个简单的多人游戏,使用全局变量在所有用户之间共享,而不使用套接字 我尝试编写php服务器,该服务器具有名为connections的全局变量,并使用名为myName的url参数编写代码来处理GET请求。 当用户向php服务器发送GET请求时,连接将递增,并作为GET响应发送回用户 <?php $connections = 0; if(isset($_GET['myName'])) { $connections = $connections+

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

我尝试编写php服务器,该服务器具有名为connections的全局变量,并使用名为myName的url参数编写代码来处理GET请求。 当用户向php服务器发送GET请求时,连接将递增,并作为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请求的连接用户数。

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();

然后,您试图实现的一切都归结于您的基础架构。您可以在这里阅读更多信息。

这不是PHP的工作方式。为了持久化和共享数据,您通常使用Mysql数据库和数据库层,如mysqli或PDO.PHP,它在服务器端执行,然后状态被遗忘。考虑使用一种存储数据的方法。@ JaQuHH—你所说的存储数据的方法是什么意思?你是说DB之类的东西吗?你有没有一些例子,我可以从中理解如何做到这一点?嗨,首先感谢你的解释。现在肯定更清楚了。但是,DB是否适合存储实时多人游戏的数据?例如,我希望服务器告诉所有用户谁是赢家。我听说过一个叫做websockets的东西,但我并没有找到一个好的教程,我想我可以用另一种方式来避免它。websockets并不能让服务器保持活力,它只是一个恒定的数据流。我不能100%确定PHP是否具有NIO功能,所以我知道数据需要存储,但值得研究。在这种情况下,使用套接字的原因是为了让客户端保持活动状态,因此每n秒,服务器就知道哪个客户端仍然连接。因此,播放器1可以与服务器通信,并将数据传递给播放器2。这将在不同的请求间隔发生,即:/server/输入和/server/输出请求。套接字将不断地流式处理这两个请求。是的,套接字可能是我所需要的。非常感谢,现在更清楚了。