Rumah >pembangunan bahagian belakang >tutorial php > 在php中使用Se地图hore的进程锁

在php中使用Se地图hore的进程锁

WBOY
WBOYasal
2016-06-13 12:51:45906semak imbas

在php中使用Semaphore的进程锁

在大多数的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中有那些差别,如果谁知道希望告知下

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn