Можно ли читать пакеты UDP (асинхронно) и записывать их в базу данных, используя ReactPHP и Async MySQL? - PullRequest
0 голосов
/ 17 ноября 2018

Можно ли читать пакеты udp (асинхронно) и записывать их в базу данных, используя ReactPHP и клиент базы данных Async MySQL для ReactPHP? Я пытаюсь что-то, но мой код возвращает эти ошибки:

PHP Notice:  Undefined variable: logNumber in /var/www/html/reactphp/test_react.php on line 23
PHP Notice:  Undefined variable: server in /var/www/html/reactphp/test_react.php on line 30

Я хочу принимать подключения от многих устройств (асинхронно) к заданному порту и ip и записывать данные, которые они отправляют мне в базу данных.

Есть ли лучший способ, чем ReaktPHP?

Я пытаюсь что-то вроде этого:

<?php
use React\MySQL\ConnectionInterface;
use React\MySQL\Factory;
use React\MySQL\QueryResult;
require_once __DIR__.'/vendor/autoload.php';
require_once 'socket_function.php';
$loop = React\EventLoop\Factory::create();
$factory = new React\Datagram\Factory($loop);
$factory->createServer('192.168.1.101:12345')->then(function (React\Datagram\Socket $server) {
    $server->on('message', function($buf, $address, $server) {
        echo 'client ' . $address . ': ' . $buf . PHP_EOL;
        $devId = ascii_decimal($buf, 0, 1);
        $logNumber = ascii_decimal($buf, 12, 15);
        $dbloop = React\EventLoop\Factory::create();
        $dbfactory = new Factory($dbloop);
        $uri = 'user:pass@localhost/dbname';
        $query = "SELECT * FROM devicesregistrator WHERE devid ='".$devId."' ORDER BY id ASC LIMIT 1";
        $dbfactory->createConnection($uri)->then(function (ConnectionInterface $connection) use ($query) {
        $connection->query($query)->then(function (QueryResult $result) {
            if (isset($result->resultRows[0]) and $result->resultRows[0] !== NULL ) {
                $device = $result->resultRows[0]['devid'];
                $logscheck = $result->resultRows[0]['logscheck'];
                if(isset($device) and $device !== NULL and $logNumber > $logscheck+1){
                    $myLogNumber = (int)$logscheck+1;
                    $command = decimal_ascii(83, $device, 0, $myLogNumber);
                }
                else{
                    $command = decimal_ascii(84, $device, 0, time());
                }
                $server->send($command);
            }
        }, function (Exception $error) {
            echo 'Error: ' . $error->getMessage() . PHP_EOL;
        });
        $connection->quit();
    }, 'printf');
    $dbloop->run();
   });
});
$loop->run();
?>  
...