So i have been trying to make my canvas game work in real time multiplayer with long polling right now which connects to my mysql database, but I am now trying to switch to web sockets. I am a little confused on where the websockets in storing information and on how it is being organized when it is stored. Do the websockets connect to a mysql server? Does the information stored using websockets reset when the server resets? any help is appreciated. Thanks
2 回答
免责声明:此答案针对 OP 评论。提供的脚本绝不是安全的。最好使用Ratchet等第三方固件
我认为您误解了 PHP 的工作原理。让我给你一个例子,并从中建立一些解释......
您有一个带有 2 个文件的网络服务器(example.com):a.php 和 b.php。
一个.php
<?php
$varA = "I'm var A";
echo $varA;
b.php
<?php
echo $varA;
要运行脚本 a.php,请将浏览器定向到http://example.com/a.php。输出是:
我是变种 A
但是去http://example.com/b.php会打印一个通知说
注意:未定义变量:第 2 行 /path/to/webroot/b.php 中的 varA
这是为什么?
这是因为这两个脚本是完全独立的。他们甚至不知道彼此的存在。
现在让我们稍微改变一下 b.php:
b.php
<?php
include 'a.php';
echo $varA;
输出:
我是 var AI 是 var A
这基本上告诉 b.php 包含 a.php,因此“共享”变量、对象、类和函数定义。
发布和获取
在脚本之间传递数据的另一种方法是使用 POST 或 GET。
c.php
<?php
if (isset($_GET['c']) {
$varC = $_GET['c'];
} else {
$varC = 'NONE';
}
echo $varD;
没有任何
去http://example.com/c.php?c=something会输出
某物
将变量从 d.php 传递给 c.php。您可以使用 GET 请求。
d.php
<?php
$varD = urlencode("i'm from d");
echo "<a href=\"http://example.com/c.php?c=$varD\">pass value</a>";
或者
header('Location: http://example.com/c.php?c='.urlencode("i'm from d"));
转到 d.php 并单击传递值将输出
我来自 d
您可以执行 POST 请求,而不是使用 GET。(我们稍后会介绍)
$_SESSION
在“访问”之间呢?
每次访问 php 文件时,脚本都会从头到尾运行。
这是另一个文件(e.php)
<?php
if (!isset($i)) {
$i = 0;
}
++$i;
该脚本告诉您,如果未定义 var $i,则 $i=0 然后将其加一。
访问http://example.com/e.php将始终输出 1。访问之间不存储任何数据。
除非...您使用 $_SESSION 变量(或将数据存储在持久媒体中)。
ii.txt
0
e.php
<?php
session_start();
if (!isset($_SESSION['i'])) {
$_SESSION['i'] = 0;
}
++$_SESSION['i'];
$ii = file_get_contents('ii.txt');
++$ii;
file_put_contents('ii.txt', $ii);
echo "session counter: " . $_SESSION['i'];
echo '<br/>';
echo "file counter: " . $ii;
每次访问 e.php 时,两个计数器都会增加。
但是... $_SESSION 变量不是持久媒体。当会话被销毁(或过期)时,会话计数器将重置。但是,文件计数器将始终增加,因此它是一种持久性媒体。当然,您可以使用数据库来存储变量。原理是一样的。
在不同服务器之间传递变量:
在同一服务器的文件之间传递变量时,原理是一样的。但是,您不能(通常)包含或要求位于另一台服务器中的 php 文件。此外,最好从两个位置发送信息以保护数据。这是一个使用套接字连接的示例。
a.php(位于 client.com)
<?php
//Our Data
$dataArray = array('foo' => 'some data', "bar" => 42);
// Data convertion into URL parameters -> foo=some%20data&bar=42
$data = http_build_query($dataArray);
//extract the parts of the url
$url = parse_url("http://server.com/b.php");
$host = $url['host']; //server.com
$path = $url['path']; //b.php
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp) {
//HEADERS
fputs($fp, "POST $path HTTP/1.1\r\n"); //POST method
fputs($fp, "Host: $host\r\n"); //The host
fputs($fp, "Referer: myApp\r\n"); //who's the referer
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); //Content type: a form post that is url encoded
fputs($fp, "Content-length: ". strlen($data) ."\r\n"); //data length (size in chars)
fputs($fp, "Connection: close\r\n\r\n");
//DATA
fputs($fp, $data);
$result = '';
// Request result
while(!feof($fp)) {
$result .= fgets($fp, 128);
}
} else {
// Something went bad
echo "ERROR: $errstr ($errno)";
}
// Socket close
fclose($fp);
//SUCCESS
// split the result header from the content
$result = explode("\r\n\r\n", $result, 2);
$header = isset($result[0]) ? $result[0] : '';
$content = isset($result[1]) ? $result[1] : '';
echo "HEADER: $header<br><br>";
echo "CONTENT:<br>$content";
b.php(位于 server.com)
<?php
header('Content-type: text/plain');
if (isset($_POST)) {
file_put_contents('data.txt', $_POST, FILE_APPEND);
file_put_contents('data.txt', PHP_EOL, FILE_APPEND);
print file_get_contents('data.txt');
} else {
echo "NOT OK";
}
当访问http://client.com/a.php时,一个 POST 请求被发送到 b.php。如果成功,b.php 将数据存储在名为 data.txt 的文件中并返回该文件的内容。
希望这有助于理解套接字和 PHP。
你的帖子很混乱。
现在进行长轮询,连接到我的 mysql 数据库
AFAIK 没有从浏览器到 mysql 数据库的直接桥接 - 因为您已将其标记为 PHP,所以我假设两者之间有一个脚本。
websockets在哪里存储信息
Websockets 不存储信息,它们是传输数据的管道。
websockets 是否连接到 mysql 服务器?
不-您仍然需要介于两者之间的东西。即使 yopu 可以在 javascript 中实现 MySQL 协议,您也无法以这种方式访问数据库 - websockets 通过基于流 (TCP) 的连接来隧道基于数据报的协议。至于中间应该是什么,是的,PHP 可以成为解决方案的一部分。
那里有很多 websocket 服务器/适配器,其中许多要么用 PHP 实现,要么支持 PHP 后端 - 尝试用谷歌搜索它们并通读示例代码。
当服务器重置时,使用 websockets 存储的信息是否会重置?
见上文 - websockets 不存储信息。