我投影一些基于Web的游戏。基本上我想执行此架构:
- 玩家点击产品的补充库存
- 执行上述操作需要一些时间,例如 1 分 30 秒
- 玩家将选项卡更改为产品列表并返回商店概述
- 一小时后,他回到产品页面,库存被重新填充。
我不知道如何在用户单击一个按钮后在服务器端执行延迟的php操作。
我知道我可以通过简单地创建另一个 mysql 表并在那里收集玩家执行的任何操作并在产品页面上创建简单的 jquery 倒计时以及从 sql 查询获得的时间来做到这一点。
但是没有这张桌子怎么办?
还有如何创建一些随机动作,例如我们为虚拟人销售产品,生成一些随机断电等。使用AJAX或JQuery甚至可能吗?
也许我应该使用一些像我们 IPBoard 这样的 cronjobs。
从字面上看,我不知道从哪里开始。我知道我可能没有技能来创建一些更高级的网页游戏,但我只是想尝试学习新的东西。
实现此目的的一种方法是,根据您的环境和服务器上的权限,只需创建一个 bash 脚本并调用 bash 脚本
exec('sh /path/to/file.sh')
从你的PHP文件中,例如包装在Ajax调用中。
bash 脚本可以包含类似
#!/bin/bash'
echo php /path/to/file.php | at now + 2 min # << or whatever time you want
如果你不想要一个MySQL表,我冒昧地猜测你也不想设置Redis(虽然它超级简单!您还需要获取PHPRedis(也可在GitHub上找到)查看他们的网站以获取受支持客户端的完整列表。
Redis 是一个简单的键值存储,针对快速读/写操作进行了优化,并带有方便的EXPIRE
功能。它非常适合存储经常更改的小数据。通过设置一个在 n
秒后自行删除的标志,您可以只检查该标志。如果标志仍然存在,请继续向用户显示"正在进行"操作。
使用键"{$user_id}:{$property}"...
<?php
$time = 90;
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('1234:item1:stock_level', 100);
$redis->setex('1234:item1:restocking_flag', $time, 1);
if ($redis->get("{$user_id}:{$item}:restocking_flag")) {
echo "Your stock will be refilled in {$redis->ttl()} seconds";
} else {
echo "You now have {$redis->get("{$user_id}:{$item}:stock_level")} items";
}
当然,这是服务器端实现。您希望通过 Ajax 进行调用以启动重新填充过程。如果您知道花费的时间,请让 javascript 计时器在 90 秒后发出 ajax 请求,以向服务器验证锁已被删除。否则,只要有意义,就经常检查。这可以防止用户端的驯服,只要您的脚本没有从直接客户端值设置 Redis 超时。