设为首页收藏本站

 找回密码
 注册论坛

QQ登录

只需一步,快速开始

用百度帐号登录

只需两步,快速登录

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 309|回复: 0

php文件锁类防止并发

[复制链接]

签到天数: 36 天

[LV.5]常住居民I

发表于 2016/11/21 15:32 | 显示全部楼层 |阅读模式 |Google Chrome 45.0.2454.101|Windows 7
天涯海角搜一下: 百度 谷歌 360 搜狗 有道 雅虎 必应 即刻
  <?php

  02

  /**

  03

  * 用于解决PHP在并发时候的锁控制,不同的锁之间并行执行,类似mysql innodb的行级锁

  04

  * @author www.phpernote.com

  05

  */

  06

  class FileLock{

  07

  //文件锁存放路径

  08

  private $path='';

  09

  //文件句柄

  10

  private $fp='';

  11

  //锁文件

  12

  private $lockFile='';

  13

  /**

  14

  * 构造函数

  15

  * @param string $path 锁的存放目录

  16

  * @param string $name 锁 KEY

  17

  */

  18

  public function __construct($name,$path=''){

  19

  if(empty($path)) $this->path=dirname(__FILE__)。'/';

  20

  else $this->path=$path;

  21

  $this->lockFile=$this->path.md5($name)。'.lock';

  22

  }

  23

  24

  /**

  25

  * 加锁

  26

  */

  27

  public function lock(){

  $this->fp=fopen($this->lockFile,'a+');

  if($this->fp===false){

  return false;

  }

  return flock($this->fp,LOCK_EX);//获取独占锁

  }

  /**

  * 解锁

  */

  public function unlock(){

  if($this->fp!==false){

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

  clearstatcache();

  }

  @fclose($this->fp);

  @unlink($this->lockFile);

  }

  }

  文件锁类使用示例:

  查看代码打印

  <?php

  $userid=21;

  $article_id=108;

  //对业务请求加锁

  $lock=new FileLock($userid.$article_id);

  $lockResult=$lock->lock();

  if(!$lockResult){

  echo '当前请求速度过快,请稍后访问!';

  $lock->unlock();

  exit;

  }

  /*

  正常的业务逻辑处理

  */

  //业务逻辑处理完毕解锁

  $lock->unlock(www.9ask.cn/suqian/);
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册论坛 用百度帐号登录新浪微博账号登陆

本版积分规则

手机版|Archiver|Mail me|网站地图|IT技术交流论坛 ( 闽ICP备13013206号-7 )

GMT+8, 2018/7/20 03:35 , Processed in 0.334210 second(s), 44 queries , Gzip On, Memcache On.

Powered by itzmx!

© 2011-2018 sakura

快速回复 返回顶部 返回列表