zoukankan      html  css  js  c++  java
  • PHP进程通信基础——shmop 、sem系列函数使用

    PHP进程通信基础——shmop 、sem系列函数使用

    PHP进程通信基础——shmop 、sem系列函数使用

    进程通信的原理就是在系统中开辟出一个共享区域,不管是管道也好,还是共享内存,都是这个原理。如果心中有了这个概念,就会很方便去理解代码。由于官网上shmop函数的英语解释稍显复杂,所以一边练习,一边简单翻译了下。信号量的内存扩展函数,比较简单,也非常好理解。所以就没有翻译。这篇博客是通信基础,所以直接就放实例代码了,按照上代码上敲一遍,就能够明白个七七八八了。如果实在不明白,可以复制进去,直接打断点调试,也是一种不错的学习思路。
    这篇文章参考:
    http://php.net/manual/en/ref.sem.php
    http://php.net/manual/en/ref.shmop.php
    http://www.cnblogs.com/nickbai/articles/6133354.html

    1、shmop 系列函数使用

    <?php
    //使用shmop 系列函数
    set_time_limit(0);
    $shm_key = ftok(__FILE__, 't');
    $shm_id = shmop_open($shm_key, "c", 0655, 1024);
    $size = shmop_write($shm_id, "Hello world".PHP_EOL, 0);
    shmop_write($shm_id, 'I love you'.PHP_EOL, $size+1);
    echo $size.PHP_EOL;
    $data = shmop_read($shm_id, 0, 100);
    var_dump($data);
    shmop_delete($shm_id);
    shmop_close($shm_id);

    //Shared Memory Functions

    /**
    * shmop_open(int $key , string $flags , int $mode , int $size)
    * $key 共享内存的key
    * $flags 的值有以下几种
    * a : 创建一个只读的共享内存区。
    * c : 如果共享内存区已存在,则打开该共享内存区,并尝试读写。否则新建共享内存区
    * w : 创建一个读写共享内存区
    * n : 创建一个共享内存区,如果已存在,则返回失败
    *
    * $mode 读写权限。如0755 0644 等
    * $size 申请共享内存区的大小
    */


    /**
    * shmop_read( resource $shmid , int $start , int $count)
    * 将从共享内存块中读取数据
    * $shmid 共享内存id,资源类型
    * $start 从共享内存的那个字节开始读起
    * $count 一次读取多少个字节。
    * 如果count值小于发送的信息长度,则信息会被截断。
    */


    /**
    * shmop_write(resource $shmid , string $data , int $offset)
    * 将数据写入共享内存块
    * $data 将要写入的数据
    * $offset 从共享内存块的那个位置开始写入。
    * 该函数的返回值是写入数据的长度。
    */


    /**
    * shmop_size(resource $shmid);
    * 返回当前共享内存块,已经使用的大小
    */



    /**
    * shmop_delete ( resource $shmid )
    * 删除一个共享内存块的,删除引用关系
    */


    /**
    * shmop_close ( resource $shmid )
    * 关闭共享内存块
    * 要先使用shmop_delete 之后才能继续使用shmop_close
    */

    2、shm 系列函数使用

    <?php
    //使用信号量扩展共享内存
    $key = ftok(__FILE__, 'a');
    $share_key = 1;

    //创建一个共享内存,大小为1024字节,权限为755
    $shm_id = shm_attach($key, 1024, 0755);

    //将一个key=>value放进共享内存
    $message1 = "I love Roverliang";
    shm_put_var($shm_id, $share_key, $message1);

    //重复使用key ,前一个设置的值会被后一个设置的值覆盖掉。
    $message2 = "I love Rover";
    shm_put_var($shm_id, $share_key, $message2);

    //读取一个共享内存值
    $read_message = shm_get_var($shm_id, $share_key);
    echo $read_message.PHP_EOL;

    //并不是取走了,而是读取
    $read_message2 = shm_get_var($shm_id, $share_key);
    echo $read_message2.PHP_EOL;

    //判断共享内存中,某个值是否存在
    $isexists = shm_has_var($shm_id, $share_key);
    var_dump($isexists);

    //删除一个值
    shm_remove_var($shm_id, $share_key);

    //判断共享内存中,某个值是否存在
    $isexists = shm_has_var($shm_id, $share_key);
    var_dump($isexists);

    //删除一个共享内存
    shm_remove($shm_id);

    //关闭共享内存的连接
    shm_detach($shm_id);
  • 相关阅读:
    Python Semaphore
    Python 互斥锁
    Python 递归锁
    Python GIL锁
    Python 线程调用
    进程与线程
    Python paramiko模块
    Python SocketServer模块
    MonoDevelop with Visual Studio to Linux and Mac OSX maintaining a single code base for all platforms.
    mime大全收集
  • 原文地址:https://www.cnblogs.com/roverliang/p/6228123.html
Copyright © 2011-2022 走看看