PHP文件锁实战

lys2019年10月22日 0条评论

PHP文件锁实战,废话不多说,直接看下面代码

可以使用ab压力测试自己试下的,如下:

ab -n1000 -c2 http://localhost/shiyan/fileLock.php

image.png

<?php

/**
 * 文件锁类
 * Class FileLock
 */
class FileLock{
    private $fp;
    private $filePath;
    private $is_log = true;  //是否日志记录

    /**
     * 文件路径
     * FileLock constructor.
     * @param $lockFilePath
     */
    public function __construct($lockFilePath)
    {
        if(!file_exists($lockFilePath)){
            file_put_contents($lockFilePath,date('Y-m-d H:i:s'));  //创建文件
        }
        $this->filePath = $lockFilePath;
    }

    /**
     * 锁定
     * @throws Exception
     * @return boolean
     */
    public function lock(){
        if(empty($this->filePath)){
            throw new \Exception('文件路径不能为空');
        }
        $this->is_log && file_put_contents('./log_join.log','jinlai'.' '.time().PHP_EOL,FILE_APPEND);
        $this->fp = fopen($this->filePath, 'r+');
        if(empty($this->fp)){
            throw new \Exception('文件锁开启失败');
        }
        if(!flock($this->fp, LOCK_EX | LOCK_NB)) {
           $this->is_log && file_put_contents('./log.log',date('Y-m-d H:i:s').PHP_EOL,FILE_APPEND);
           return false;  //已被锁定
        }
        return true;  //锁定成功
    }

    /**
     * 释放锁
     */
    public function unLock(){
        if(!empty($this->fp)){
            @flock($this->fp,LOCK_UN);
            @fclose($this->fp);
        }
        $this->fp = null;
    }

    public function __destruct()
    {
        $this->unLock();
    }
}

$fileLock = new FileLock('./dd.txt');
if(!$fileLock->lock()){
    echo '已被锁定';
    exit();
}
sleep(30);
$fileLock->unLock();
echo 'finish';