我们先使用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\r\nHost: www.qq.com\r\n\r\n"); swoole_event_add($fp, function($fp) {
$resp = fread($fp, 8192);
//socket处理完成后,从epoll事件中移除socket
swoole_event_del($fp);
fclose($fp);
});
echo "Finish\n"; //swoole_event_add不会阻塞进程,这行代码会顺序执行

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

swoole的EventLoop学习的更多相关文章

  1. Netty(七):EventLoop学习前导——Reactor模式

    了解Netty的人多少都会知道Netty的高性能的一个原因就是它是基于事件驱动的,而这一事件的原型就是Reactor模式. 所以在学习EventLoop前,很有必要先搞懂Reactor模式. 本文目录 ...

  2. swoole在线聊天学习笔记

    <?php $http=); $http->on('request',function(swoole_http_request $request,swoole_http_response ...

  3. Swoole笔记(四)

    Process Process是swoole内置的进程管理模块,用来替代PHP的pcntl扩展. swoole_process支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读 ...

  4. swoole之 swoole_process 应用于TP框架

    swoole_process 实现了多进程的管理,多个进程同时进行采集任务, 公司的框架比较low,用的tp框架,结合tp框架实现多进程的采集 这是swoole好的学习资源 https://segme ...

  5. Swoole入门到实战 打造高性能 赛事直播平台(完整版)

    Thinkphp+Swoole入门到实战打造高性能赛事直播平台 第1章 课程介绍 欢迎大家来到swoole的课程!本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司 ...

  6. 手撸基于swoole 的分布式框架 实现分布式调用(20)讲

    最近看的一个swoole的课程,前段时间被邀请的参与的这个课程 比较有特点跟一定的深度,swoole的实战教程一直也不多,结合swoole构建一个新型框架,最后讲解如何实现分布式RPC的调用. 内容听 ...

  7. PHP码农在Golang压力下的生存之道-PHP性能优化实践

    随着国内Golang的火爆,phper的生存压力越来越大,在一次内部技术讨论中,gopher甚至提出,要什么php,写php的全部开掉,唉,码农何苦为难码农. 本文试图寻找一种有效实践,减少php w ...

  8. PHP之高性能I/O框架:Libevent(三)

    Swoole Swoole里也提供了一些直接操作底层epoll/kqueue事件循环的接口,可将其他扩展创建的socket.PHP代码中stream/socket扩展创建的socket等加入到Swoo ...

  9. Event IO Process

    先了解一下process和event loop EventLoop 除了异步Server和Client库之外,Swoole扩展还提供了直接操作底层epoll/kqueue事件循环的接口.可将其他扩展创 ...

随机推荐

  1. 学习shell脚本之前的基础知识(一)(学习记录帖)

    记录命令历史:我们敲过的命令,linux会有记录,保存在家目录的.bash_history文件中.(备注:只有用户正常退出当前shell时,当前命令才会保存在.bash_history文件中) “  ...

  2. 05_ssm基础(二)之mybatis优化

    06.mybatis优化之Mybatis工具类提取 优化原则(见官方文档): mybatis工具类存放位置: mybatis工具类代码: package com.day01.ssm.mybatisDe ...

  3. JAVA声明一个对象数组

    Student stu[]=new Student[N]; Student stu={new Student(),~~~}; JAVA类型转换 String转为float String转为INT

  4. 四 sys模块

    1 sys.argv 命令行参数List,第一个元素是程序本身路径 2 sys.exit(n) 退出程序,正常退出时exit(0) 3 sys.version 获取Python解释程序的版本信息 4 ...

  5. 树的子结构(python)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) # -*- coding:utf-8 -*- # class TreeNode: # def __ ...

  6. 100. Same Tree (Tree;DFS)

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  7. httpclient使用用例

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...

  8. decay

    decay - 必应词典 美[dɪ'keɪ]英[dɪ'keɪ] v.衰减:腐朽:衰败 n.腐烂:衰退:腐朽 网络衰变:腐败 变形过去分词:decayed:现在分词:decaying:第三人称单数:de ...

  9. RocketMq顺序消费

    部分内容出处   https://www.jianshu.com/p/453c6e7ff81c rocketmq内部有4个默认的队里,在发送消息时,同一组的消息需要按照顺序,发送到相应的mq中,同一组 ...

  10. 微信小程序开发——设置默认图片、错误加载图片

    小程序不支持h5中的onerrorimg,只开放了binderror属性,当错误发生时,会发布到 AppService,事件对象event.detail = {errMsg: 'something w ...