Laravel предотвратить тайм-аут в функции контроллера - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь включить сервер чата на моем сайте. Чтобы сделать это, я создал в своем контроллере функцию для запуска ChatServer, который я вызываю по маршруту, но через 5 минут тайм-аут закрывает мой сокет, поэтому мне нужно его повторно запустить. Есть ли способ предотвратить тайм-аут в определенной функции?

public function startServer(){
        set_time_limit(0);
        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, 1);
        socket_bind($this->socket, 0, $this->port);
        socket_listen($this->socket);
        $this->clients = array($this->socket);
        while (true) {
            $changed = $this->clients;
            socket_select($changed, $null, $null, 0, 10);
            if(in_array($this->socket, $changed)){
                $socket_new = socket_accept($this->socket);
                $this->clients[] = $socket_new;
                $header = socket_read($socket_new, 1024);
                $this->perform_handshaking($header, $socket_new, $this->host, $this->port);
                socket_getpeername($socket_new, $ip);
                $response = $this->mask(json_encode(array('type'=>'system', 'message'=>$ip.' connected')));
                $this->send_message($response);
                $found_socket = array_search($this->socket, $changed);
                unset($changed[$found_socket]);
            }
            foreach ($changed as $changed_socket) {
                while(socket_recv($changed_socket, $buf, 1024, 0) >= 1)
                {
                    $received_text = $this->unmask($buf);
                    $tst_msg = json_decode($received_text);
                    if($tst_msg != null){
                        $user_name = $tst_msg->name;
                        $user_message = $tst_msg->message;
                        $user_color = $tst_msg->color;
                        $response_text = $this->mask(json_encode(array('type'=>'usermsg', 'name'=>$user_name, 'message'=>$user_message, 'color'=>$user_color)));
                        $this->send_message($response_text);
                    }
                    break 2;
                }
                $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
                if ($buf === false) {
                    $found_socket = array_search($changed_socket, $this->clients);
                    socket_getpeername($changed_socket, $ip);
                    unset($this->clients[$found_socket]);
                    $response = $this->mask(json_encode(array('type'=>'system', 'message'=>$ip.' disconnected')));
                    $this->send_message($response);
                }

            }
        }
        socket_close($sock);
    }

1 Ответ

1 голос
/ 18 апреля 2020

Сокеты лучше всего реализовывать с помощью внешней библиотеки. Храповик может быть тем, что вы ищете.

http://socketo.me/

Также для автоматического перезапуска сценария c на вашем сервере попытайтесь реализовать supervisord.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...