php之sockets多用户同时访问之io多路复用实现原理!

时间:2019-01-30
本文章向大家介绍php之sockets多用户同时访问之io多路复用实现原理!,主要包括php之sockets多用户同时访问之io多路复用实现原理!使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
server.php服务器端(务必看注释)

<?php


$address = "0.0.0.0";
$port = 8089;


// Create a TCP Stream socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $address, $port) or die('Could not bind to address');
socket_listen($socket);


#把所有的链接状态的socket(非活跃数据socket)加入到队列中!
$comn_sockets[] = $socket;
$write = null;
$except = null;


while (true){
    #这里必须拷贝一份$comn_sockets,因为socket_select函数是数组引用传参,会改变$copy_sockets的值!
    #PHP中的数组赋值是值拷贝,但是socket_select ( array &$read , array &$write , array &$except) 是引用地址!
    $copy_sockets = $comn_sockets;

    socket_select($copy_sockets, $write, $except, 0);
    foreach ($copy_sockets as $res_socket) {
        if ($res_socket === $socket) {
        #这里是把不活跃的socket通过挂起函数返回一个新的$new_socket,然后把新的$new_socket添加到原始链接队列$comn_sockets中!
            $new_socket = socket_accept($res_socket);
            socket_write($new_socket, "恭喜你和服务器已经链接成功!!!") . "\n";
            echo socket_read($new_socket, 1024) . "\n";
            $comn_sockets[] = $new_socket;
        } else {
        #已经链接成功且活跃的新$new_socket再一次发送请求(一次链接,永久双向传输)
            var_dump($res_socket);
            socket_write($res_socket, "服务器返回给你的数据如下:") . "\n";
            echo socket_read($res_socket, 1024) . "\n";
        }
    }
    
}


?>

 

clent.php客户端(socke_read函数会持续等待,所以先屏蔽了)

<?php 

$address = "127.0.0.1";
$port = 8089;

// Create a TCP Stream socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($socket, $address, $port);

#客户端的读会卡死,所以在测试和服务器多用户写的时候,暂时屏蔽了!
// $result = socket_read($socket, 1024);
// echo "客户端接收到的数据为${result}";
while (true){
    

    fwrite(STDOUT, '请输入内容');
    $msg = trim(fgets(STDIN));

    socket_write($socket, $msg, 1024);
    
}


?>