广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >flock php 锁不成功怎么办?
  • 753
分享到

flock php 锁不成功怎么办?

phpflock 2016-09-02 06:09:29 753人浏览 猪猪侠
摘要

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑flock php 锁不成功怎么办?php flock失效问题解决:这两天给自己的业余项目写了一个方法,用来避免crontab调度的php脚本并发执行。做法一般通过使用文

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑

flock php 锁不成功怎么办?

php flock失效问题解决:

这两天给自己的业余项目写了一个方法,用来避免crontab调度的php脚本并发执行。

做法

一般通过使用文件flock方法,令相同的PHP脚本采用非阻塞锁同一个磁盘文件,如果文件被占用则会报错,从而可以脚本立即退出。

现象

但实践中发现,在controller文件中直接flock是可以实现的,当把flock的逻辑封装到其他文件的一个函数中后就失效了。

原因

调试了半天,突然想起来以前就遇到过这个神坑。。

错误代码如下:

class Crontab
{
    
    public static function isRunning() {
        global $argv;
        $ident = [];
        foreach ($argv as $idx => $value) {
            $ident[] = $idx . '=' . urlencode($value);
        }
        $ident = md5(implode('&', $ident));
        $lockDir = \Yii::getAlias('@app/runtime/crontab/');
        @mkdir($lockDir, 0755, true);
        $file_lock = fopen($lockDir . $ident, 'w+');
        $wouldBlock = 0;
        flock($file_lock, LOCK_EX | LOCK_NB, $wouldBlock);
        return $wouldBlock;
    }
}
class Crontab
{
    
    public static function isRunning() {
        global $argv;
 
        $ident = [];
        foreach ($argv as $idx => $value) {
            $ident[] = $idx . '=' . urlencode($value);
        }
        $ident = md5(implode('&', $ident));
 
        $lockDir = \Yii::getAlias('@app/runtime/crontab/');
 
        @mkdir($lockDir, 0755, true);
 
        $file_lock = fopen($lockDir . $ident, 'w+');
 
        $wouldBlock = 0;
        flock($file_lock, LOCK_EX | LOCK_NB, $wouldBlock);
 
        return $wouldBlock;
    }
}

根据命令行参数生成唯一hash值,代表该PHP任务。

创建锁文件,执行flock非阻塞锁,返回wouldBlock标识锁是否已被占用。

我在脚本入口调用了Crontab::isRunning()方法,发现并发启动脚本后,总是能获得锁。

错误原因是:isRunning()方法退出后,$file_lock没有继续使用,被PHP垃圾回收,$fp文件句柄关闭导致锁自动释放。

解决

class Crontab
{
    
    static $file_lock = null;
    
    public static function isRunning() {
        global $argv;
        $ident = [];
        foreach ($argv as $idx => $value) {
            $ident[] = $idx . '=' . urlencode($value);
        }
        $ident = md5(implode('&', $ident));
        $lockDir = \Yii::getAlias('@app/runtime/crontab/');
        @mkdir($lockDir, 0755, true);
        self::$file_lock = fopen($lockDir . $ident, 'w+');
        $wouldBlock = 0;
        flock(self::$file_lock, LOCK_EX | LOCK_NB, $wouldBlock);
        return $wouldBlock;
    }
}
class Crontab
{
    
    static $file_lock = null;
 
    
    public static function isRunning() {
        global $argv;
 
        $ident = [];
        foreach ($argv as $idx => $value) {
            $ident[] = $idx . '=' . urlencode($value);
        }
        $ident = md5(implode('&', $ident));
 
        $lockDir = \Yii::getAlias('@app/runtime/crontab/');
 
        @mkdir($lockDir, 0755, true);
 
        self::$file_lock = fopen($lockDir . $ident, 'w+');
 
        $wouldBlock = 0;
        flock(self::$file_lock, LOCK_EX | LOCK_NB, $wouldBlock);
 
        return $wouldBlock;
    }
}

确保在整个PHP生命期内,文件句柄都不会被释放即可,所以保存在类静态成员变量里。

--结束END--

本文标题: flock php 锁不成功怎么办?

