您好,欢迎来到有书房!

PHP实现加锁解锁的方法

分类:知识大全作者:互联网王者 发布时间:2014-02-02 16:22:58阅读:7.4万+ 属地:未知

引言:锁(Lock)是什么?肯定就是锁上、独占的意思。比如我有一个房子或者一辆车,我肯定要上锁,免得被其他人占用了。

        锁(Lock)是什么?肯定就是锁上、独占的意思。比如我有一个房子或者一辆车,我肯定要上锁,免得被其他人占用了。在计算机世界,也是一样,现在的操作系统都是多任务的,也就是可以并行执行多个任务,那么对同一个资源来说,就会出现抢占的情况,那么只能为了数据的一致性,只能上锁。锁就是计算机中用来协调对共享资源的访问的方法。在多线程或多进程程序中,访问同一个共享资源时需要采取锁的机制来保证数据正确性。


        在PHP程序的开发中,也经常需要使用锁来避免出现并发读写冲突的问题。那么PHP有哪些办法实现锁机制呢?


        1、利用文件锁机制。 也就是利用flock函数通过文件实现锁定和互斥机制,文件锁主要分为两种类型:排他锁(LOCK_EX)和共享锁(LOCK_SH)。排他锁是一种写锁,当文件被上锁时,其他人无法对该文件进行读和写操作。其他人要操作只能一直等待写锁的释放,。共享锁是一种读锁,大家可以读但是无法修改,要想修改也必须等到所有人的锁释放后才可以独占修改。当然文件锁能够满足独占互斥的功能,但它也可能会增加服务器资源的消耗,增加了程序的复杂性。文件锁的实现有两种方法,第一种采用flock()函数,第二种采用posix functions,这个少用不做解说。


1.flock方式

flock()函数使用方式如下:

// 打开文件,返回文件指针

$fp = fopen('test_file.txt', 'w+');

// 开始加锁

if (flock($fp, LOCK_EX)) {

    // 进行操作,例如写入内容

    fwrite($fp, 'aaaaaaaaaaaaaaaaaaaaaaaaa');

    // 结束操作,解锁

    flock($fp, LOCK_UN);

}

// 关闭文件

fclose($fp);



        另外很多框架也实现了锁的机制,用起来更容易,比如laravel的基于缓存的锁,可单机(file)和分布式(redis等)等。

        $lock = Cache::get('auto_new_nplan_lock');

        if ($lock) {

            return $this->response->error('业务正在处理中');

        } else {

            Cache::put('auto_new_nplan_lock', '1', 30);

        }

            //处理业务逻辑

        Cache::forget('auto_new_nplan_lock');

        } catch (\Exception $e) {

            Cache::forget('auto_new_nplan_lock');

        }



        2、利用MySQL的锁来实现锁功能。MySQL中有多种锁类型,包括悲观锁、乐观锁、全局锁、表级锁、页级锁、行级锁、共享锁、排它锁等。以下简单说明以下悲观锁和乐观锁的使用方法。

悲观锁(Pessimistic Locking):悲观锁是假设肯定会发送冲突,因此必须上锁来避免冲突。通常通过使用SELECT ... FOR UPDATE或LOCK IN SHARE MODE语句来加锁。


START TRANSACTION;

SELECT id, status FROM table WHERE id = 1 FOR UPDATE;

COMMIT;


        乐观锁(Optimistic Locking):乐观锁是假设不会发送冲突,提交修改前再检查是否有冲突。通常通过记录版本号或时间戳来判断数据是否被修改。

START TRANSACTION;

SELECT id, column_a,version FROM table WHERE id= 1;

UPDATE table 

SET column_a = 1, version = version + 1

WHERE id = 1 AND version = {version};

IF ROW_COUNT() = 0 THEN

ROLLBACK;

ELSE

COMMIT;

END IF;


        3、利用共享内存。共享内存是在同一台计算机上的应用程序之间交换数据的有效方法。 一个进程可以创建其他进程可以访问的内存段,只要它分配了正确的权限即可。 每个段都有一个唯一的ID,称为shmid ,它指向其他进程可以操纵它的物理内存区域。 创建并获得适当的权限后,同一台计算机上的其他进程可以通过以下方式操纵这些段:读取,写入和删除。 PHP可以利用shmop_open函数开辟一块内存空间,在服务进程之间共享数据,为了保证共享数据的互斥安全访问,可以使用sem_get、 sem_acquire和sem_release这组函数实现共享计数锁定机制。


PHP使用共享内存-Shmop,需要先开启shomp扩展才能使用


php的shmop扩展的共享内存读写操作函数只有6个:

shmop_open 打开内存块.

shmop_write 向内存块中写入数据

shmop_size 获得内存块大小

shmop_read 读取内存块数据

shmop_delete 删除内存块数据

shmop_close 关闭内存块


这里只举个例子说明打开内存块函数shmop_open的使用方法。

<?php 

$systemid = 456; 

$mode = "c"; 

$permissions = 0755; 

$size = 1024;  

$shmid = shmop_open($systemid, $mode, $permissions, $size); 

?>


声明:本文内容版权归原作者所有,未经授权,禁止转载!

声明:本站仅提供内容存储、展示服务,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的虚假信息,谨防诈骗。如发现有害或侵权内容,可联系本站删除!

发表评论

评论

联系
我们

平台负责人邮箱
282271588@qq.com

关注
公众号

关注官方公众号

下载
安卓版

下载安卓版

回到
顶部