zoukankan      html  css  js  c++  java
  • 【转】PHP使用共享内存进程间通信

    原文:https://blog.csdn.net/why444216978/article/details/104585099

    https://www.cnblogs.com/nickbai/articles/6124466.html

    共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

    一.Linux下进程间通信的几种主要手段简介:

    1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

    管道包括三种:1)普通管道PIPE, 通常有种限制,一是半双工,只能单向传输;二是只能在父子进程间使用. 2)流管道s_pipe: 去除了第一种限制,可以双向传输. 3)命名管道:name_pipe, 去除了第二种限制,可以在许多并不相关的进程之间进行通讯.

    2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

    3.报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    4.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

    5.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

    6.套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

    -----------------------------------

    创建并写入数据

      

    <?php
    $file = __FILE__;
    $key = ftok($file, 1);
    $size = 4096;
    $shmid = shmop_open($key, 'c', 0644, $size);
    if($shmid === false){
        die('create fail');
    }
     
    $data = 'hello world';
    $packData = pack('a*', $data); //数据压缩成二进制字符串,null填充
    $dataSize = shmop_write($shmid, $packData, 0);  //第三个参数代表开始写入数据的位置
    if($dataSize === false){
        die('write fail');
    }
    shmop_close($shmid);
    exit('success!');
    

      

    1.  
      success!
    2.  
      [Done] exited with code=0 in 0.287 seconds
    1.  
      $ ipcs -m
    2.  
      IPC status from <running system> as of Sun Mar 1 00:51:42 CST 2020
    3.  
      T ID KEY MODE OWNER GROUP
    4.  
      Shared Memory:
    5.  
      m 983040 0x31040c43 --rw-r--r-- why staff

    另一个进程读取并释放

      

    <?php
    $file = __FILE__;
    $key = ftok($file, 1);
    $size = 4096;
    $shmid = shmop_open($key, 'a', 0644, $size);
    if($shmid === false){
        die('create fail');
    }
     
    $data = shmop_read($shmid, 0, $size);
    if($data === false){
        die('read fail');
    }
    $res = unpack('a*', $data);
    print_r($res[1]);
     
    $res = shmop_delete($shmid);
    if($res === false){
        die('delete fail');
    }
    shmop_close($shmid);
    

      

    1.  
      hello world
    2.  
      [Done] exited with code=0 in 0.288 seconds
    1.  
      $ ipcs -m
    2.  
      IPC status from <running system> as of Sun Mar 1 00:55:43 CST 2020
    3.  
      T ID KEY MODE OWNER GROUP
    4.  
      Shared Memory:
  • 相关阅读:
    记录相关操作
    mysql数据类型
    完整性约束
    表相关操作
    MySQL存储引擎
    库相关操作
    linux学习笔记2---命令cd
    linux学习笔记命令篇1---命令ls
    linux常用命令系列
    redis34--string 操作
  • 原文地址:https://www.cnblogs.com/oxspirt/p/14190590.html
Copyright © 2011-2022 走看看