之前一直认为workerman源码理解起很复杂,这段时间花了3个下午研究,其实只要理解 php如何守护化进程、信号、多进程、libevent扩展使用,对于如何实现就比较轻松了。

相关代码都在github地址里,具体注释都有。

守护化进程:
http://www.cnblogs.com/loveyouyou616/p/7867132.html
http://www.cnblogs.com/loveyouyou616/p/8881531.html
https://github.com/zhaocong222/workerman-learn/tree/master/test/daemon 信号与多进程:
http://www.cnblogs.com/loveyouyou616/p/8854835.html
https://github.com/zhaocong222/workerman-learn/tree/master/test/signal%26%26fork libevent扩展使用:
https://github.com/zhaocong222/workerman-learn/tree/master/test/libevnt 以下为workerman读取socket数据的最简原型
<?php
$eventBase = new EventBase();
$arr = []; function add($fd,$func){ global $arr,$eventBase;
$event = new Event($eventBase, $fd, Event::READ | Event::PERSIST, $func, $fd); if (!$event||!$event->add()) {
return false;
} //关键点1
$arr[posix_getpid()][] = $event;
}
function baseRead($socket){
$buffer = @fread($socket, 2);
echo $buffer."\n";
} function acceptConnection($socket){ $new_socket = @stream_socket_accept($socket, 0);
// Thundering herd.
if (!$new_socket) {
return;
} stream_set_blocking($new_socket, 0);
//关键点2
stream_set_read_buffer($new_socket, 0); add($new_socket,'baseRead');
} $socketmain = stream_socket_server('tcp://127.0.0.1:4455', $errno, $errmsg, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
//非阻塞
stream_set_blocking($socketmain,0); add($socketmain,'acceptConnection'); $eventBase->loop();

重点,重点,重点

ps: 这里需要注意2点,我就是在这2点琢磨了好久。

1. event实例一定要存放在一个全局数组里面 (应该是出了函数作用域就销毁了)

2. 如果fwrite的数据要大于 fread 设置的大小,要加上  stream_set_read_buffer($new_socket, 0);   读取stream时需要设置为无缓冲区

通过telnet来设置:

服务端打印的数据如下:

通过上面的代码 结合 信号 以及多进程 最后就是workerman的核心部分。

												

WorkerMan源码分析 - 实现最简单的原型的更多相关文章

  1. workerman源码分析之启动过程

    PHP一直以来以草根示人,它简单,易学,被大量应用于web开发,非常可惜的是大部分开发都在简单的增删改查,或者加上pdo,redis等客户端甚至分布式,以及规避语言本身的缺陷.然而这实在太委屈PHP了 ...

  2. 容器_JDK源码分析_自己简单实现ArrayList容器

    这几天仔细研究下关于ArrayList容器的jdk源码,感觉收获颇多,以前自己只知道用它,但它里面具体是怎样实现的就完全不清楚了.于是自己尝试模拟写下java的ArrayList容器,简单了实现的Ar ...

  3. Flink源码分析 - 剖析一个简单的Flink程序

    本篇文章首发于头条号Flink程序是如何执行的?通过源码来剖析一个简单的Flink程序,欢迎关注头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech) ...

  4. WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)

    WorkerMan中work.php中 resetStd 方法中代码如下 public static function resetStd() { if (!static::$daemonize || ...

  5. Spring源码分析 手写简单IOC容器

    Spring的两大特性就是IOC和AOP. IOC Container,控制反转容器,通过读取配置文件或注解,将对象封装成Bean存入IOC容器待用,程序需要时再从容器中取,实现控制权由程序员向程序的 ...

  6. muduo源码分析之muduo简单运用

    今天不先实现muduo项目,我们先来看下muduo库的基本使用,只有了解了如何用,才能在写代码的时候知道自己写的找个函数是干嘛的,实际上是怎么使用的这个函数.首先说简单点,就是定义一个Server,设 ...

  7. jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)

    在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...

  8. Mybatis源码分析-BaseExecutor

    根据前文Mybatis源码分析-SqlSessionTemplate的简单分析,对于SqlSession的CURD操作都需要经过Executor接口的update/query方法,本文将分析下Base ...

  9. Flask系列之源码分析(一)

    目录: 涉及知识点 Flask框架原理 简单示例 路由系统原理源码分析 请求流程简单源码分析 响应流程简单源码分析 session简单源码分析 涉及知识点 1.装饰器 闭包思想 def wapper( ...

随机推荐

  1. docker之手动构建新的镜像

    转自:https://www.cnblogs.com/jsonhc/p/7766561.html 查看本地现有镜像: [root@docker ~]# docker images REPOSITORY ...

  2. How to Pronounce We’ll Contraction

    How to Pronounce We’ll Contraction Share Tweet Share Tagged With: WILL Contractions There are severa ...

  3. Linux Install redis

    1.将下载好的压缩包放到/usr/local目录下# tar xzf redis-3.0.2.tar.gz # cd redis-3.0.2 # make//--------------------- ...

  4. thinkphp的PHPexecl表格样式设置

    /** * 以下是使用示例,对于以 //// 开头的行是不同的可选方式,请根据实际需要 * 打开对应行的注释. * 如果使用 Excel5 ,输出的内容应该是GBK编码. */ //require_o ...

  5. [图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]

    [图解tensorflow源码] 入门准备工作 附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html  tensorf ...

  6. GankApp 侧滑和title修改颜色的完整项目app

    GankApp 侧滑和title修改颜色的完整项目app GankApp 侧滑和title修改颜色的完整项目app,本项目主要由侧滑框架和4.4以及以上的头部title颜色调整和, 首页viewpag ...

  7. ABAP 常用函数

    函数名 描述 SD_VBAP_READ_WITH_VBELN 根据销售订单读取表vbap中的信息EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“*”重新组织VI ...

  8. VUE 关于理解$nextTick()的问题

    Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM.this.$nextTick()官方介绍:将回调延迟到下次 DOM 更新循环之后执行.在修改数据之后立即使用它,然后等待 ...

  9. hive mysql 初始化

    原文链接:https://juejin.im/post/59c3f8f75188255be81f91d9#heading-17 Apache Hive-2.3.0 快速搭建与使用 Hive 简介 Hi ...

  10. React中innerHTML的坑

    [React中innerHTML的坑] 通过React Ref机制返回的对象,是一个阉割的DOM对象,并非原始DOM对象.比如,这个阉割版的DOM对象没有innerHTML对象. <button ...