WebSocket соединение с MySQL

Обновить

December 2018

Просмотры

6.9k раз

2

Таким образом, я пытался сделать мой холст игру работать в режиме реального времени мультиплеер с длинным опросом прямо сейчас, который подключается к базе данных MySQL, но я сейчас пытаюсь перейти на веб-сокеты. Я немного запутался, где WebSockets в хранении информации и о том, как она организована, когда она хранится. Имеют ли WebSockets подключиться к серверу MySQL? Есть ли информация, сохраненная с помощью WebSockets сброса, когда сброс сервера? любая помощь приветствуется. Спасибо

2 ответы

2

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот ответ направлен на комментарии OPS. Сценарии , представленные в, отнюдь, безопасно. Это предпочтительнее использовать третью партию FW как Ratchet

Я думаю, вы непонимание, как работает PHP. Позвольте мне дать вам пример и построить какое-то объяснение от этого ...


У вас есть веб-сервер (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 напечатает уведомление говоря

Примечание: Undefined переменной: Vara в /path/to/webroot/b.php строке 2

Это почему?

Это потому, что оба сценария являются полностью независимыми. Они не»даже знают о существовании друг друга.

Теперь давайте изменим b.php немного:

b.php

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

выход:

Я вар AI'm вар

Это в основном говорит 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 и нажав пасс выходного значения

Я из г

Вместо того, чтобы использовать GET вы можете сделать запрос POST. (Мы рассмотрим это позже)


$ _SESSION

Как насчет между «заходами»?

Каждый раз, когда вы получите доступ к файлу PHP, скрипт запускается с самого начала и до конца.

Вот еще один файл (e.php)

<?php
if (!isset($i)) {
    $i = 0;
}
++$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 не хранит информацию, которую они представляют собой канал для передачи данных.

Имеют ли WebSockets подключиться к серверу MySQL?

Нет - вы все равно нужно что-то между ними. Даже если yopu может реализовать протокол MySQL в JavaScript вы не сможете получить доступ к базе данных таким образом - WebSockets туннель протокол, основанный дейтаграмм через поток (TCP) на основе соединения. Что касается того, что должно быть между вещью, да PHP может быть частью решения.

Есть много WebSocket серверов / адаптеры там, многие из которых либо реализуется в PHP о поддержки PHP бэкенд - попробуйте прибегая к помощи для них и прочитать пример кода.

Есть ли информация, сохраненная с помощью WebSockets сброса, когда сброс сервера?

См выше - WebSockets не хранят информацию.