Swoole源码分析
面向生产环境的 PHP 异步网络通信引擎
lcli
这个作者很懒,什么都没留下…
展开
-
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 · 440 阅读 · 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 · 216 阅读 · 0 评论 -
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 · 182 阅读 · 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 · 162 阅读 · 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 · 290 阅读 · 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 · 220 阅读 · 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 · 249 阅读 · 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 · 903 阅读 · 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 · 202 阅读 · 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 · 368 阅读 · 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 · 663 阅读 · 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 · 278 阅读 · 0 评论 -
swoole_process源码分析之write操作
swoole_process提供的write方法用于向管道内写入数据,其使用的形式如下。int swoole_process->write(string $data);$data的长度在Linux系统下最大不超过8K,MacOS/FreeBSD下最大不超过2K 在子进程内调用write,父进程可以调用read接收此数据 在父进程内调用write,子进程可以调用read接收此数...原创 2018-10-02 20:58:29 · 557 阅读 · 0 评论 -
swoole_process源码分析之setTimeout操作
swoole_process提供的setTimeOut用于设置管道读写操作的超时时间,其操作方式如下:function swoole_process->setTimeout(double $timeout)$timeout单位为秒,支持浮点型,如1.5表示1s+500ms 设置成功返回true 设置失败返回false,可使用swoole_errno获取错误码下面我们分析下其执...原创 2018-10-02 21:14:16 · 283 阅读 · 0 评论 -
swoole_process源码分析之setBlocking操作
swoole_process提供的setBlocking用于设置管道是否为阻塞模式。默认Process的管道为同步阻塞。function swoole_process->setBlocking(bool $blocking = true);$blocking 布尔型,默认为true,设置为false时管道为非阻塞模式下面我们看看其实现。static PHP_METHOD(...原创 2018-10-02 21:41:40 · 344 阅读 · 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 · 1066 阅读 · 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 · 484 阅读 · 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 · 597 阅读 · 1 评论 -
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 · 454 阅读 · 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 · 329 阅读 · 0 评论 -
swoole_process源码分析之进程start过程
前一篇文章我们分析了进程的构造过程,这篇我们开始分析其start过程,start通过执行底层fork系统调用,启动进程,在PHP侧的执行原型如下:$pid = $process->start();函数执行成功,则返回子进程的PID,执行失败返回false。可以通过$process->pid和$process->pipe分别获取子进程的PID和管道的文件描述符,而在sta...原创 2018-10-01 07:15:25 · 337 阅读 · 0 评论 -
swoole_process源码分析之进程的exec过程解析
swoole_process的exec是exec系统调用的封装,用于执行外部的一个程序,其使用实例如下:bool swoole_process->exec(string $execfile, array $args)$execfile指定可执行文件的绝对路径,如 "/usr/bin/python"$args是一个数组,是exec的参数列表,如 array('test.py', 12...原创 2018-10-01 23:15:02 · 636 阅读 · 0 评论 -
swoole_process源码分析之进程的wait流程
swoole_process的wait操作用于回收结束运行的子进程,其调用原型为:array swoole_process::wait(bool $blocking = true);$result = array('code' => 0, 'pid' => 15001, 'signal' => 15);$blocking 参数可以指定是否阻塞等待,默认为阻塞操作成功会...原创 2018-10-01 23:34:30 · 667 阅读 · 0 评论 -
swoole_process源码分析之消息队列创建
swoole_process创建的进程默认在父子进程间通过管道的方式进行进程间通信方式,而swoole_process也提供消息队列的方式进行进程间通信,对外和队列相关的接口有创建队列、push消息、pop消息、stat消息、销毁队列等,我们下面逐步分析。启用队列的操作如下:bool swoole_process->useQueue(int $msgkey = 0, int $mo...原创 2018-10-02 15:02:52 · 379 阅读 · 0 评论 -
swoole_process源码分析之push队列
前面我们分析过了队列的创建过程,这里我们看下队列的push流程,其push调用形式如下。bool swoole_process->push(string $data);下面我们看下底层实现。static PHP_METHOD(swoole_process, push){ char *data; zend_size_t length; //messa...原创 2018-10-02 15:10:48 · 332 阅读 · 0 评论 -
swoole_process源码分析之pop队列
用于从队列中读取消息,其调用如下:string swoole_process->pop(int $maxsize = 8192);下面我们分析下其流程。static PHP_METHOD(swoole_process, pop){ long maxsize = SW_MSGMAX; //解析输入参数,输入参数就一个maxsize,表示要读取的最大消...原创 2018-10-02 15:30:03 · 428 阅读 · 0 评论 -
swoole_process源码分析之查询队列状态
swoole_process提供的statQueue用于统计队列状态,其返回一个数组,里面包括了消息总个数和总的字节数。array swoole_process->statQueue();下面我们看看其实现。static PHP_METHOD(swoole_process, statQueue){ swWorker *process = swoole_get_obj...原创 2018-10-02 16:30:45 · 327 阅读 · 0 评论 -
swoole_prcess源码分析之队列销毁
删除队列。此方法与useQueue成对使用,useQueue创建队列,使用freeQueue销毁队列。销毁队列后队列中的数据会被清空。如果程序中只调用了useQueue方法,未调用freeQueue在程序结束时并不会清除数据。重新运行程序时可以继续读取上次运行时留下的数据。系统重启时消息队列中的数据会被丢弃。其在PHP侧的调用如下。function swoole_process->...原创 2018-10-02 16:39:19 · 286 阅读 · 0 评论 -
swoole_process源码分析之read操作
swoole_process提供的read方法用于从管道中读取数据,其使用刑形式如下。function swoole_process->read(int $buffer_size=8192)$buffer_size是缓冲区的大小,默认为8192,最大不超过64K 管道类型为DGRAM数据报时,read可以读取完整的一个数据包 管道类型为STREAM时,read是流式的,需要自行...原创 2018-10-02 17:09:36 · 432 阅读 · 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 · 996 阅读 · 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 · 558 阅读 · 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 · 562 阅读 · 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 · 1189 阅读 · 0 评论 -
swoole_client源码解析之recv数据
这篇我们分析swoole_client客户端读取数据的过程,从connect过程的代码可以看出,swClient在connect过程中设置了各种其他动作的回调函数,这里我们分析swoole_client的recv函数的主流程,同时把底层回调函数实现也关注下。 目前swoole客户端支持业务侧设置拆包策略,这里所谓的拆包是指,TCP是流式协议,也就是没有边界的概念,这个边界往往是由业务去确定的,...原创 2018-09-27 22:59:12 · 1307 阅读 · 0 评论 -
swoole的TCP服务器实现-start函数启动过程--多进程模式reactor事件处理过程
结合上面几篇的分析,我们已经知道了reactor的主事件处理过程和在reactor上面注册的回调逻辑,这篇我们开始分析reactor和回调处理的逻辑,看看reactor和worker的交互是如何做的。首先,我们分析的代码如下图所示:SwooleG.main_reactor->add(SwooleG.main_reactor, pipe_worker, SW_FD_PIPE | SW_E...原创 2018-08-02 11:43:36 · 513 阅读 · 0 评论 -
swoole_client源码解析之swoole_client对象构造过程
对于swoole_client,我们从官方文档可以看到其使用方法如下所示,也就是创建了swoole_client对象,调用对象的方法connect连接服务器(如果是TCP类的客户端),调用send方法发送数据,调用recv方法接收数据,这篇文章就以这个demo为例,解析swoole_client的实现原理。$client = new swoole_client(SWOOLE_SOCK_TCP...原创 2018-09-25 22:40:44 · 717 阅读 · 0 评论 -
swoole_client源码解析之connect过程(一)
在前面一篇文章swoole源码解析之swoole_client流程解析(一)中我们介绍了swoole_client的构造函数和set函数的实现原理,这里我们结合第一篇中的demo流程继续解析余下的流程,首先我们从connect方法开始介绍。//swoole_client对象的connect方法流程static PHP_METHOD(swoole_client, connect){ ...原创 2018-09-25 22:56:14 · 1267 阅读 · 0 评论 -
swoole的TCP服务器实现-start函数启动过程-多进程模式的reactor创建
接着上面一篇文章,我们分析多进程模式下,reactor的创建,reactor完成multi IO通信控制,而在多进程模式下,只有一个reactor线程。int swReactor_create(swReactor *reactor, int max_event){ int ret; bzero(reactor, sizeof(swReactor));//空间初始化#if...原创 2018-07-28 22:32:49 · 524 阅读 · 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 · 293 阅读 · 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 · 528 阅读 · 0 评论