swoole
lcli
这个作者很懒,什么都没留下…
展开
-
利用swoole多进程压测服务框架dubbo-php-framework
因工作需要,近期对dubbo-php-framework进行了压测,重点是看dubbo-php-framework本身的性能,故直接在本地虚拟机上做了压测,provider和consumer都是同台虚拟机上执行。测试的场景为1k字符串的原样返回,即发1k字符串请求到provider,provider不做处理,原样返回。测试代码如下:$s = new ProcessPool();$s...原创 2019-03-01 20:15:32 · 482 阅读 · 0 评论 -
swoole源码分析之swoole_buffer的append操作
swoole_buffer提供的append操作用于将一个字符串数据追加到缓存区末尾。int swoole_buffer->append(string $data);$data是要写入的数据,支持二进制内容 执行成功后,会返回新的长度下面我们分析下其流程。static PHP_METHOD(swoole_buffer, append){ swString st...原创 2018-10-06 17:25:46 · 212 阅读 · 0 评论 -
swoole源码解析之swoole_buffer的创建过程
swoole提供了一个swoole_buffer类(代码位于swoole_buffer.c中),让PHP开发者可以像C一样直接读写内存,提升程序的性能,又不用担心内存越界。swoole_buffer会检测offset,但是swoole_buffer提供的内存空间不是共享内存形式的,不可以在多个进程间共享,swoole_buffer提供了两个属性如下。swoole_buffer->$len...原创 2018-10-06 16:24:01 · 420 阅读 · 0 评论 -
swoole_client源码解析之recv数据
这篇我们分析swoole_client客户端读取数据的过程,从connect过程的代码可以看出,swClient在connect过程中设置了各种其他动作的回调函数,这里我们分析swoole_client的recv函数的主流程,同时把底层回调函数实现也关注下。 目前swoole客户端支持业务侧设置拆包策略,这里所谓的拆包是指,TCP是流式协议,也就是没有边界的概念,这个边界往往是由业务去确定的,...原创 2018-09-27 22:59:12 · 1289 阅读 · 0 评论 -
swoole_client源码解析之send数据
前面我们分析了客户端swoole_client的connect过程,从里面代码可以看出,swClient在connect过程中设置了各种其他动作的回调函数,这里我们接着分析余下的流程,同时把回调函数实现也关注下。//swoole_client的send函数实现static PHP_METHOD(swoole_client, send){ char *data; zend_...原创 2018-09-27 22:33:55 · 1184 阅读 · 0 评论 -
swoole源码解析之swoole_lock的unlock操作
swoole_lock提供的unlock操作用于释放锁,其调用原型如下。$lock->unlock();下面我们分析下其调用流程。static PHP_METHOD(swoole_lock, unlock){ swLock *lock = swoole_get_object(getThis());//获取内部封装对象 SW_LOCK_CHECK_RETURN...原创 2018-10-04 16:02:28 · 257 阅读 · 0 评论 -
swoole源码解析之swoole_lock的lock操作
swoole_lock提供的lock用于加锁操作,其函数原型:$lock->lock();如果有其他进程持有锁,那这里将进入阻塞,直到持有锁的进程unlock,加锁成功返回true。下面我们看下其实现过程。static PHP_METHOD(swoole_lock, lock){ swLock *lock = swoole_get_object(getThis...原创 2018-10-04 15:43:45 · 654 阅读 · 0 评论 -
swoole源码解析之swoole_lock的创建过程
swoole增加了锁的实现,PHP代码中可以很方便地创建一个锁,用来实现数据同步。swoole_lock类支持5种锁的类型:文件锁 SWOOLE_FILELOCK 读写锁 SWOOLE_RWLOCK 信号量 SWOOLE_SEM 互斥锁 SWOOLE_MUTEX 自旋锁 SWOOLE_SPINLOCK其创建过程就是调用构造函数的过程,其PHP侧的调用形式如下:swoole_lo...原创 2018-10-04 14:37:19 · 361 阅读 · 0 评论 -
swoole_process源码解析之对象析构
swoole_process提供了__destruct方法,用于释放swoole内部对象资源,这个会在swoole_process对象释放时调用。我们看下其流程。static PHP_METHOD(swoole_process, __destruct){ swWorker *process = swoole_get_object(getThis());//获取swoole内部对...原创 2018-10-04 14:12:54 · 200 阅读 · 0 评论 -
swoole_process源码分析之退出子进程操作
swoole_process提供的exit用于退出子进程,int swoole_process->exit(int $status=0);$status是退出进程的状态码,如果为0表示正常结束,会继续执行PHP的shutdown_function,其他扩展的清理工作。 如果$status不为0,表示异常退出,会立即终止进程。不再执行PHP的shutdown_function,其...原创 2018-10-04 11:39:01 · 890 阅读 · 0 评论 -
swoole_process源码分析之close操作
swoole_process提供的close用于关闭创建的好的管道。bool swoole_process->close(int $which = 0);$which 指定关闭哪一个管道,默认为0表示同时关闭读和写,1:关闭写,2关闭读下面我们看下其流程。static PHP_METHOD(swoole_process, close){ long which =...原创 2018-10-04 11:06:44 · 319 阅读 · 0 评论 -
swoole_process源码分析之设置CPU亲和性
swoole_process提供的setAffinity用于设置CPU亲和性,可以将进程绑定到特定的CPU核上。function swoole_process::setAffinity(array $cpu_set);接受一个数组参数表示绑定哪些CPU核,如array(0,2,3)表示绑定CPU0/CPU2/CPU3 成功返回true,失败返回false下面我们分析下其流程。...原创 2018-10-04 10:55:07 · 422 阅读 · 0 评论 -
swoole_client源码解析之connect过程(二)
前面一篇文章分析了swoole_client的connect过程,从代码可以看出,中间兼容了TCP和UDP的两种不同的协议类型,这个主要是在创建客户端socket时做的统一处理,这篇我们分析下connect过程中创建socket的过程,下面代码是在swoole_client.c文件中connect的流程中调用片段,做这个调用时,传入了swoole_client对象,host信息,host长度信息及...原创 2018-09-26 23:03:51 · 555 阅读 · 0 评论 -
swoole_process源码分析之alarm操作
swoole_process提供的alarm是个高精度定时器,是操作系统setitimer系统调用的封装,可以设置微秒级别的定时器。定时器会触发信号,需要与swoole_process::signal或pcntl_signal配合使用。function swoole_process::alarm(int $interval_usec, int $type = ITIMER_REAL) : b...原创 2018-10-03 11:47:52 · 590 阅读 · 1 评论 -
swoole源码分析之Buffer的substr操作
swoole_buffer提供的substr操作用于从缓冲区中取出内容。string swoole_buffer->substr(int $offset, int $length = -1, bool $remove = false);$offset 表示偏移量,如果为负数,表示倒数计算偏移量 $length 表示读取数据的长度,默认为从 $offset 到整个缓存区末尾 $...原创 2018-10-06 21:07:09 · 172 阅读 · 0 评论 -
swoole源码分析之Buffer的clear操作
swoole_buffer提供的clear操作用于清理缓存区数据。swoole_buffer->clear()执行此操作后,缓存区将重置。swoole_buffer对象就可以用来处理新的请求了。下面我们看看其实现过程。static PHP_METHOD(swoole_buffer, clear){ swString *buffer = swoole_get_o...原创 2018-10-06 21:09:28 · 325 阅读 · 0 评论 -
swoole源码分析之Buffer的expend操作
swoole_buffer提供的expend操作用于为缓存区扩容。swoole_buffer->expand(int $new_size);$new_size 指定新的缓冲区尺寸,必须大于当前的尺寸下面我们看下其实现过程。static PHP_METHOD(swoole_buffer, expand){ long size = -1; //解析输入参数...原创 2018-10-06 21:12:31 · 154 阅读 · 0 评论 -
swoole_process源码分析之process创建过程
swoole提供了创建进程的方式,据swoole官方文档介绍,比PHP原生的pcntl更高效,下面是官方文档给出的pcntl的缺点和swoole的优点。PHP自带的pcntl,存在很多不足,如pcntl没有提供进程间通信的功能 pcntl不支持重定向标准输入和输出 pcntl只提供了fork这样原始的接口,容易使用错误 swoole_process提供了比pcntl更强大的功能,更易...原创 2018-09-29 22:55:19 · 987 阅读 · 0 评论 -
swoole_client源码解析之绑定回调函数
看swoole_client的demo,其支持回调函数,也就是PHP业务侧设置了相应的回调函数,在达到回调函数的条件时,会触发相应的回调,目前swoole_client支持的回调函数有connect,receive等,swoole_client里设置回调函数是通过on函数实现,这篇文章我们分析下其回调函数的实现。static PHP_METHOD(swoole_client, on){ ...原创 2018-09-28 23:01:54 · 553 阅读 · 0 评论 -
swoole源码分析之swoole_table的column操作
swoole_table提供的column操作用于内存表增加一列bool swoole_table->column(string $name, int $type, int $size = 0);$name指定字段的名称 $type指定字段类型,支持3种类型,swoole_table::TYPE_INT, swoole_table::TYPE_FLOAT, swoole_tab...原创 2018-10-07 07:18:08 · 379 阅读 · 0 评论 -
swoole源码分析之swoole_table的创建过程
swoole_table的构造函数用于创建内存表。swoole_table->__construct(int $size, float $conflict_proportion = 0.2)$size参数指定表格的最大行数,如果$size不是为2的N次方,如1024、8192,65536等,底层会自动调整为接近的一个数字,如果小于1024则默认成1024,即1024是最小值 t...原创 2018-10-07 07:03:14 · 562 阅读 · 0 评论 -
swoole源码分析之swoole_table的介绍
swoole_table一个基于共享内存和锁实现的超高性能,并发数据结构。用于解决多进程/多线程数据共享和同步加锁问题。swoole_table的优势性能强悍,单线程每秒可读写200万次 应用代码无需加锁,swoole_table内置行锁自旋锁,所有操作均是多线程/多进程安全。用户层完全不需要考虑数据同步问题。 支持多进程,swoole_table可以用于多进程之间共享数据 使用行锁...原创 2018-10-07 06:58:05 · 479 阅读 · 0 评论 -
swoole源码分析之swoole_lock的lockwait操作
swoole_lock的lockwait加锁操作,作用于swoole_lock->lock一致,但lockwait可以设置超时时间。function swoole_lock->lockwait(float $timeout = 1.0) : bool;$timeout传入超时时间,默认为1秒 在规定的时间内未获得锁,返回false 加锁成功返回true 只有Mutex...原创 2018-10-07 06:47:12 · 164 阅读 · 0 评论 -
swoole源码分析之swoole_lock的trylock_read操作
swoole_lock提供的trylock_read用于非阻塞的读,其原型如下:$lock->trylock_read();调用会立即返回,必须检测返回值以确定是否拿到了锁。下面我们分析下其流程。static PHP_METHOD(swoole_lock, trylock_read){ swLock *lock = swoole_get_object(getT...原创 2018-10-07 06:38:26 · 113 阅读 · 0 评论 -
swoole源码分析之swoole_lock的lock_read操作
swoole_lock提供的lock_read操作用于加读锁,表示仅锁定读。bool $lock->lock_read();在持有读锁的过程中,其他进程依然可以获得读锁,可以继续发生读操作 但不能$lock->lock()或$lock->trylock(),这两个方法是获取独占锁,在独占锁加锁时,其他进程无法再进行任何加锁操作,包括读锁 当另外一个进程获得了独占锁...原创 2018-10-07 06:33:57 · 177 阅读 · 0 评论 -
swoole源码分析之swoole_lock的trylock操作
swoole_lock提供的try操作用来加锁操作。与lock方法不同的是,trylock()不会阻塞,它会立即返回。$lock->trylock();加锁成功返回true,此时可以修改共享变量。 加锁失败返回false,表示有其他进程持有锁。 SWOOlE_SEM 信号量没有trylock方法下面我们看下其流程。static PHP_METHOD(swoole_loc...原创 2018-10-07 05:55:42 · 308 阅读 · 0 评论 -
swoole源码分析之Buffer的析构操作
swoole_buffer对象在做析构时,需执行内存空间的释放,我们看下其流程。static PHP_METHOD(swoole_buffer, __destruct){ swString *buffer = swoole_get_object(getThis());//获取swoole内部封装对象buffer,其类型为swString if (buffer)//buffe...原创 2018-10-06 21:49:01 · 237 阅读 · 0 评论 -
swoole源码解析之Buffer的recycle操作
swoole_buffer提供的recycle操作用于回收缓冲中已经废弃的内存。swoole_buffer->recycle();此方法能够在不清空缓冲区和使用 swoole_buffer->clear() 的情况下,回收通过 swoole_buffer->substr() 移除但仍存在的部分内存空间。下面我们看下其实现过程。static PHP_METHO...原创 2018-10-06 21:42:38 · 208 阅读 · 0 评论 -
swoole源码解析之Buffer的read操作
swoole_buffer提供的read操作用于读取缓存区任意位置的内存。swoole_buffer->read(int $offset, int $length)此接口是一个底层接口,可直接操作内存。$offset 偏移量 $length 要读取的数据长度 如果 $offset 错误或读取的长度超过实际数据的长度,返回 false我们看下其实现过程。static...原创 2018-10-06 21:39:49 · 279 阅读 · 0 评论 -
swoole源码分析之Buffer的write操作
swoole_buffer提供的write操作用于向缓存区的任意内存位置写数据。read/write函数可以直接读写内存。所以使用务必要谨慎,否则可能会破坏现有数据。swoole_buffer->write(int $offset, string $data)$offset 偏移量 $data 写入的数据现在我们看下其处理流程。static PHP_METHOD(swo...原创 2018-10-06 21:33:01 · 342 阅读 · 0 评论 -
swoole_process源码分析之daemon过程
swoole_process提供的daemon用于使当前进程蜕变为一个守护进程。//低于1.9.1的版本bool swoole_process::daemon(bool $nochdir = false, bool $noclose = false);//1.9.1或更高版本bool swoole_process::daemon(bool $nochdir = true, bool $...原创 2018-10-03 09:55:40 · 469 阅读 · 0 评论 -
swoole_process源码分析之kill操作
swoole_process提供的kill操作用于向指定pid进程发送信号。bool swoole_process::kill($pid, $signo = SIGTERM);默认的信号为SIGTERM,表示终止进程 $signo=0,可以检测进程是否存在,不会发送信号下面我们看下其流程。static PHP_METHOD(swoole_process, kill){ ...原创 2018-10-02 21:53:50 · 1057 阅读 · 0 评论 -
swoole的TCP服务器实现-start函数启动过程-factory的start过程(3)
我们接着factory的start过程分析worker进程的启动过程,这个对应的入口代码在E:\swoole-src-master\src\network\Manager.c里面,也就是下面的代码。 /** * create worker process */ for (i = 0; i < serv->worker_num; ...原创 2018-07-27 18:47:19 · 284 阅读 · 0 评论 -
swoole的TCP服务器实现-start函数启动过程-第一篇
经过前面两篇的分析,已经清楚了swoole_server对象的创建和在该对象上注册回调函数的实现,接下来我们讨论swoole_server的start过程,对应的PHP代码,为下图最后一行代码。//创建Server对象,监听 127.0.0.1:9501端口$serv = new swoole_server("127.0.0.1", 9501); //监听连接进入事件$serv-&g...原创 2018-07-23 22:18:30 · 2540 阅读 · 0 评论 -
swoole的TCP服务器实现-swoole回调函数注册过程
接着上一篇继续分析,上次分析到swoole_server的创建完成,对着我们之前的demo,现在到swoole_server的回调函数的注册流程了。//监听连接进入事件$serv->on('connect', function ($serv, $fd) { echo "Client: Connect.\n";});//监听数据接收事件$serv->on('r...原创 2018-07-23 00:04:33 · 1106 阅读 · 0 评论 -
swoole的TCP服务器实现-start函数启动过程-factory的start过程(2)
接着上一篇继续分析进程模式的factory对象的start过程,我们继续分析在start过程中的其他流程。int swProcessPool_start(swProcessPool *pool){ //参数有效性检查,如果是通过SW_IPC_SOCKET进行进程间通信,则pool对于的stream必须初始化 if (pool->ipc_mode == SW_IP...原创 2018-07-27 15:34:59 · 278 阅读 · 0 评论 -
swoole的TCP服务器实现-start函数启动过程-factory的start过程(1)
接着上面server的start过程,我们继续分析factory对象的start过程,这里按不同模式,factory的start过程也是不一样的,我们分别进行分析,首先分析单进程单线程模式的factory的start,其定义在E:\swoole-src-master\src\factory\Factory.c文件中,定义如下:int swFactory_start(swFactory *fa...原创 2018-07-26 23:07:33 · 545 阅读 · 0 评论 -
swoole的TCP服务器实现-swoole_server创建过程
这里只介绍源码实现,如果对于swoole的了解和使用,请参考官方网站:https://www.swoole.com/,这里感谢开源,有这些优秀的产品大家可以尽情的学习。要看swoole的实现,需要下载swoole的代码,下载地址为:https://gitee.com/swoole/swoole/tree/v4.0.3 下载解压后,可以导入到cdt或者source-insight去阅读,本系列文章基...原创 2018-07-22 22:40:25 · 8918 阅读 · 0 评论 -
swoole的TCP服务器实现-start函数启动过程-server的启动过程
前面几篇我们分析了server的创建过程,这篇我们开始分析server的启动过程,这里的代码在E:\swoole-src-master\src\network\Server.c里面。int swServer_start(swServer *serv){ swFactory *factory = &serv->factory;//获取factory对象 int ...原创 2018-07-26 22:46:25 · 521 阅读 · 0 评论 -
swoole的TCP服务器实现-start函数启动过程-多进程factory对象创建
在第三篇时,有提到server根据factory_mode创建不同的factory对象,之前的文章分析了基于多线程的factory对象,这里我们分析多进程模式的factory对象的创建过程,这里分析的代码的入口在文件在E:\swoole-src-master\src\network\ReactorThread.c里面,入口函数为:swFactoryProcess_create,而swFactory...原创 2018-07-26 08:11:06 · 391 阅读 · 0 评论