workerman源码分析-实现最简单的原型(代码片段)

睡着的糖葫芦 睡着的糖葫芦     2022-11-05     157

关键词:

之前一直认为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的核心部分。


300行abap代码实现一个最简单的区块链原型

...的这篇文章没有任何高大上的术语,就是300行ABAP代码,实现一个最简单的区块链原型。我个人觉得,同区块链本身的实现技术相比,更难的事情是如何找到一个合适的业务场景,把区块链集成到SAP产品中去,让它发挥出作用。... 查看详情

workerman源码分析

worker类分析:1.构造方法/***Construct.**@paramstring$socket_name*@paramarray$context_option*/publicfunction__construct($socket_name=‘‘,$context_option=array()){//Saveallworkerinstances.//在这里目的就是当前woker对象hash化 查看详情

使用workerman实现在线聊天-第一版

workerman是一个php编写的通讯服务。之前的项目都是用它做数据接口服务这次用它做一个简单的在线聊天室~ 1.下载最新版本的workerman可以去 http://www.workerman.net去下载我这里将service和client分开了两个文件夹,方便管理大致... 查看详情

nopcommerce源码架构学习-二单例模式实现代码分析

...一个IEngine的单例对象的访问方式。下面就是EngineContext的源码:一、E 查看详情

dialogfragment源码分析(代码片段)

目录介绍1.最简单的使用方法1.1官方建议1.2最简单的使用方法1.3DialogFragment做屏幕适配2.源码分析2.1DialogFragment继承Fragment2.2onCreate(@NullableBundlesavedInstanceState)源码分析2.3setStyle(@DialogStyleintstyle,@StyleResinttheme)2.4onActivit 查看详情

线程池源码分析-threadpoolexecutor(代码片段)

#1系列目录线程池接口分析以及FutureTask设计实现线程池源码分析-ThreadPoolExecutor该系列打算从一个最简单的Executor执行器开始一步一步扩展到ThreadPoolExecutor,希望能粗略的描述出线程池的各个实现细节。针对JDK1.7中的线程池#2ThreadP... 查看详情

popupwindow源码分析(代码片段)

...1.2显示PopupWindow1.3最简单的创建1.4注意问题宽和高属性2.源码分析2.1setContentView(ViewcontentView)2.2showAsDropDown()源码2.3dismiss()源码分析2.4PopupDecorView源码分析3.经典总结3.1PopupWindow和Dialog有什么区别? 查看详情

snackbar源码分析(代码片段)

...法1.1Snackbar作用1.2最简单的创建1.3Snackbar消失的几种方式2.源码分析2.1Snackbar的make方法源码分析2.2对Snackbar属性进行设置2.3Snackbar的show显示与点击消失2.4显示和隐藏中动画源码分析3.经典总结3.1Snackbar和SnackbarManager类的设计4.思考问... 查看详情

toast源码深度分析(代码片段)

...免重复创建1.4为何会出现内存泄漏1.5吐司是系统级别的2.源码分析2.1Toast(Contextcontext)构造方法源码分析2.2show()方法源码分析2.3mParams.token=windowToken是干什么用的2.4scheduleTimeoutLocked吐司如何自动销毁的2.5TN类中的消 查看详情

线程池源码分析-futuretask(代码片段)

#1系列目录线程池接口分析以及FutureTask设计实现线程池源码分析-ThreadPoolExecutor该系列打算从一个最简单的Executor执行器开始一步一步扩展到ThreadPoolExecutor,希望能粗略的描述出线程池的各个实现细节。针对JDK1.7中的线程池#2Executo... 查看详情

workerman实现简单弹幕的方法

...观看视频时弹出的评论性字幕。下面我们就来看一下使用workerman实现简单弹幕的方法。怎么从一名码农成为架构师的必看知识点:目录大全(持续更新)50W年薪挑战!?php代码:<?phpuseWorkermanWorker;require_once‘../Autoloader.php‘;//注... 查看详情

史上最浅显易懂的rxjava入门教程

...法很简单,但内部实现有点复杂,代码逻辑有点绕。我读源码时,确实有点似懂非懂的感觉。网上关于RxJava源码分析的文章,源码贴了一大堆,代码逻辑绕来绕去的,让人看得云里雾里的。既然用拆轮子的方式来分析源码比较难... 查看详情

spring源码分析-2spring的简单使用和原理分析(代码片段)

...lBeanFactory的简单使用从一个简单的demo开始,作为Spring源码分析的入口ÿ 查看详情

最简单的模块源码分析

一、常用的模块操作命令(1)lsmod(listmodule,将模块列表显示),功能是打印出当前内核中已经安装的模块列表(2)insmod(installmodule,安装模块),功能是向当前内核中去安装一个模块,用法是insmodxxx.ko(3)modinfo(moduleinformation,模块信... 查看详情

全网最详细的javaweb用户管理系统(详细源码讲解)(小白也行)(代码片段)

基于Javaweb的用户管理系统开发(可直接跳到实现步骤)(小白也行)1、业务及其需求分析1、实现以下功能2、使用以下技术2、简单成品展示1、登录功能与简单界面2、页面查询功能3、添加功能4、单个用户删除功能5、... 查看详情

tomcatjdbcpool源码实现简单分析(代码片段)

什么是连接池?池,不由自主的会想到水池。小时候,我们都要去远处的水井挑水,倒进家中的水池里面。这样,每次要用水时,直接从水池中「取」就行了。不用大老远跑去水井打水。数据库连接池就如... 查看详情

(最简单易懂的实现)pat甲级--stack(30)(代码片段)

文章目录题目题目分析代码详解栈的数据结构实现输入数据和问题解决处理整合代码进行提交更多PAT甲级题解–acking-you.gtihub.io题目OJ平台题目分析关键就是要我们实现以下这个操作:PeekMedian–returnthemedianvalueofalltheelementsinthe... 查看详情

原型链(代码片段)

JavaScript中实现继承最简单的方式就是使用原型链,将子类型的原型指向父类型的实例即可,即“子类型.prototype=new父类型();”,实现方法如下:复制代码//为父类型创建构造函数functionSuperType()this.name=[‘shiyun‘,‘Bob‘,‘Tom‘];thi... 查看详情