Я пытаюсь включить сервер чата на моем сайте. Чтобы сделать это, я создал в своем контроллере функцию для запуска 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);
}