2012-10-31 83 views
2

所以我一直在试图让我的帆布游戏在长时间轮询现在连接到我的mysql数据库的实时多人游戏中工作,但我现在试图切换到网络套接字。我对存储信息的websockets的位置以及存储信息时的组织方式有点困惑。网络套接字连接到MySQL服务器?当服务器重置时,使用websocket存储的信息是否会重置?任何帮助表示赞赏。谢谢与mysql的websocket连接

+2

Websockets只是一种打开浏览器和服务器之间的双向通信的方式,它不存储任何东西。 – adeneo

+0

好吧,它的工作原理与php中的memcache类似吗? Web套接字是否在某种意义上创建全局持久会话变量? – user1754830

+1

这只是客户端和服务器之间的持续连接。 Websockets实际上被W3C定义为一个API。 API不存储任何东西,它们只是提供一个信息交换的接口。 –

回答

2

免责声明:本答案针对OP的评论。所提供的脚本决不是安全的。最好使用像Ratchet

这样的第三方固件我认为你误解了PHP的工作原理。我给大家举一个例子,并建立从一些解释...


你有一个web服务器(example.com)有2个文件:a.php只会和b.php。

a.php只会

<?php 
$varA = "I'm var A"; 
echo $varA; 

b.php

<?php 
echo $varA; 

到a.php只会你直接在浏览器中运行http://example.com/a.php脚本。输出是:

我风险价值

但是要http://example.com/b.php将打印公告称

注意:未定义的变量:翻在/路径/到/根目录/ B .php on line 2

这是为什么?

这是因为两个脚本完全独立。他们甚至不知道彼此的存在。

现在,让我们改变b.php了一下:

b.php

<?php 
include 'a.php'; 
echo $varA; 

输出:

我变种A我VAR一个

这基本上告诉b.php包含a.php,从而“共享”变量,对象,类和函数定义。


POST和GET

另一种方式来传递脚本之间数据使用POST或GET。

c.php

<?php 
if (isset($_GET['c']) { 
    $varC = $_GET['c']; 
} else { 
    $varC = 'NONE'; 
} 
echo $varD; 

http://example.com/c.php将输出

NONE

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并点击通值将输出

i。从d是

而不是使用GET你可以做一个POST请求。(我们将讨论这个版本)


$ _SESSION

约之间的 “访问” 是什么?

每次访问php文件时,脚本都会从头到尾运行。

这里的另一个文件(e.php)

<?php 
if (!isset($i)) { 
    $i = 0; 
} 
++$i; 

该脚本会告诉你,如果没有定义变量$ 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。

2

您的帖子是非常困惑。

与长轮询现在它连接到我的MySQL数据库

AFAIK有从浏览器到MySQL数据库没有直接的桥梁 - 因为你已经标记这是PHP中,我认为有一个脚本之间。

其中存储信息

的WebSockets不存储信息的WebSockets它们是用于传送数据的管道。

Websocket连接到MySQL服务器吗?

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

有很多websocket服务器/适配器,其中许多都在PHP中实现o支持PHP后端 - 尝试使用Google搜索并阅读示例代码。

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

请参阅上述 - websockets不存储信息。

+0

将信息从一个php文件传输到另一个文件时,数据传输如何工作?通常情况下,数据库作为中间的东西,但在这种情况下,我不确定。 – user1754830

+0

它不会......除非在同一个脚本中调用这两个文件。 – Tivie

+0

使用网络套接字让我们说我创建一个变量存储字符串hello世界。使用网络套接字我应该能够在任何浏览器/计算机上异步更改此变量,即使基础是PHP正确的?对不起,我很新,这个 – user1754830