上一篇文章学习到了php的共享内存,但是仅仅这个是不够的,我们还需要更精确的控制,避免多个进程同时写入共享内存的情况发生,我们还需奥信号量的控制等内容

  • 准备
    PHP 也提供了类似的内置扩展 sysvsem(这个扩展在 Windows 环境下没有,文档中将 ftok 函数也归到这个扩展中,但实际上 ftok 是在标准函数库中提供的,所以在 Windows 下也是可用的)。

检查扩展是否支持通过phpinfo() 检测加载情况

1
2
3
4
sysvmsg

sysvmsg support => enabled
Revision => $Id: 8fc76436c42ce984b2ad34ae6b27082d5e66c104 $

有以上这样的就属于已经正常加载可以使用这些功能啦

  • 知识点介绍
  • sem_get() 获取信号标识
  • sem_acquire() 获取信号量
  • sem_release() 信号量发布
  • sem_remove() 删除信号量
  • shm_attach() 创建或打开共享内存段
  • shm_detach() 断开与共享内存段的连接

相关函数列表

  • 样例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$id_key = ftok(__FILE__, 't');
$sem_id = sem_get($id_key);
# 请求信号控制权
if (sem_acquire($sem_id)) {
$shm_id = shmop_open($id_key, 'c', 0644, 8);
# 读取并写入数据
$count = (int) shmop_read($shm_id, 0, 8) + 1;
shmop_write($shm_id, str_pad($count, 8, '0', STR_PAD_LEFT), 0);
// echo shmop_read($shm_id, 0, 8);
# 关闭内存块
shmop_close($shm_id);
# 释放信号
sem_release($sem_id);
}
  • 测试

运行效果图

循环中运行100次效果图

最后一定要注意关闭信号量,以免造成上一个信号量一直被占用造成下一个无法使用的问题!!