如何在套接字php

时间:2018-06-27 01:57:49

标签: php sockets timer

这是问题,我每次写一个php套接字,它作为守护程序工作,而且我有一个客户端,客户端连接,但是每30秒客户端会自动断开连接,这是因为套接字不发送自己每隔30秒一行(ka();),客户端会读取(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;
            }
        }
    }
}

编辑:

这个解决方案,我认为是,但不是,要测试的此代码块是在此行之后编写的:

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 :(得分:0)

您必须覆盖php.ini的最大执行时间设置。您不应该在php.ini中更改它-您应该在代码之上更改它:

<?php
set_time_limit(0);
//... your fancy code here...