【发布时间】:2017-01-03 17:17:24
【问题描述】:
背景: 我正在用 PHP、JavaScript 和 HTML 为 web 制作一个简单的游戏。玩家在屏幕上控制一个盒子的动作,并看到其他人拿着盒子飞来飞去。
我有以下文件,我通过托管公司上传到我的域:
-
index.html:带有一些按钮(例如,开始游戏)和框架(用于放入盒子)的文件。 -
server.php:从客户端接收消息的 PHP 脚本,对数据库执行读/写操作,从数据库回显(使用echo)框到客户端。不回显消息来自的播放器框。 -
database.txt:一个 JSON 文本文件,包含玩家数据和下一个免费 ID 号。当为空时,它看起来像这样:{"players":[], "id": 1}。 玩家 包含具有 ID、位置和旋转等值的对象。 -
script.js:带有脚本的 JavaScript 文件,用于发送/接收消息、显示消息中的数据等。链接到index.html。移动你的盒子。
问题:游戏总是崩溃。迟早。这就是发生的事情:
- 客户端从
server.php接收玩家数据,一切正常。这可能持续 10 秒或长达几分钟。 - 数据开始不稳定,消息有时是 null 而不是实际数据。
- 收到的数据总是null。数据库文件现在是
{"players":null,"id":5}。 ("id" 可以是任意数字,不一定是 5)。
数据流图片,从数据库打印玩家。两名球员。在此屏幕截图之前,有很多行包含有效数据。然后看到两条 null 消息。然后过了一会儿 null 永远。
我不完全确定问题出在哪里,但我猜这与我在server.php 中的读/写有关。我觉得很多玩家的移动使程序更容易崩溃。还有程序发送数据影响的频率。
代码片段 1: 这是来自 server.php 的代码,用于写入数据库。我有某种 semaphore (flock( ... ))来防止客户端同时读/写(导致错误)。我还有一个函数,read,和这个很相似。这里可能出现的问题:
- 信号量不正确。
-
fopen()的模式不正确。见PHP docs。 w 模式用于写入。标签 b 用于 “如果您在处理二进制文件时没有指定 'b' 标志,您的数据可能会遇到奇怪的问题......”。 - 因为我在写作功能中使用
read()而发生了什么奇怪的事情?
代码:
// Write $val to $obj in database JSON
function write($obj,$val){
$content = read();
$json = json_decode($content);
$json->{$obj} = $val; // eg. $json->{'id'} = 5;
$myfile = fopen("database.txt", "wb") or die("Unable to open file!");
if(flock($myfile, LOCK_EX|LOCK_NB)) {
fwrite($myfile,json_encode($json));
flock($myfile, LOCK_UN);
}
fclose($myfile);
}
代码片段 2: 这是我发送数据的代码。它通过setInterval() 调用。在script.js:
// Send message to server.php, call callback with answer
function communicate(messageFunc,callback){
var message = messageFunc();
if (window.XMLHttpRequest) {
var xmlhttp=new XMLHttpRequest();
}
xmlhttp.onreadystatechange= function() {
if (this.readyState==4 && this.status==200) {
callback(this.responseText);
}
}
xmlhttp.open("GET","server.php?msg="+message,true);
xmlhttp.send();
}
这是我接收数据的代码,在server.php:$receive = $_GET["msg"]。
我目前的解决工作 这是我到目前为止所做的,但没有任何改变:
- 将模式 b 添加到
fopen()。 - 在
server.php中添加了flock()以读取/写入函数。 - 对
script.js进行了很多修改,我会说它看起来/工作起来非常干净。 - 检查
memory_get_peak_usage(),并与托管公司核实内存限制。应该完全没有问题。 - 查看了 PHP 垃圾收集和
gc_enable()(我不知道为什么这会改变任何事情)。 - 大量测试,查看数据流。
- 哭了。
结论:这种类型的应用程序是 PHP 的用途吗?你觉得哪里不对?如果您想要我提供的更多代码/信息。非常感谢。
【问题讨论】:
标签: javascript php server