2

だから私は今、私のmysqlデータベースに接続する長いポーリングでリアルタイムマルチプレイヤーでキャンバスゲームを動作させようとしていますが、今はWebソケットに切り替えようとしています。WebSocketが情報を保存する場所と、保存時にWebSocketがどのように編成されているかについて少し混乱しています。WebSocketはmysqlサーバーに接続しますか?サーバーがリセットされると、WebSocketを使用して保存された情報はリセットされますか?どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

4

免責事項:この回答は、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の理解に役立つことを願っています。

于 2012-10-31T20:55:35.393 に答える
2

あなたの投稿は非常に混乱しています。

私のmysqlデータベースに接続する現在の長いポーリングで

AFAIKには、ブラウザからmysqlデータベースへの直接のブリッジはありません。これをPHPとしてタグ付けしているので、間にスクリプトがあると思います。

情報を保存する際のWebSocket

WebSocketは、データを転送するための導管である情報を保存しません。

WebSocketはmysqlサーバーに接続しますか?

いいえ-まだ間に何かが必要です。yopuがMySQLプロトコルをjavascriptで実装できたとしても、この方法でデータベースにアクセスすることはできません。websocketは、ストリーム(TCP)ベースの接続を介してデータグラムベースのプロトコルをトンネリングします。その中間にあるべきものに関しては、はい、PHPはソリューションの一部になることができます。

そこにはたくさんのWebSocketサーバー/アダプターがあり、それらの多くはPHPで実装されているか、PHPバックエンドをサポートしています-それらをグーグルで検索して、サンプルコードを読んでください。

サーバーがリセットされると、WebSocketを使用して保存された情報はリセットされますか?

上記を参照してください-WebSocketは情報を保存しません。

于 2012-10-31T18:58:36.153 に答える