как сделать таймер внутри сокета php - PullRequest
0 голосов
/ 27 июня 2018

это проблема, я пишу php-сокет, он работает как демон, каждый раз, и у меня есть клиентская сторона, клиент подключается, но каждые 30 секунд клиент автоматически отключается, это происходит потому, что сокет не отправляет сам строка (ka();) каждые 30 секунд, строка (ka ();) читается клиентом и поддерживает постоянное соединение, я пытался создать функцию внутри сокета, поэтому каждые 30 секунд пишите (ka (); ), но он не работает, он работает неправильно, он показывает (ka ();), если клиент отправляет что-либо в сокет, если клиентская сторона ничего не отправляет, сокет не отправляет что-либо.

работа сокета имеет CLI-окна демона, а на стороне клиента - просто javascript, когда сокет работает, он может быть напрямую принят навигатором и читать, что клиент отправляет, если клиент ничего не отправляет, сокету нужно написать (ka ();), так что она читается клиентской стороной и сохраняет связь и так бесконечно.

это скрипт сокета

error_reporting(1);
ini_set('display_errors', '1');
define('CON_IP', '127.0.0.1');
define('CON_PORT', 1000);
$socket      = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$max_clients = MAX_CLIENTS;
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, CON_IP, CON_PORT);
socket_listen($socket, $max_clients);
$clients = array(
    '0' => array(
        'socket' => $socket
    )
);
echo "Server running....\n\n";
echo "Server Started on : " . date('Y-m-d H:i:s') . "\n";
echo "Listening on      : " . CON_IP . " port " . CON_PORT . "\n";
echo ".... awaiting connections ...\n\n";
$session = (TRUE);
while ($session === TRUE) {
    $read[0] = $socket;
    for ($i = 1; $i < count($clients) + 1; ++$i) {
        if ($clients[$i] != NULL) {
            $read[$i + 1] = $clients[$i]['socket'];
        }
    }
    $ready = socket_select($read, $write = NULL, $except = NULL, $tv_sec = NULL);
    if (in_array($socket, $read)) {
        for ($i = 1; $i < $max_clients + 1; ++$i) {
            if (!isset($clients[$i])) {
                $clients[$i]['socket'] = socket_accept($socket);
                socket_getpeername($clients[$i]['socket'], $RemoteAddr, $RemotePort);
                $clients[$i]['ipadd'] = $RemoteAddr . ':' . $RemotePort;
                echo 'Incoming connection from ' . $clients[$i]['ipadd'] . "]\r\n";
                break;
            } elseif ($i == $max_clients - 1) {
                echo 'Clients Overload!' . "\r\n";
            }
            if ($ready < 1) {
                continue;
            }
        }
    }
    for ($i = 1; $i < $max_clients + 1; ++$i) {
        if (in_array($clients[$i]['socket'], $read)) {
            if (!$client[$i]['iframe']) {
                $data = @socket_read($clients[$i]['socket'], 1024, PHP_BINARY_READ);
            }
            if (substr($data, 0, 3) == 'GET' || substr($data, 0, 4) == 'POST' || substr($data, 0, 4) == 'OPTI') {
                $clients[$i]['iframe'] = true;
                echo 'Incoming connection from browser [' . $clients[$i]['ipadd'] . "]\r\n";
                socket_write($clients[$i]['socket'], "HTTP/1.1 200 OK\r\n");
                socket_write($clients[$i]['socket'], "Content-Type: text/html; charset=utf-8;\r\n");
                socket_write($clients[$i]['socket'], "Cache-Control: private\r\n\r\n");
                for ($z = 0; $z < 4096; $z++)
                $Brk = ("\n");
                $html = ('<!DOCTYPE html>' . $Brk);
                $html .= ('<html>' . $Brk);
                $html .= ('<head>' . $Brk);
                $html .= ('</head>' . $Brk);
                $html .= ('<body>' . $Brk);
                $html .= ('<script>' . $Brk);
                $html .= ('function recv(packets){}' . $Brk);
                $html .= ('</script>' . $Brk);
                $html .= ('</body>' . $Brk);
                socket_write($clients[$i]['socket'], $html);
            } else {
                if (trim($data) != '' && strlen(str_replace(' ', '', trim($data))) > 1) {
                        $msgs = ($data);
                }
            }
            if ($data === FALSE) {
                echo 'Incoming disconnection of ' . $clients[$i]['ipadd'] . "]\r\n";
                unset($clients[$i]);
                continue;
            }
            $data = trim($data);
            if (!empty($data)) {
                //LOGS
                if ($msgs) {
                    $ClientDumpLog = fopen('log/InputToSocket.txt', "a");
                    fwrite($ClientDumpLog, "$msgs\n");
                    fclose($ClientDumpLog);
                }
                //
                for ($j = 1; $j < $max_clients + 1; ++$j) {
                    if (isset($clients[$j]['socket']) and ($msgs !== NULL)) {
                        echo ('[' . $clients[$i]['ipadd'] . '] OK!' . "\r\n");
                        socket_write($clients[$j]['socket'], '<script>' . $msgs . "</script>\r\n");
                    }
                }
                break;
            }
        }
    }
}

EDIT:

это решение, я думаю, что это было, но нет, этот блок кода, для тестирования, записанный после этой строки:

for ($j = 1; $j < $max_clients + 1; ++$j) {


    $last_time = time();
while(true) {
if(time()-$last_time > 10) {
  echo ('[' . $clients[$i]['ipadd'] . '] KA!' . "\r\n");
  socket_write($clients[$j]['socket'], "ka();\r\n");
 $last_time = time();
 }
}     

когда я помещаю этот код, когда запускается сокет, он показывает каждое (выбранное время) в cli (KA!), Когда я обращаюсь по навигатору, он также показывает строку (ka ();), но когда на стороне клиента отправить что-то, что он никогда не показывает, это как строка (ka) или то, что отправляет клиент, но не оба одновременно. кто-нибудь знает какую-нибудь функцию или решение, чтобы оно работало?

1 Ответ

0 голосов
/ 29 июня 2018

Вы должны переопределить настройку максимального времени выполнения php.ini. Вы не должны изменять это в php.ini - вы должны изменить это поверх вашего кода:

<?php
set_time_limit(0);
//... your fancy code here...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...