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

WBOY
Freigeben: 2016-06-13 12:51:45
Original
893 Leute haben es durchsucht

在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);
}
Nach dem Login kopieren

在命令行执行此文件,需要在两个独立的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);
}
Nach dem Login kopieren

这段代码实现的是给共享内存加锁,然后在给锁定内存中写入变量值,写入变量需要是支持序列化的类型


这里有两个问题:

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";
}
Nach dem Login kopieren

经过测试没有结果正确

最后还说到,平时使用fastcgi + php的设置,很少用到多线程版本的php,不知道多线程和多进程在php中有那些差别,如果谁知道希望告知下

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage