Как что-то проверять каждую минуту, а потом отправлять клиенту? - PullRequest
0 голосов
/ 05 мая 2020

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

<?php
set_time_limit(0);

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
require_once '../vendor/autoload.php';

class Chat implements MessageComponentInterface {
    protected $clients;
    protected $users;

    public function __construct() {
        $this->clients = new \SplObjectStorage;






    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
         $this->users[$conn->resourceId] = $conn;



    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
         unset($this->users[$conn->resourceId]);
    }



    public function onMessage(ConnectionInterface $from,  $data) {
        $from_id = $from->resourceId;
        $data = json_decode($data);
        $type = $data->type;
        switch ($type) {
            case 'test':
                $user_id = $data->user_id;
                $chat_msg = $data->chat_msg;
                $response_from = "<span style='color:#999'><b>".$user_id.":</b> ".$chat_msg."</span><br><br>";
                $response_to = "<b>".$user_id."</b>: ".$chat_msg."<br><br>";
                // Output
                $from->send(json_encode(array("type"=>$type,"msg"=>$response_from)));
                foreach($this->clients as $client)
                {
                    if($from!=$client)
                    {
                        $client->send(json_encode(array("type"=>$type,"msg"=>$response_to)));
                    }
                }
                break;
            case 'chat':
                $user_id = $data->user_id;
                $chat_msg = $data->chat_msg;
                $response_from = "<span style='color:#999'><b>".$user_id.":</b> ".$chat_msg."</span><br><br>";
                $response_to = "<b>".$user_id."</b>: ".$chat_msg."<br><br>";
                // Output
                $from->send(json_encode(array("type"=>$type,"msg"=>$response_from)));
                foreach($this->clients as $client)
                {
                    if($from!=$client)
                    {
                        $client->send(json_encode(array("type"=>$type,"msg"=>$response_to)));
                    } 
                }
                break;  
        }
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        $conn->close();
    }
}





$server = IoServer::factory(
    new HttpServer(new WsServer(new Chat())),
    8080
);
$server->run();
?>

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

У вас должны быть открытые связи с клиентами, чтобы отправлять им какие-либо данные. Есть два способа сделать это:

  1. Данные запроса каждую минуту от клиента, const - с 1000 клиентов вы получите 1000 запросов в минуту

  2. Используйте веб-сокет. Например, используйте библиотеку https://socket.io/, очень просто и легко начать. Минусы: нужно писать эту часть сайта на nodejs.

0 голосов
/ 05 мая 2020

Одно решение:

Напишите сценарий unix cron или windows запланированную задачу для запуска кода php каждую минуту.

...