2012-10-31 124 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