PHP实现加锁解锁的方法
分类:知识大全作者:互联网王者 发布时间:2014-02-02 16:22:58阅读:5.6万+ 属地:未知
锁(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);
?>
声明:本文内容版权归原作者所有,未经授权,禁止转载!
声明:本站仅提供内容存储、展示服务,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的虚假信息,谨防诈骗。如发现有害或侵权内容,可联系本站删除!
![](/assets/img/pc_guanggao1.jpg)
- 上一篇:肥胖的危害和解决之道
- 下一篇:午时茶颗粒-生活中的好药
发表评论
![](/touxiang.png)