zoukankan      html  css  js  c++  java
  • swoole的EventLoop学习

    我们先使用php来写一个socket的服务端。先从最开始的模型开始将起逐步引申到为何要使用eventloop

    1.最简单的socket服务端,直接按照官方文档来执行

    <?php 
    
    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    
    socket_bind($sock, "127.0.0.1",9511);
    
    socket_listen($sock);
    
    for ( ; ; ) {
        $conn = socket_accept($sock);
    
        $write_buffer = "hello word";
    
        socket_write($conn, $write_buffer);
       sleep(60);
        socket_close($conn);
    }

    执行telnet测试

    然后再开一个telnet去请求,你会发现没有返回被阻塞了,这个就是这个原型的缺点。在一个tcp请求没有处理结束后会被阻塞。那这肯定不行。介绍下下一个多进程方式的服务器。

    <?php
    $sock = stream_socket_server("tcp://127.0.0.1:9511", $errno, $errstr);
    
    $pids = [];
    
    for ($i=0; $i<10; $i++) {
    
        $pid = pcntl_fork();
        $pids[] = $pid;
    
        if ($pid == 0) {
            for ( ; ; ) {
                $conn = stream_socket_accept($sock);
    
                $write_buffer = "hello!world";
    
                fwrite($conn, $write_buffer);
                sleep(60);
                fclose($conn);
            }
    
            exit(0);
        }
    
    }
    
    foreach ($pids as $pid) {
        pcntl_waitpid($pid, $status);
    }

    运行后开启2个telnet客户端,你会发现即使是一个客户端还没关闭连接,另外的也能发起请求拿到返回值。但是这样也会有新的问题。io还是压力很大,要解决问题的在不能优化逻辑代码的情况下,只有多添加进程数来解决。但是进程是很昂贵的资源。那就引申出了php的libevent。这里就不做介绍了,我们直接使用swoole的eventloop. 其实swoole的server已经是这种模型了,所以就直接贴一个官方的示例

    $fp = stream_socket_client("tcp://www.qq.com:80", $errno, $errstr, 30);
    fwrite($fp,"GET / HTTP/1.1
    Host: www.qq.com
    
    ");
    
    swoole_event_add($fp, function($fp) {
        $resp = fread($fp, 8192);
        //socket处理完成后,从epoll事件中移除socket
        swoole_event_del($fp);
        fclose($fp);
    });
    echo "Finish
    ";  //swoole_event_add不会阻塞进程,这行代码会顺序执行

    就是使用了swoole_event_add添加了读的事件回调,在读取完成后直接删除掉时间回调。一次请求就结束了。

  • 相关阅读:
    Windows Server 2003 IIS 使用 Excel.Application
    AutoCAD2008换硬盘后重新激活
    730KII 打印机 Win7 2017年11月更新系统补丁后无法打印
    军训卫生巾鞋垫尺码简易参考
    电阻功率与电流关系
    万用表判断场效应管的好坏
    避免电路接触时火花的产生
    phpexcel如何读和写大于26列的excel
    铅酸蓄电池正确使用与充电管理
    铅酸蓄电池单格最高与最低电压
  • 原文地址:https://www.cnblogs.com/gavinjunftd/p/9145564.html
Copyright © 2011-2022 走看看