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

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

守护化进程:http://www.cnblogs.com/loveyouyou616/p/7867132.htmlhttp://www.cnblogs.com/loveyouyou616/p/8881531.htmlhttps://github.com/zhaocong222/workerman-learn/tree/master/test/daemon

信号与多进程:http://www.cnblogs.com/loveyouyou616/p/8854835.htmlhttps://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);//关键点2stream_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的核心部分。

转载于:https://www.cnblogs.com/loveyouyou616/p/8918846.html

WorkerMan源码分析 - 实现最简单的原型相关推荐

  1. v57.02 鸿蒙内核源码分析(编译过程) | 简单案例说透中间过程 | 百篇博客分析HarmonyOS源码

    子畏于匡,颜渊后.子曰:"吾以女为死矣."曰:"子在,回何敢死?" <论语>:先进篇 百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译 ...

  2. python运行不了程序代码_Python源码分析2 - 一个简单的Python程序的执行

    本文主要通过跟踪一个非常简单的Python程序的执行,简单讨论Python实现的基本框架和结构. 要执行Python程序如下,功能非常简单:从1加到10再打印出来 # test program sum ...

  3. python用一行代码编写一个回声程序_Python源码分析2 - 一个简单的Python程序的执行...

    本文主要通过跟踪一个非常简单的Python程序的执行,简单讨论Python实现的基本框架和结构. 要执行Python程序如下,功能非常简单:从1加到10再打印出来 # test program sum ...

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

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

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

    2019独角兽企业重金招聘Python工程师标准>>> http://www.cnblogs.com/CpNice/p/4714182.html 转载于:https://my.osc ...

  6. android 浏览器源码分析,android webview 简单浏览器实现代码

    文件main.java package com.HHBrowser.android; import android.app.Activity; import android.os.Bundle; im ...

  7. v58.03 鸿蒙内核源码分析(环境脚本) | 编译鸿蒙原来很简单 | 百篇博客分析HarmonyOS源码

    颜渊问仁.子曰:"克己复礼为仁.一日克己复礼,天下归仁焉.为仁由己,而由人乎哉?"颜渊曰:"请问其目."子曰:"非礼勿视,非礼勿听,非礼勿言,非礼勿动 ...

  8. vue-org-tree 组织结构图组件应用及源码分析

    需求: 最近业务需要做类似思维导图的组织结构树功能,需要能动态增删改节点,且每层的节点样式并不相同 可用插件: 网上能找到的组织结构图插件有: 1.orgchart.js 地址:https://git ...

  9. v50.03 鸿蒙内核源码分析(编译环境) | 编译鸿蒙防掉坑指南 | 百篇博客分析HarmonyOS源码

    颜渊死.子曰:"噫!天丧予!天丧予!" <论语>:先进篇 百篇博客系列篇.本篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 编译构建相关篇 ...

  10. v59.04 鸿蒙内核源码分析(构建工具) | 顺瓜摸藤调试构建过程 | 百篇博客分析HarmonyOS源码

    仲弓问仁.子曰:"出门如见大宾,使民如承大祭.己所不欲,勿施于人.在邦无怨,在家无怨."仲弓曰:"雍虽不敏,请事斯语矣." <论语>:颜渊篇 百篇博 ...

最新文章

  1. (转)如何用U盘创建Linux系统盘
  2. mysql排序规则错误_MySQL中“非法混合排序规则”错误的疑难解答
  3. 15款Cocos2d-x游戏源码
  4. IO流 (二) ----- 文件流
  5. 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?
  6. oracle使用between and边界问题
  7. Zabbix钉钉机器人报警
  8. oracle j2ee数据库,J2EE连接远程Oracle数据库表
  9. 罗斯蒙特流量计指示故障的原因
  10. 查看CAD图纸时怎么将文字隐藏
  11. 零基础学习3d建模需要多久?
  12. VC++连接wifi功能(有密码)源代码
  13. tensorflow padded_batch的注意事项
  14. OpenGL学习(1)
  15. 移动端使用a标签tel属性实现拨打电话
  16. 魅族的云相册能克隆到华为手机吗_魅族云服务如何导出导入 换手机flyme云导出相册...
  17. SpringMVC之CRUD和文件上传下载
  18. >>技术开发:轻量级BI工具Superset
  19. Linux高级进程编程———在任意两个进程间传递文件描述符:使用 sendmsg 和 recvmsg 实现
  20. Qt windows端的蓝牙串口服务

热门文章

  1. Security+ 学习笔记52 风险管理
  2. 浅议组播(一文看懂组播)
  3. shell 第六次作业(grep正则、sed)
  4. PyCharm 2020.2.3复制粘贴及删除键修正
  5. 解析Health端点数据获取异常数据
  6. kill 与 killall和过滤后杀掉
  7. Android Studio一直显示Building“project name”Gradle project info问题详解
  8. 【技术帖】Apache Kylin 高级设置:层级维度(Hierarchy Dimension)原理
  9. (未完毕)电子设计省赛--2013年国赛题
  10. jQuery 调用后台方法