本文链接: https://www.lsjlt.com/news/524.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • flock php 锁不成功怎么办?
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑flock php 锁不成功怎么办?php flock失效问题解决:这两天给自己的业余项目写了一个方法,用来避免crontab调度的PHP脚本并发执行。做法一般通过使用文...
    99+
    2016-09-02
    php flock
  • 怎么解决flock php锁不成功问题
    本篇内容主要讲解“怎么解决flock php锁不成功问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决flock php锁不成功问题”吧!flock php锁不成功是因为在isRunni...
    99+
    2023-06-25
  • git push不成功怎么办
    在日常的开发过程中,我们经常使用版本控制工具来管理我们的代码。其中Git是一个非常流行的版本控制工具,它为我们提供了许多方便的功能,如代码版本的管理、分支管理以及多人合作开发等。然而,我们在使用Git进行代码相关操作时,也可能遇到一些问题。...
    99+
    2023-10-22
  • php修改数据库数据不成功怎么办
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php修改数据库数据不成功怎么办?问题描述:PHP无法修改数据库数据卡在ERROR报错一整天了,求大佬们帮帮忙核心报错如图所示:完整代码在此:<php hea...
    99+
    2022-10-19
    数据库 php
  • SAP中执行MRKO不成功怎么办
    这篇文章主要讲解了“SAP中执行MRKO不成功怎么办”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SAP中执行MRKO不成功怎么办”吧!对于供应商100364,执行MRKO,不能成功!Err...
    99+
    2023-06-05
  • php不能生成图片怎么办
    这篇文章主要介绍php不能生成图片怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、解决办法打开gd2库,通过phpinfo进行查看。清除bom,代码是顶行开始写的,所以问题可能出现在代码上。在header前加...
    99+
    2023-06-15
  • JavaScript表单验证不成功不能提交怎么办
    小编给大家分享一下JavaScript表单验证不成功不能提交怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、基本目标一个...
    99+
    2022-10-19
    javascript
  • java环境变量配置不成功怎么办
    这篇文章将为大家详细讲解有关java环境变量配置不成功怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实...
    99+
    2023-06-14
  • oracle连接数据库测试不成功怎么办
    如果Oracle连接数据库测试不成功,可以尝试以下步骤来解决问题:1. 检查数据库连接信息:确保数据库主机名、端口号、数据库实例名称...
    99+
    2023-09-15
    oracle 数据库
  • mysql创建外键约束总不成功怎么办
    如果MySQL创建外键约束总是不成功,可能有以下几个原因:1. 字段类型不匹配:外键约束的字段类型必须与参照表的字段类型相同。确保两...
    99+
    2023-10-12
    mysql
  • Ajax请求发送成功但不进success怎么办
    这篇文章主要介绍Ajax请求发送成功但不进success怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.情况描述:ajax发送成功,后台也成功响应请求,并返回了json数据,通过chrome监听请求也可以看到...
    99+
    2023-06-08
  • php验证码后台不能生成怎么办
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php验证码后台不能生成怎么办?PHP验证码不能生成图片,原因解决:生成图片时,header('Content-type: image/png');前面不...
    99+
    2021-04-16
    php 验证码
  • win10激活失败怎么办?win10激活不成功的解决办法
    有朋友升级到win10在激活的时候激活失败,这是什么原因?该怎么解决?今天我们小编就为大家带来win10激活不成功的解决办法。感兴趣的朋友可以一起看看。   如果你不激活Win10,只能使用Win10的部分功能。   ...
    99+
    2023-06-17
    win10 win10激活码 解决办法
  • PHP无法通过localhost成功连接mysql怎么办
    下面一起来了解下PHP无法通过localhost成功连接mysql怎么办,相信大家看完肯定会受益匪浅,文字在精不在多,希望PHP无法通过localhost成功连接mysql怎么办这篇短内容是你想要的。首先搞...
    99+
    2022-10-18
    mysql st localhsot
  • ppt被锁定不能编辑怎么办
    ppt被锁定不能编辑的方法有检查PPT文件的保护选项、解锁PPT文件、使用专业的PPT解锁工具和联系PPT文件的创建者等。详细介绍:1、检查PPT文件的保护选项,打开PPT文件并进入“文件”选项卡,在“文件”选项卡中,选择“信息”选项,在“...
    99+
    2023-08-14
  • PHP开启curl扩展不成功怎么解决
    1. 确认curl扩展是否已经安装在终端中输入以下命令:```php -m | grep curl```如果curl扩展已经安装,则...
    99+
    2023-05-30
    curl扩展 curl
  • php include不行怎么办
    本文操作环境:linux5.9.8系统、PHP7.1版、DELL G3电脑php include不行怎么办?linux php文件include失败 一个很神奇的问题 html生成失败,权限问题前天用php生成模板,在windows上开发,...
    99+
    2019-01-10
    php include
  • php dump不全怎么办
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php dump不全怎么办?问题描述:var_dump展示不全,出现省略号我们使用php的var_dump函数,可以更直观的查看输出结果,包括类型,数量等详细信息。此...
    99+
    2022-10-27
    php
  • 阿里云服务器不锁屏怎么办?
    如果您使用阿里云服务器,但发现服务器无法自动锁屏,可能会导致服务器的安全性问题。本文将详细介绍如何解决这个问题。 一、问题描述阿里云服务器在默认情况下是无法自动锁屏的,这意味着即使您长时间不操作服务器,服务器也不会自动关闭屏幕,这可能会对...
    99+
    2023-11-13
    阿里 服务器 不锁屏
  • labview生成程序不成功怎么解决
    如果您遇到了LabVIEW生成程序不成功的问题,可以尝试以下解决方法:1. 检查代码错误:确保您的LabVIEW程序中没有语法错误或...
    99+
    2023-09-15
    labview
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作