作为程序员一定要保持良好的睡眠,才能好编程

RPC 第七课 信号量相关函数说明

发布时间:2018-11-28


什么是消息队列:

消息队列是消息的链接表,存储在内核中,由消息队列标识符标识。


消息队列.png



通过linux所带的命令 可以查看消息队列  ipcs -q


msg_get_queue.png

我们可以通过msg_set_queue($resouce,[

msg_qbytes=2000

])设置这里面的消息,但是必须是root权限


$key=123456;

if(msg_queue_exists($key)){
  
  echo('msg'.$key.' is exists');

}

$resource =msg_get_queue($key,0666);


if(!$resource){

  die('create queue fail');
}


$data=msg_stat_queue($resource);


print_r($data);


//可以设置内核中的数据,单必须是root权限的用户才可以设置
msg_set_queue($resource,[

]);


可以设置的参数如下:

Array

(

    [msg_perm.uid] => 0

    [msg_perm.gid] => 0

    [msg_perm.mode] => 438

    [msg_stime] => 0

    [msg_rtime] => 0

    [msg_ctime] => 1543357344

    [msg_qnum] => 0

    [msg_qbytes] => 65536

    [msg_lspid] => 0

    [msg_lrpid] => 0

)

msg_ipcs.png


信号量:与进程通讯不同,它是一个计数器,用于为多个进程提供对共享数据对象的访问,保证两个或多个关键代码不被并发调用。

              和我们常说的文件锁是等效的。



信号量函数.png



信号量到底有什么用途?

信号量好比一把锁,防止一个变量 在多进程并发修改。类似不能让一件物超卖。

会占用资源,不被其他资源抢占。


要使用信号量函数,必须在PHP编译的时候,加上

--enable-sysvsem


编译成功后,就可以使用信号量相关的函数了。





下面我们看看信号量有哪些先关的函数:


sem_get() 得到一个信号量id


sem_acquire 获取一个信号量


sem_release 释放一个信号量


sem_remove 移除一个信号量


<?php

$key=123456;









信号与信号量的区别


信号与信号量的区别:

1.信号:(signal)是一种处理异步事件的方式。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。

2.信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。