当前位置:首页 > PHP > 正文内容

PHP文件锁封装备份代码

高老师5年前 (2021-08-03)PHP1344

备份下代码

<?php

namespace Lib\Library;

use Closure;
use Exception;

/**
 * 文件锁
 * 1.阻塞,进程加锁时发现其他进程已经加锁会一直阻塞等待,一直等到可以加锁成功,然后去执行业务代码
 * 2.非阻塞,进程加锁时发现其他进程已经加锁直接返回,不会执行业务代码
 * 3.注意Erp默认Session驱动为文件,本身请求已经存Session锁机制,所以测试非阻塞时请修改Session驱动为Redis
 * @package Lib\Library
 */
class FileLock
{
    /**
     * 锁文件位置
     * @var string
     */
    private $file;

    /**
     * 锁文件句柄
     * @var
     */
    private $fileHandle;

    /**
     * 构造函数
     * @param string $name 锁名称
     * @throws Exception
     */
    public function __construct($name = 'lock')
    {
        //初始化文件
        $path = RUNTIME_PATH . 'Lock' . DIRECTORY_SEPARATOR;
        $this->file = $path . md5($name);
        if (!is_dir($path)) {
            if (!mkdir($path, 0777, true)) {
                throw new Exception('文件锁目录创建失败,请检查目录' . $path . '是否可写');
            }
        }
        if (!file_exists($this->file)) {
            if (file_put_contents($this->file, '')) {
                throw new Exception('文件锁创建失败,请检查文件' . $this->file . '是否可写');
            }
        }
    }

    /**
     * 加锁
     * @param bool $block
     * @return bool
     */
    public function lock($block = true)
    {
        $this->fileHandle = fopen($this->file, 'r');
        $is_flock = $block ? flock($this->fileHandle, LOCK_EX) : flock($this->fileHandle, LOCK_EX | LOCK_NB);
        if (!$is_flock) {
            fclose($this->fileHandle);
        }
        return $is_flock;
    }

    /**
     * 释放
     */
    public function release()
    {
        if (!$this->fileHandle) {
            return false;
        }
        $unlock = flock($this->fileHandle, LOCK_UN);
        if ($unlock) {
            fclose($this->fileHandle);
            $this->fileHandle = null;
        }
        return $unlock;
    }

    /**
     * 加锁执行
     * @param Closure $func 执行闭包函数
     * @param bool $block 是否阻塞
     * @return mixed 闭包函数的返回值
     */
    public function lockToExecute($func, $block = true)
    {
        $is_flock = $this->lock($block);
        $call_back = null;
        if ($is_flock) {
            $call_back = $func();
            $this->release();
        }
        return $call_back;
    }
}

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/209.html

分享给朋友:

“PHP文件锁封装备份代码” 的相关文章

 php max input vars,max input vars限制,max input vars 设置

php max input vars,max input vars限制,max input vars 设置

在一个正式项目中操作人员提交239个产品信息进行保存,但是系统却提示没有提交239个产品,于是开启错误信息,显示如下:Warning: Unknown: Input variables exceeded 1000. To incr...

编写php com组件,php调用.net dll,php源码保护

编写php com组件,php调用.net dll,php源码保护

开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...

php多进程实现任务管理器,定时执行任务,支持守护

php多进程实现任务管理器,定时执行任务,支持守护

主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:<?php /**  * 订单任务  */ class Order {    &n...

cookie跨域,cookie p3p跨域

cookie跨域,cookie p3p跨域

最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...

php执行慢原因查找

php执行慢原因查找

今天帮朋友查询wordpress执行超级慢的原因,特此记录开启fpm的慢日志,记录执行超过30秒的脚本request_slowlog_timeout = 30 slowlog = var/log/slow.log查看日志[23-May-2019 17...

PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl.dll找不到指定的模块

PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl.dll找不到指定的模块

最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...