当前位置: 首页 > 后端技术 > PHP

PHP进阶通讯,实现消息队列操作

时间:2023-03-29 22:32:43 PHP

1.进程基础知识什么是进程,所谓进程其实就是操作系统中运行的程序,我们在终端中通过php运行一个php文件,这个时候相当于创建了一个进程,进程会驻留在系统中,申请自己的内存空间系统资源,并运行相应的程序。对于一个进程来说,它的核心内容分为两部分,一个是它的内存,它是在创建进程时由系统分配的,它创建的所有变量都会存放在这个内存环境中。一是它的背景。我们知道进程是运行在操作系统之上的,那么对于一个程序来说,它的运行依赖于操作系统分配给它的资源以及操作系统的一些状态。操作系统中可以运行多个进程。对于一个进程,它可以创建自己的子进程。那么当我们在一个进程中创建几个子进程时,可以看到图片,子进程和父进程一样,都有自己的内存空间和上下文。2、进程间通信进程间通信(IPC,Inter-ProcessCommunication)是指至少在两个进程或线程之间传输数据或信号的一些技术或方法。每个进程都有自己的一部分独立的系统资源,相互隔离。为了使不同的进程能够访问资源并相互协调工作,就有了进程间通信。进程通信有以下目的:数据传输,一个进程需要将自己的数据发送给另一个进程,发送的数据量在一个字节到几M之间;共享数据,多个进程都想操作共享数据,一个进程对数据的修改应该立即被其他进程看到;进程控制,有些进程想要完全控制另一个进程(比如Debug进程)的执行,此时控制进程希望能够拦截另一个进程的所有异常,并且能够及时知道它的状态变化。当系统进行进程间通信(IPC)时,可用的方法包括管道、命名管道、消息队列、信号、信号量、共享内存和套接字。2.1消息队列消息队列实际上是一个链表,消息是链表中具有特定格式和优先级的记录。对消息队列有写权限的进程可以按照一定的规则向消息列表中添加消息,对消息队列有读权限。进程可以从消息队列中获取所需的信息。在一个进程将消息写入消息队列之前,另一个进程不需要等待消息到达队列。对于消息队列来说,除非明确删除,否则会一直存在。PHP实现消息队列操作在PHP中,可以通过这两句创建一个消息队列。ftok函数可以将路径转换为消息队列可用的键值。msg_get_queue函数第一个参数是消息队列的key,第二个参数是消息队列的读写权限。该权限类似于文件msg_send函数,将信息写入指定的消息队列。msg_send(resource$queue,int$msgtype,mixed$message[,bool$serialize=true[,bool$blocking=true[,int&$errorcode]]])第一个参数:resource$queue表示写入Message队列资源.第二个参数:int$msgtype表示写入消息队列的消息类型。该参数与msg_receive函数配合使用,用于读取消息队列,下面会介绍。第三个参数:mixed$message要发送的消息,最大为65536字节。第四个参数:bool$serialize=true可选,是否序列化你发送的消息。第五个参数:bool$blocking=true是否阻塞,当你发送一个大消息,此时消息队列已经存不下,此时消息队列会被阻塞,除非有其他进程从消息队列中读取消息队列中的其他消息,然后消息队列有足够的空间来存储你要发送的信息,然后再继续执行。您可以将此参数设置为false,这样您将无法发送消息。这时候错误信息会体现在第六个参数$errorcode中,错误码为MSG_EAGAIN。您可以根据此错误代码重新发送消息。第六个参数:int&$errorcode记录了一系列的写入错误。读取函数msg_receivemsg_receive(resource$queue,int$desiredmsgtype,int&$msgtype,int$maxsize,mixed&$message[,bool$unserialize=true[,int$flags=0[,int&$errorcode]]])第一个参数:resource$queue表示要读取的消息队列资源。第二个参数:int$desiredmsgtype要读取的消息类型。当该参数为0时,可以读取msg_send发送的任何消息类型的消息。如果这个参数和你发送的某条消息是同类型的,比如你有2条消息,一条是type1发送的,一条是type2发送的。两种类型的消息都可以用0接收,只能接收messagessentwithtype1with1.第三个参数:int&$msgtype你读到的消息,发送时的消息类型会保存在这个参数中。第四个参数:int$maxsize你用多少字节来读取消息,如果这个值小于你要读取的内容的长度,你就会读取失败。第五个参数:mixed&$message读取的内容。第六个参数:bool$unserialize=true内容是否序列化第七个参数:int$flags=0读取标识。除了默认的0之外,还有3个可选参数MSG_IPC_NOWAIT该参数表示如果没有从消息队列中读取到信息,则立即返回,并返回错误码MSG_ENOMSG。MSG_EXCEPT这个参数是和第二个参数一起使用的,如果你使用这个参数,你读到的第一个参数不是你发送的第一个参数。(队列先进先出)MSG_NOERROR如果读取的内容过多,你指定的第四个参数不够用,会截断消息,不会报错。销毁消息队列的方法:msg_remove_queue($msg_queue);