swoole通往大神之路——swoole任务中心说明及进程任务架构搭建

Swoole多任务处理中心

若是你还不会用swoole就out了,swoole通往大神之路——swoole任务中心说明及进程任务架构搭建php

教学视频:swoole

www.bilibili.com/video/av779…架构

1、进程的基本知识

什么是进程,所谓进程其实就是操做系统中一个正在运行的程序,咱们在一个终端当中,经过php,运行一个php文件,这个时候就至关于咱们建立了一个进程,这个进程会在系统中驻存,申请属于它本身的内存空间系统资源而且运行相应的程序socket

对于一个进程来讲,它的核心内容分为两个部分,一个是它的内存,这个内存是这进程建立之初从系统分配的,它全部建立的变量都会存储在这一片内存环境当中ide

一个是它的上下文环境咱们知道进程是运行在操做系统的,那么对于程序来讲,它的运行依赖操做系统分配给它的资源,操做系统的一些状态。函数

在操做系统中能够运行多个进程的,对于一个进程来讲,它能够建立本身的子进程,那么当咱们在一个进程中建立出若干个子进程的时候那么能够看到如图,子进程和父进程同样,拥有本身的内存空间和上下文环境操作系统

 

2、进程间通信

进程间通讯(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。每一个进程都有本身的一部分独立的系统资源,彼此是隔离的。为了能使不一样的进程互相访问资源并进行协调工做,才有了进程间通讯。线程

进程通讯有以下的目的:code

数据传输,一个进程须要将它的数据发送给另外一个进程,发送的数据量在一个字节到几M之间;orm

共享数据,多个进程想要操做共享数据,一个进程对数据的修改,其余进程应该马上看到;

进程控制,有些进程但愿彻底控制另外一个进程的执行(如Debug进程),此时控制进程但愿可以拦截另外一个进程的全部异常,并可以及时知道它的状态改变。

系统进行进程间通讯(IPC)的时候,可用的方式包括管道、命名管道、消息队列、信号、信号量、共享内存、套接字(socket)等形式。

2.1消息队列

消息队列实际上就是一个链表,而消息就是链表中具备特定格式和优先级的记录,对消息队列有写权限的进程能够根据必定规则在消息链表中添加消息,对消息队列有读权限的进程则能够从消息队列中得到所需的信息。

在某个进程往一个消息队列写入消息以前,并不须要另外某个进程在该队列上等待消息的到达。对于消息队列来讲,除非显式删除,不然其一直存在

php实现消息队列操做

在php中经过这两句话就能够建立一个消息队列。 ftok 函数,是能够将一个路径转换成消息队列可用的key值。 msg_get_queue函数的第一个参数 是消息队列的key,第二个参数是消息队列的读写权限,这个权限跟文件相似

msg_send函数,向指定消息队列写入信息。

msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize = true [, bool $blocking = true [, int &$errorcode ]]] )

第1个参数 : resource $queue 表示要写入的消息队列资源。

第2个参数 : int $msgtype 表示写入消息队列的 消息类型,这个参数是 配合 msg_receive读取消息队列函数 使用的,下面会说。

第3个参数 : mixed $message 你要发送的信息,最大为 65536 个字节。

第4个参数 : bool $serialize = true 为可选项,是否序列化你发送的消息。

第5个参数 : bool $blocking = true 是否阻塞,当你发送的消息很大,而此时的消息队列没法存入的时候,此时消息队列就会阻塞,除非等到有别的进程从消息队列中读取了别的消息,而后消息队列有足够的空间存储你要发送的信息,才能继续执行。你能够设置这个参数为false,这样你发送信息就会失败,此时错误信息会在 第6个参数 $errorcode中体现,错误码为 MSG_EAGAIN ,你能够根据这个错误码,从新发送你的消息。

第6个参数 : int &$errorcode 记录写入中出现的一系列错误。

读取函数 msg_receive

msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize , mixed &$message [, bool $unserialize = true [, int $flags = 0 [, int &$errorcode ]]] )

第1个参数:resource $queue 表示要读取的消息队列资源。

第2个参数 :int $desiredmsgtype 读取的消息类型。这个参数为 0 的时候,你能够读取 msg_send 以任意 消息类型 发送的消息。 若是此参数和你发送的某个消息类型相同,好比你有 2个消息,一个是经过 1类型发送的,一个是经过2 类型发送的。你用 0 能够接收这两种消息 ,而你用 1 只能接收到 以1类型发送的消息。

第3个参数 : int &$msgtype 你读取到的信息,它发送时的消息类型会存储在该参数中。

第4个参数 : int $maxsize 你以多大的字节去读取消息,若是这个值小于你要读取的内容的长度,你会读取失败。

第5个参数 :mixed &$message 读取的内容。

第6个参数 : bool $unserialize = true 内容是否序列化

第7个参数 :int $flags = 0 读取标识。除了默认的0 以外,还有3个参数可选 MSG_IPC_NOWAIT 这个参数表示若是没有从消息队列中读取到信息,会立马返回,并返回错误码 MSG_ENOMSG.

MSG_EXCEPT 这个参数 是配合 第2个参数使用的,若是使用这个参数,你读取到的第一个参数,不是你第一个发送的参数。(队列先进先出)

MSG_NOERROR 若是读取的内容过大,而你指定的第4个参数又不够的时候,它会截断这个消息,而且不报错。

销毁消息队列的方法 :

msg_remove_queue($msg_queue);

相关文章
相关标签/搜索