PHP共享内存段实现,使用shmop函数实现内存共享

所谓内存共享:就是多个应用程序公用一个内存段,在A程序中可以获取B程序存储在这个内存段的数据,也就是数据共享。

shmop是PHP提供的函数集,在配置PHP的时候使用 -enable-shmop后,就可以使用这个函数集提供的函数,

shmop对LINUX更加友好,而对于WINDOWS来说就不怎样了,不支持CGI和CLI模式~有点尴尬。

来说说他提供的一些函数:

ftok函数:生成一个数字或叫做键或key。$key = ftok(fileName, mode); 一般情况下,这个fileName可以直接使用__FILE__来指向当前文件,mode则比较灵活,是一个字符串类型,比如:"a", "b", "p"

shmop_open($key, $mode, $permission, $size);   开启一个内存段

这里的key就是ftok生成的哪个key,$mode是打开这个内存段的模式。包括:

a:    它允许访问只读的内存段

w:    它允许访问可读写的内存段

c:    创建一个新的内存段,如果已经存在,尝试读写

n:    创建一个新的内存段,如果已经存在,则失败

$size指的是申明的这个内存段的大小,字节为单位、

shmop_open返回一个ID,这个ID是内存段ID,可以ftok生成的key不是一回事。注意!

shmop_write($id, $stringData, $offset);

往id这个内存段中写入字符串数据,从$offset的位置开始,offset一般会设置为0, 注意,这里存储只能是字符串类型。注意转换。

shmop_read($id, $offset, $limit);

读取数据,从$offset开始读取$limit个字符。

shmop_size($id);

获取总共存储了多少个字节。

shmop_delete($id)

清空这个内存段的内容

shmop_close($id)

关闭这个内存端,也叫做内存回收~

好了,介绍了这些基础方法,大家应该都尝试过了,我们应该将这些内容进行一个封装,于是我对它进行了封装,做成了一个类,也方便了以后的扩展

github地址:

https://github.com/toulen/Tshmop

composer安装:

composer require toulen/tshmop:1.0

时间: 2024-12-24 11:04:00

PHP共享内存段实现,使用shmop函数实现内存共享的相关文章

VC++共享数据段实现进程之间共享数据

当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用VC\VC++的共享数据段.#pragma data_seg("foo")//建立一个叫“foo”的数据段#pragma comment(linker,"/SECTION:foo,RWS")//设置段foo的属性为“可读可写共享” int bar=0;//这些变量是共享的,不同的进程之间都可以访问到.int bar233=1;int foobar=9;int 

如果两段内存重叠,用memcpy函数可能会导致行为未定义

如果两段内存重叠,用memcpy函数可能会导致行为未定义,改进: void* memmove(void* str1,const void* str2,size_t n) { char* pStr1= (char*) str1; const char* pStr2=(const char*)str2; if (pStr1 < pStr2 ) { for(size_t i=0;i!=n;++i) { *(pStr1++)=*(pStr2++); } } else { pStr1+=n-1; pStr

Linux-0.11内核源码分析系列:内存管理up_wp_page()与do_wp_page()函数分析

/* * up_wp_page()函数用于解除物理页的共享状态,同时给发生写时复制的进程提供一页新的 * 物理页,新物理页是之前共享页的数据相同的拷贝. * table_entry是共享物理页的地址的指针,即页表实际地址+表内偏移地址 */ void un_wp_page(unsigned long * table_entry) { unsigned long old_page,new_page; old_page = 0xfffff000 & *table_entry; //取得共享物理页实际

QVector 和vector的比较(QVector默认使用隐式共享,而且有更多的函数提供)

QVector和vector的比较: Qvector默认使用隐式共享,可以用setSharable改变其隐式共享.使用non-const操作和函数将引起深拷贝.at()比operator[](),快,因为它不进行深拷贝.Qvector取值都会检查越界问题. 看看简单的例子: QVector<int>  vecA; QVector<int>  vecB; vecA.push_back(1); vecA.push_back(10); vecB= vecA; cout<<&q

DLL中建立进程共享数据段需要注意的语法问题

默认情况下,所有的数据段都是进程独立的,每个进程有自己的一份.但有时候进程共享一个数据段也是有需要的,为此VC++编译连接器提供了专门的语法,下面是一个典型的例子,建立了一个名为Shared的共享数据段,该数据段里只有一个变量g_hwndOwner. ////////////////////////////////////////////// 进程共享区 /////////////////////////////////////// #pragma data_seg("Shared")

跨函数使用内存空间

所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法.动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小.凡是在程序中用到系统提供的动态分配存储空间函,均要求包含头文件<malloc.h>. Malloc 向系统申请分配size字节的存储区.返回分配内存空间的起始地址,若分配失败,则返回0,类型是 void* (或chaar*).ma

内存段是如何划分的

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域.数据段属于静态内存分配. 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某

DLL共享数据段

//变量定义,不同Instance共享的该变量 #pragma data_seg("SHARED") static HHOOK hhk=NULL; //鼠标钩子句柄 static HINSTANCE hinst=NULL; //本dll的实例句柄 (hook.dll) #pragma data_seg() #pragma comment(linker, "/section:SHARED,rws") //以上的变量共享哦! 1.#pragma data_seg()一般

进程—内存段机制

进程-内存段机制 开始阅读之前可以先看看The Curse of Segments 1.x86的硬件段机制 wiki.osdev-Segmentation Modes of Memory Addressing on x86 1.1 段机制的引入 ? 就在8086CPU出现之前,地址总线已经是16位(64KB)的了,在刚开始,段的引入是为了解决"地址总线的宽度大于寄存器的宽度"这个问题.例如8086的寄存器只有16位,但是地址总线却有20位(1MB),为了使程序能利用到1MB的物理内存空