测试.php:
<!DOCTYPE html>
<html>
<head>
<title> Test </title>
<script>
function init()
{
var source = new EventSource("massrelay.php");
source.onmessage = function(event)
{
console.log("massrelay sent: " + event.data);
var p = document.createElement("p");
var t = document.createTextNode(event.data);
p.appendChild(t);
document.getElementById("rec").appendChild(p);
};
}
function test()
{
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function ()
{
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200)
{
console.log("reciver responded: " + xhr.responseText);
}
}
xhr.open("GET", "reciver.php?d=" + document.getElementById("inp").value , true);
xhr.send();
console.log("you sent: " + document.getElementById("inp").value);
}
</script>
</head>
<body>
<button onclick="init()">Start Test</button>
<textarea id="inp"></textarea>
<button onclick="test()">click me</button>
<div id="rec"></div>
</body>
</html>
这需要用户输入(当前是一个用于测试的文本框)并将其发送到接收器,并将接收器响应的内容写回控制台,我从未收到来自接收器的错误。它还为发送的 SSE 添加了一个事件侦听器。
接收器.php:
<?php
$data = $_REQUEST["d"];
(file_put_contents("data.txt", $data)) ? echo $data : echo "error writing";
?>
如您所见,这非常简单,只有在发送回写入成功之前将数据写入 data.txt 的功能。data.txt 只是传递给 massrelay.php 的“管”数据。
massrelay.php:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while(1)
{
$data = file_get_contents("data.txt");
if ($data != "NULL")
{
echo "data: " . $data . "\n\n";
flush();
file_put_contents("data.txt", "NULL");
}
}
?>
massrelay.php 检查 data.txt 中是否有任何数据,如果有,将使用 SSE 将其传递给具有事件侦听器的任何人,一旦读取数据,它将清除数据文件。
除了massrelay.php从数据文件发送数据可能需要30秒到10分钟的时间之外,整个事情实际上工作得很好。对于网页游戏,这是完全不能接受的,因为您需要实时操作。我想知道它是否由于我的代码中的缺陷而花费了这么长时间,或者我不是在考虑硬件(我自己将它托管在带有 sempron 的 2006 戴尔上)。如果有人看到它有任何问题,请告诉我,谢谢。