广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >怎么解决flock php锁不成功问题
  • 656
分享到

怎么解决flock php锁不成功问题

2023-06-25 13:06:21 656人浏览 独家记忆
摘要

本篇内容主要讲解“怎么解决flock PHP锁不成功问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决flock php锁不成功问题”吧!flock php锁不成功是因为在isRunni

本篇内容主要讲解“怎么解决flock PHP不成功问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决flock php锁不成功问题”吧!

flock php锁不成功是因为在isRunning()方法退出后,$file_lock没有继续使用导致的,其解决办法就是确保在整个PHP生命期内,文件句柄都不会被释放即可。

怎么解决flock 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生命期内,文件句柄都不会被释放即可,所以保存在类静态成员变量里。

到此,相信大家对“怎么解决flock php锁不成功问题”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么解决flock php锁不成功问题

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

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

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

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

下载Word文档
猜你喜欢
  • 怎么解决flock php锁不成功问题
    本篇内容主要讲解“怎么解决flock php锁不成功问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决flock php锁不成功问题”吧!flock php锁不成功是因为在isRunni...
    99+
    2023-06-25
  • flock php 锁不成功怎么办?
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑flock php 锁不成功怎么办?php flock失效问题解决:这两天给自己的业余项目写了一个方法,用来避免crontab调度的PHP脚本并发执行。做法一般通过使用文...
    99+
    2016-09-02
    php flock
  • PHP登录成功后的跳转问题怎么解决
    本篇内容主要讲解“PHP登录成功后的跳转问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP登录成功后的跳转问题怎么解决”吧!一、浏览器跳转和服务器跳转在 PHP 中,有两种跳转方式...
    99+
    2023-07-05
  • 解决node-sass下载不成功的问题
    目录1、配置国内淘宝镜像2、选择node-sass的版本3、选择sass-loader的版本4、安装报错,缺少python环境在安装前端依赖node-sass时,出现了各种问题,经过...
    99+
    2022-11-13
    node-sass下载不成功 node-sass下载 node-sass下载解决
  • 怎么快速解决go get golang.org/x包不成功的问题
    这篇文章主要讲解了“怎么快速解决go get golang.org/x包不成功的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么快速解决go get golang.org/x包不成功的...
    99+
    2023-06-21
  • 怎么解决php include不行问题
    本篇内容主要讲解“怎么解决php include不行问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决php include不行问题”吧!php include不行的解决办法:1、用ft...
    99+
    2023-06-25
  • sql死锁问题怎么解决
    本篇内容介绍了“sql死锁问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! --查询锁表信息,...
    99+
    2022-10-18
  • Java死锁问题怎么解决
    今天小编给大家分享一下Java死锁问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:死锁(Dead Lock)...
    99+
    2023-06-30
  • 怎么解决PHP7中session值不能成功跨页传递问题
    本篇内容介绍了“怎么解决PHP7中session值不能成功跨页传递问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP7中session...
    99+
    2023-06-25
  • 怎么解决php config找不到问题
    本篇内容介绍了“怎么解决php config找不到问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php-config找不到的解决办法:1...
    99+
    2023-06-25
  • 怎么解决PHP opcache不生效问题
    本篇内容主要讲解“怎么解决PHP opcache不生效问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决PHP opcache不生效问题”吧!PHP opcache不生效的解决办法:1、...
    99+
    2023-06-22
  • 怎么解决php长度不足问题
    这篇文章主要介绍“怎么解决php长度不足问题”,在日常操作中,相信很多人在怎么解决php长度不足问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决php长度不足问题”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-25
  • python互斥锁问题怎么解决
    在Python中,可以使用互斥锁(Lock)来解决互斥访问问题。互斥锁是一种线程同步的机制,它可以保证在同一时刻只有一个线程能够访问...
    99+
    2023-10-23
    python
  • 怎么解决yum apache不解析php的问题
    这篇文章主要介绍怎么解决yum apache不解析php的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!yum apache不解析php的解决办法:1、安装依赖包httpd-devel;2、查看apsx所在路径;...
    99+
    2023-06-21
  • PHP开启curl扩展不成功怎么解决
    1. 确认curl扩展是否已经安装在终端中输入以下命令:```php -m | grep curl```如果curl扩展已经安装,则...
    99+
    2023-05-30
    curl扩展 curl
  • 怎么解决php fopen权限不够问题
    这篇文章主要讲解了“怎么解决php fopen权限不够问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决php fopen权限不够问题”吧!php fopen权限不够的解决办法:1、...
    99+
    2023-06-25
  • 如何解决php qrcode不生成图片的问题
    本篇内容主要讲解“如何解决php qrcode不生成图片的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决php qrcode不生成图片的问题”吧!php qrcode不生成图片的解决...
    99+
    2023-06-20
  • labview生成程序不成功怎么解决
    如果您遇到了LabVIEW生成程序不成功的问题,可以尝试以下解决方法:1. 检查代码错误:确保您的LabVIEW程序中没有语法错误或...
    99+
    2023-09-15
    labview
  • drupal安装不成功怎么解决
    1. 检查系统要求:确保你的服务器符合 Drupal 的系统要求,包括 PHP 版本、MySQL 或 PostgreSQL 数据库版...
    99+
    2023-06-04
    drupal安装 drupal
  • moodle安装不成功怎么解决
    如果您遇到了moodle安装不成功的问题,可以尝试以下解决方案:1. 检查系统要求:确保您的服务器满足moodle的最低要求,包括P...
    99+
    2023-06-05
    moodle安装 moodle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作