gpt4 book ai didi

php - websocket 与 mysql 的连接

转载 作者:行者123 更新时间:2023-11-29 18:25:57 26 4
gpt4 key购买 nike

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

最佳答案

免责声明:此答案针对 OP 评论。提供的脚本绝不是安全的。最好使用第三方固件,如 Ratchet

我认为您误解了 PHP 的工作原理。让我给你举个例子,并从中做出一些解释......


您有一个包含 2 个文件的网络服务器 (example.com):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 .输出是:

I'm var A

然而去http://example.com/b.php将打印一条通知说

Notice: Undefined variable: varA in /path/to/webroot/b.php on line 2

这是为什么?

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

现在让我们稍微改变一下 b.php:

b.php

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

输出:

I'm var AI'm var A

这基本上告诉 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会输出

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'm from 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 变量不是持久媒体。当 session 被销毁(或过期)时, 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。

关于php - websocket 与 mysql 的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13163843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com