在php中使用Semaphore的进程锁功能
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
在大多数的php开发中很少使用到锁机制,但是有些情况确实需要锁来处理,比如:缓存数据,如果数据丢失就会导致突发很多后端数据请求,可能后端就会挂掉,这时锁机制就有用出了,这里主要介绍基于Semaphore的内存锁,由于WIndows下没有扩展实现,需要在linux下测试。
<?php
$key = ftok('/tmp', 'a');
$id = sem_get($key);
if (sem_acquire($id)) {
echo "acquire id, and sleep 5s\n";
sleep(5);
echo "5s past, release id\n";
sem_release($id);
}
在命令行执行此文件,需要在两个独立的shell环境下执行,要不看不到效果,最终第二个执行会等待第一个执行结束才开始执行,
<?php
$key = ftok('/tmp', 'a');
$id = sem_get($key);
$k = 1;
$i = array('k'=>0);
if (sem_acquire($id)) {
$shmid = shm_attach($key);
if (shm_has_var($shmid, $k)) {
$i = shm_get_var($shmid, $k);
$i['k']++;
shm_put_var($shmid, $k, $i);
}
else {
shm_put_var($shmid, $k, $i);
}
sem_release($id);
}
这段代码实现的是给共享内存加锁,然后在给锁定内存中写入变量值,写入变量需要是支持序列化的类型
1、sem_get 返回的是semaphore id, 是给sem_acquire使用的
2、shm_attach返回的是共享内存id,是给shm_*系列的函数使用的
从测试结果看,这里使用shell测试,执行多次查看结果
for i in `seq 1 1000`; do php test-sysvsem.php ;done
<?php
$key = ftok('/tmp', 'a');
$id = sem_get($key);
$k = 1;
$i = 0;
$shmid = shm_attach($key);
if (shm_has_var($shmid, $k)) {
var_dump(shm_get_var($shmid, $k));
}
else {
echo "var $k is not find";
}
经过测试没有结果正确
最后还说到,平时使用fastcgi + php的设置,很少用到多线程版本的php,不知道多线程和多进程在php中有那些差别,如果谁知道希望告知下
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献2条内容
所有评论(0)