php - 如何搭建一个带有倒计时功能的mysql排队系统?

标签 php mysql queue

我正在开发一款浏览器/手机游戏,我正在尝试构建一个系统,该系统可以在经过一定时间后自动结束排队任务。这是大多数游戏中使用的基础研究模式。

研究 A 的费用为 100 美元,需要 1 小时才能完成。我是否必须每秒检查是否有已达到或超过完成时间的任务,并触发一个事件来清除它们并增加级别编号?有没有更好的方法或者更优化的方法?这个想法本身可行,但如果您需要在游戏设计中运行 5 或 6 个不同的队列,会发生什么情况?表明我足够抽象它们以将它们全部放在一张表中?

如果我的问题看起来有点含糊或不稳定,我深表歉意。我试图弄清楚从哪里开始这个概念。

最佳答案

我对此不是很熟悉,但我相信您可以使用 websockets 或 NodeJS 创建回调事件,然后您可以使用 PHP 套接字服务器调用该回调。这种

您可以引用本教程:http://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

步骤

首先,使用 websocket.onmessage 回调识别消息类型,类似于此的操作应该有效:

websockets.onmessage = function(ev)
{
    var msg = JSON.parse(ev.data); //Assuming you'll encode the message components in JSON with PHP

    if ( msg.type == "research_end" )
    {
        FinishResearch(msg.content); //Assuming that the content element of the JSON array contains the ID of the research
    }
}

其次,让服务器发送实际的消息。为了不让这个过程变得太复杂或太长,我假设 sendMessage($msg, $client) 是一个向客户端发送消息的函数。

但是,正如教程中所解释的,每个客户端套接字都存储在一个名为 $clients 的数组中,您必须为每个研究添加某种标识符,以便很容易知道哪个研究属于什么客户端。

现在,这是一个重要的部分。在服务器上会有一个名为 $research 的变量,其结构如下:

$research['peername'][0]['time'] = 60000
$research['peername'][0]['type'] = 20

您可以使用以下命令向 websocket 服务器发送传出消息来添加研究:

var array = {message: '20', type: 'research', time : '300000'}; //Create the request array

websocket.send(JSON.stringify(msg)); //Send it to the socket server as a json string, decode with json_decode once it arrives

然后,当它到达服务器并被识别为研究请求时,我们调用一个名为 doResearch 的回调,它接受两个参数

//loop through all connected sockets
foreach ($changed as $changed_socket) { 

    //check for any incomming data
    while(socket_recv($changed_socket, $buf, 1024, 0) >= 1)
    {
        $received_text = unmask($buf); // Unmask data
        $msg_array = json_decode($received_text); // Decode the JSON string we sent to the server

        doResearch($msg_array, $changed_socket); // Let's say this function contains all the procedures to do the research

    }

}

doResearch 类似于:

function doResearch($msg_array, $socket)
{
    $name = socket_getpeername($socket, $addr);

    $count = count($research[$name]);
    $research[$name][$count]['time'] = $msg_array['time'];
    $research[$name][$count]['type'] = $msg_array['type'];
}

最后,您必须在主服务器循环中添加如下条件:

foreach ( $research as $i )
{
    foreach ( $i as $i2 )
    {
        if ( time() <= $i2['time'] )
        {
            $sql->query("INSERT INTO researches('peer', 'researchid') VALUES ('".$i."', '".$i2['type']."')");
            sendMessage('Research type '.$i2['type'].' has finished.', $i2['socket']);
        }
    }
}

然后,它将检查研究是否已完成并将其插入数据库。

希望这有帮助。

关于php - 如何搭建一个带有倒计时功能的mysql排队系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30584839/

相关文章:

php - 为什么这个动态生成的 <div> 不显示?

php - 将 & 号插入 MySQL 的问题

mysql - 2 个表之间的 SQL 查询连接产生重复结果

MySQL按时间段对结果进行分组

php - 如何检测 "5 in a row"游戏中的对角线获胜 (PHP)

java - 如何从两个 HTML 表单/子表单向 MySql 数据库插入数据

design-patterns - 如何可靠地处理队列?

python - 每当队列中有内容时,Amazon 的 SQS 如何通知我的 "worker"服务器之一?

java - Java 中的 PriorityQueue 构造函数

PHP - 使引用参数可选?