我是靠谱客的博主 过时水蜜桃,最近开发中收集的这篇文章主要介绍php文件锁不起作用,PHP文件锁,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

有时候需要避免代码并发执行.

缓存击穿问题.

比如一件商品编号1001.在缓存中它的key为goods:1001,请求时,如果缓存中不存在,就读数据库,并设置缓存

if (读缓存 == null){

//读数据库

//设置缓存

}

此时一万个用户并发访问,读缓存为空,那么一万个请求会同时到达数据库.

期望的是:缓存为空时,只有一个线程进入if判断,进行读库操作

java中有同步锁synchronized很容易就能实现.

php中可以用文件锁来达到同样的效果.

以缓存中的key作为文件名,生成一个文件.

给这个文件上锁.

判断上锁是否成功,成功则进行读库操作.

代码如下

# FileLock.php

namespace lock;

class FileLock

{

private $fp;//文件描述符

/**

* FileLock constructor.

* @param string $key 缓存中的key,用来作为文件名

*/

public function __construct ($key) {

$this->makeFile($key);

}

/**

* 生成一个文件

* @param string $key 文件名

*/

private function makeFile($key){

$fp = fopen($key,'a');//生成文件,不存在就创建

$this->fp = $fp;//记录描述符

}

/**

* 获取锁

* @ LOCK_EX 独占锁

* @ LOCK_NB 获取锁失败时,不阻塞线程,直接返回

* @return bool

*/

public function getLock(){

return flock($this->fp,LOCK_EX|LOCK_NB);

}

/**

* 释放锁

* @return bool

*/

public function clearLock(){

return flock($this->fp,LOCK_UN);

}

}

测试效果

use lockFileLock;

require_once 'FileLock.php';

if (!isset($argv[1])){

echo '输入cacheKey';

return;

}

//获取输入的cacheKey

$cacheKey = $argv[1];

$fileLock = new FileLock($cacheKey);

if ($fileLock->getLock())

{

echo "读库-$cacheKey".PHP_EOL;

sleep(60);

//TODO 设置缓存

$fileLock->clearLock();

}else{

echo "获取锁失败$cacheKey";

}

执行结果

第一个终端

0a5f5c7ff9eb

image.png

第二个

0a5f5c7ff9eb

image.png第三个

0a5f5c7ff9eb

image.png

最后

以上就是过时水蜜桃为你收集整理的php文件锁不起作用,PHP文件锁的全部内容,希望文章能够帮你解决php文件锁不起作用,PHP文件锁所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部