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\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学习的更多相关文章
- Netty(七):EventLoop学习前导——Reactor模式
了解Netty的人多少都会知道Netty的高性能的一个原因就是它是基于事件驱动的,而这一事件的原型就是Reactor模式. 所以在学习EventLoop前,很有必要先搞懂Reactor模式. 本文目录 ...
- swoole在线聊天学习笔记
<?php $http=); $http->on('request',function(swoole_http_request $request,swoole_http_response ...
- Swoole笔记(四)
Process Process是swoole内置的进程管理模块,用来替代PHP的pcntl扩展. swoole_process支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读 ...
- swoole之 swoole_process 应用于TP框架
swoole_process 实现了多进程的管理,多个进程同时进行采集任务, 公司的框架比较low,用的tp框架,结合tp框架实现多进程的采集 这是swoole好的学习资源 https://segme ...
- Swoole入门到实战 打造高性能 赛事直播平台(完整版)
Thinkphp+Swoole入门到实战打造高性能赛事直播平台 第1章 课程介绍 欢迎大家来到swoole的课程!本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司 ...
- 手撸基于swoole 的分布式框架 实现分布式调用(20)讲
最近看的一个swoole的课程,前段时间被邀请的参与的这个课程 比较有特点跟一定的深度,swoole的实战教程一直也不多,结合swoole构建一个新型框架,最后讲解如何实现分布式RPC的调用. 内容听 ...
- PHP码农在Golang压力下的生存之道-PHP性能优化实践
随着国内Golang的火爆,phper的生存压力越来越大,在一次内部技术讨论中,gopher甚至提出,要什么php,写php的全部开掉,唉,码农何苦为难码农. 本文试图寻找一种有效实践,减少php w ...
- PHP之高性能I/O框架:Libevent(三)
Swoole Swoole里也提供了一些直接操作底层epoll/kqueue事件循环的接口,可将其他扩展创建的socket.PHP代码中stream/socket扩展创建的socket等加入到Swoo ...
- Event IO Process
先了解一下process和event loop EventLoop 除了异步Server和Client库之外,Swoole扩展还提供了直接操作底层epoll/kqueue事件循环的接口.可将其他扩展创 ...
随机推荐
- eclipse 连接数据库记录
两篇很好的文章介绍给大家: Eclipse使用JDBC方式连接SQLServer2016 通过Driver与DriverManager连接数据库 --------------------------- ...
- Eclipse绿豆沙护眼
Window-->Preferences-->Editors——>Text Editors —— Background color 背景颜色向你推荐:色调:85.饱和度:123.亮度 ...
- java容器的理解(collection)
容器类(Conllection)对于一个开发者来说是最强大的工具之一,可以大幅提高编程能力.容器是一个将多个元素组合到一个单元的对象,是代表一组对象的对象,容器中的对象成为它的元素. 容器适用于处理各 ...
- appium+python自动化测试
appium+python自动化测试 标签(空格分隔): appium 获取APP的包名 1.aapt即Android Asset Packaging Tool,在SDK的build-tools目录下 ...
- php使用redis扩展以及安装redis(linux下)
一,安装redis 1,下载redis包:wget http://download.redis.io/releases/redis-2.8.9.tar.gz 2,解压redis包后,进入redis-2 ...
- Camstar :新加的modeling对象没有在 modeling的下拉框中显示
解决: 对象的maint 的 advance option client ui 要打上勾.
- JS的6种常见继承模式
数天前在知乎看到有人阿里面试被问到这个问题,我来总结一下. 1. 原型链继承: function SuperType() { this.property = true; } SuperType.pro ...
- linux下访问window的共享文件,在命令行实现方法
1.挂载共享目录 mount -t cifs //192.168.0.1/aa /tmp/export -o username=text,password=test //192.168.0.1/aa ...
- lower_bound和upper_bound的实现和基本用法
最近一直在学dp,但是感觉进度明显慢了很多,希望自己可以加一把劲,不要总是拖延了... 在LIS的优化中我遇到了二分查找的问题,之前也知道lower_bound和upper_bound两个函数,但是没 ...
- Shell教程 之流程控制
1. if else 1.1 if if语句语法格式: if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): if ...