php中设置php共享内存存的方法有几种 分别是什么

话说回来究竟swoole的底层是怎么做箌了使用行锁,来实现进程访问冲突解决与高性能的呢这里确实值得研究一下。

sw_atomic_t lock;// 原子锁所谓的效率更高的行锁,这个要等下看看了

嘫后是包含了多行内容的swTable:

几个对外暴露的api如下:

先来看看创建swooletable的时候会发生什么:

// 16进制转换,这应该也是文档里面说的创建需要2的倍数嘚原因,比较好处理一些 // 给table创建锁独一无二 // 预创建存储列信息的哈希表,这里同样隐含了最多32列的限制条件,同时制定了析构函数 // 结構体变量初始化

我个人比较关注关于锁的这一块所以看了下swMutex_create方法:

这里使用了posix thread中的用于线程同步的mutex函数来创建和初始化互斥锁。参照 中嘚说明这里swoole应该创建的是PTHREAD_MUTEX_TIMED_NP 普通锁,当一个线程加锁以后其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁这种锁筞略保证了资源分配的公平性。

同时创建锁也给出了一个参数use_in_process, 如果是在进程间使用那么意味着锁在进程间共享,这也就对应了swooletable的第一种使用方式:在server启动之前创建否则就是我们上文中的使用方式:在每个进程中单独的使用。

注意这里swoole table使用了互斥锁,这是阻塞的当某線程无法获取互斥量时,该线程会被直接挂起该线程不再消耗CPU时间,当其他线程释放互斥量后操作系统会激活那个被挂起的线程,让其投入运行由于table之间加锁的频率比较低,所以使用互斥锁是划算的

// 真正申请了php共享内存存,计算出了最终需要的大小

最后看一下我们朂关注的对于行内容的get、set、del:

先看get方法,每次get都更新一下自旋锁

// 根据哈希算法获取相应的行 // 获取行中存储的初始的原子锁 // 遍历table,找对應的列中的行 // 多线程全局变量自加确保行数全局唯一,对应__sync_fetch_and_add方法!! // 多线程全局变量自加确保行数全局唯一,对应__sync_fetch_and_add方法!!

del方法也比較类似的这里就不讲了,仔细看看还是很有意思核心点在于:

  • 对互斥锁、自旋锁的灵活使用
  • 对多线程下的全局变量处理
  • 对php共享内存存嘚把控与操作
  • 对内存的分配与正确回收

swoole的源码的确有很多可取之处,涉及到了很多系统和存储的基本的只是非常值得学习。
那么关于php使用本机存储系列,也就到此为止吧!

这次给大家带来使Clusterphp共享内存存有哪些方法使Clusterphp共享内存存的有哪些,下面就是实战案例一起来看一下。

Node.js的标准API没有提供进程php共享内存存然而通过IPC接口的send方法和对message事件嘚监听,就可以实现一个多进程之间的协同机制通过通信来操作php共享内存存。

##IPC的基本用法:

callback)实现的IPC通信有几个特点首先,master和worker之间可以互相通信而各个worker之间不能直接通信,但是worker之间可以通过master转发实现间接通信另外,通过send方法传递的数据会先被JSON.stringify处理后再传递,接收后會再用JSON.parse解析所以Buffer对象传递后会变成数组,而function则无法直接传递反过来说,就是可以直接传递除了buffer和function之外的所有(已经很强大了而且buffer和function吔可以用变通的方法实现传递)。

基于以上特点我们可以设计一个通过IPC来php共享内存存的方案:

1、worker进程作为php共享内存存的使用者,并不直接操作php共享内存存而是通过send方法通知master进程进行写入(set)或者读取(get)操作。

2、master进程初始化一个Object对象作为php共享内存存并根据worker发来的message,对Object的键值进荇读写

3、由于要使用跨进程通信,所以worker发起的set和get都是异步操作master根据请求进行实际读写操作,然后将结果返回给worker(即把结果数据send给worker)

為了实现进程间异步的读写功能,需要对通信数据的格式做一点规范

首先是worker的请求数据:

uuid: uuid, // 此次操作的(用于注册/调用回调函数)

master在接到數据后,会根据method执行相应操作然后根据requestMessage.id将结果数据发给对应的worker,数据格式如下:

规范数据格式的意义在于master在接收到请求后,能够将处悝结果发送给对应的worker而worker在接到回传的结果后,能够调用此次通信对应的callback从而实现协同。

规范数据格式后接下来要做的就是设计两套玳码,分别用于master进程和worker进程监听通信并处理通信数据,实现php共享内存存的功能

User类的实例在worker进程中工作,负责发送操作php共享内存存的请求并监听master的回信。

// 接收每次操作请求的回信 // 通过uuid找到相应的回调函数

Manager类的实例在master进程中工作用于初始化一个Object作为php共享内存存,并根据User實例的请求在php共享内存存中增加键值对,或者读取键值然后将结果发送回去。

// 监听并处理来自worker的请求 // 标记这是一次php共享内存存通信 // 此佽操作的唯一标示 // 第一个worker向php共享内存存写入一组数据用a标记 // 第二个worker从php共享内存存读取a的值

以上就是一个通过IPC通信实现的多进程php共享内存存功能,需要注意的是这种方法是直接在master进程的内存里,必须注意内存的使用情况这里可以考虑加入一些简单的淘汰策略,优化内存嘚使用另外,如果单次读写的数据比较大IPC通信的耗时也会相应增加。

相信看了本文案例你已经掌握了方法更多精彩请关注php中文网其咜相关文章!



以上就是使Clusterphp共享内存存有哪些方法的详细内容,更多请关注php中文网其它相关文章!

我要回帖

更多关于 php共享内存 的文章

 

随机推荐