だから私は今、私のmysqlデータベースに接続する長いポーリングでリアルタイムマルチプレイヤーでキャンバスゲームを動作させようとしていますが、今はWebソケットに切り替えようとしています。WebSocketが情報を保存する場所と、保存時にWebSocketがどのように編成されているかについて少し混乱しています。WebSocketはmysqlサーバーに接続しますか?サーバーがリセットされると、WebSocketを使用して保存された情報はリセットされますか?どんな助けでも大歓迎です。ありがとう
2 に答える
免責事項:この回答は、OPのコメントに向けられています。提示されたスクリプトは、決して安全ではありません。ラチェットのようなサードパーティのFWを使用することが望ましい
PHPがどのように機能するかを誤解していると思います。例を挙げて、そこから説明を作成しましょう...
a.phpとb.phpの2つのファイルを持つWebサーバー(example.com)があります。
a.php
<?php
$varA = "I'm var A";
echo $varA;
b.php
<?php
echo $varA;
スクリプトa.phpを実行するには、ブラウザをhttp://example.com/a.phpに誘導します。出力は次のとおりです。
私はvarAです
ただし、http://example.com/b.phpにアクセスすると、次のような通知が出力されます。
注意:未定義の変数:2行目の/path/to/webroot/b.phpのvarA
何故ですか?
これは、両方のスクリプトが完全に独立しているためです。彼らはお互いの存在すら知りません。
それでは、b.phpを少し変更しましょう。
b.php
<?php
include 'a.php';
echo $varA;
出力:
私はvarAIですvarAです
これは基本的に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にアクセスすると、次のように出力されます。
無し
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から来ました
GETを使用する代わりに、POSTリクエストを実行できます。(後で説明します)
$ _SESSION
「アクセス」の間はどうですか?
phpファイルにアクセスするたびに、スクリプトは最初から最後まで実行されます。
これが別のファイル(e.php)です
<?php
if (!isset($i)) {
$i = 0;
}
++$i;
このスクリプトは、var $ iが定義されていない場合、$ i = 0であり、それを1つインクリメントすることを示しています。
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ファイルを含めたり要求したりすることはできません。さらに、データを保護するために2つの場所から情報を送信する場合に最適です。ソケット接続を使用した例を次に示します。
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としてタグ付けしているので、間にスクリプトがあると思います。
情報を保存する際のWebSocket
WebSocketは、データを転送するための導管である情報を保存しません。
WebSocketはmysqlサーバーに接続しますか?
いいえ-まだ間に何かが必要です。yopuがMySQLプロトコルをjavascriptで実装できたとしても、この方法でデータベースにアクセスすることはできません。websocketは、ストリーム(TCP)ベースの接続を介してデータグラムベースのプロトコルをトンネリングします。その中間にあるべきものに関しては、はい、PHPはソリューションの一部になることができます。
そこにはたくさんのWebSocketサーバー/アダプターがあり、それらの多くはPHPで実装されているか、PHPバックエンドをサポートしています-それらをグーグルで検索して、サンプルコードを読んでください。
サーバーがリセットされると、WebSocketを使用して保存された情報はリセットされますか?
上記を参照してください-WebSocketは情報を保存しません。