2

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

4

2 回答 2

4

免责声明:此答案针对 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将输出

没有任何

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。

于 2012-10-31T20:55:35.393 回答
2

你的帖子很混乱。

现在进行长轮询,连接到我的 mysql 数据库

AFAIK 没有从浏览器到 mysql 数据库的直接桥接 - 因为您已将其标记为 PHP,所以我假设两者之间有一个脚本。

websockets在哪里存储信息

Websockets 不存储信息,它们是传输数据的管道。

websockets 是否连接到 mysql 服务器?

不-您仍然需要介于两者之间的东西。即使 yopu 可以在 javascript 中实现 MySQL 协议,您也无法以这种方式访问​​数据库 - websockets 通过基于流 (TCP) 的连接来隧道基于数据报的协议。至于中间应该是什么,是的,PHP 可以成为解决方案的一部分。

那里有很多 websocket 服务器/适配器,其中许多要么用 PHP 实现,要么支持 PHP 后端 - 尝试用谷歌搜索它们并通读示例代码。

当服务器重置时,使用 websockets 存储的信息是否会重置?

见上文 - websockets 不存储信息。

于 2012-10-31T18:58:36.153 回答