gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:22:27 25 4
gpt4 key购买 nike

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

研究 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com