php中实现进程锁与多进程的方法


Posted in PHP onSeptember 18, 2016

为什么需要进程锁?

主要作用就是防止你重复执行同一程序,主要用在crontab中,当你设置了一个定时任务,然后每分钟执行一次,如果不加进程锁的话,之前的进程没有执行完的情况下。每分钟都会有新的进程生成了。加上进程锁之后,每次定时任务执行的时候,就会去判断之前的进程锁是否存在,如果存在就不执行。

1.单进程的情况的进程锁实现

直接来个例子好了,写个php脚本, 就先命名为process.php吧,代码如下:

<?php
$lock_file = dirname(__FILE__) . "/process.lock";
$lock_file_handle = fopen($lock_file, 'w');
if ($lock_file_handle === false)
 die("Can not create lock file {$lock_file}\n");
if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) {
 die(date("Y-m-d H:i:s") . " Process already exists.\n");
}

while(1){
}

然后在linux环境下,执行这个代码,第一次会正常运行,然后第二次运行的时候就会提示:Process already exists. 之后无论执行多少次都会出现这个提示表示进程失败了。

php process.php & //&符号表示在后台运行php

php中实现进程锁与多进程的方法

上面的代码同样可以利用在你定时计划的脚本里,在开头加上就好了。相当于对单个脚本加上进程锁。

2.进程锁实现多进程

上面说的是一个锁对应一个php脚本,那要用进程锁实现多进程的话,其实就是让一个进程可以有多个进程锁就好了。
对上面的代码的进程锁的名字部分稍加改动即可实现,根据传进来的参数来决定进程锁的名字,如果传进来的参数一致则对应同一个锁。

if(!($argc > 1))
{
 $lock_file = dirname(__FILE__) . "/process.lock";
}else{
 unset($argv[0]);
 $lock_file = dirname(__FILE__) . "/process". implode('.', $argv) .".lock";
}

$lock_file_handle = fopen($lock_file, 'w');
if ($lock_file_handle === false){
 die("Can not create lock file $lock_file\n");
}

if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) {
 die(date("Y-m-d H:i:s") . " Process already exists.\n");
}

while(1){
}

在linux环境下。进入文件所在目录,执行php process.php 1, 然后新开个窗口,在执行php process.php 1,就会提示Process already exists这个错误,但是如果你执行的是php process.php 2,就会正常运行,同样,你可以传两个参数,如php process.php 1 2,这样的话,对应的又是新的进程锁。这个实现主要用到的是argc和argv 这两个php自带的参数,argc表示参数总数,argv 表示具体调用的时候用的是哪个参数。

3.进程锁在yii2中的实现

在yii2中要实现多进程的进程锁的话,要继承yii的console里的控制器,这样能实现参数的传递,use yii\console\Controller;
然后在crontab中,命令如下,用yii自带的命令来执行定时脚本。然后进程锁的代码和上面的一样就可以了。

* * * * * root /usr/local/bin/php /data/www/html/newVanish/yii 控制器名/方法 传递的参数 > /dev/null 2>&1

4.杀死进程的命令

这个绝对是压箱底的东西了,一般人我不告诉他。
通过一条命令就能删除对应的进程。下面的命令就是可以直接删除进程名字为 process_name 的所有进程。要删除什么只要直接将 process_name修改成你想要删除的进程名字就可以了

ps aux|grep process_name |grep -v grep|awk '{print $2}'|xargs kill -9

总结

以上就是关于php中进程锁与多进程实现的全部内容,希望这篇文章的内容对大家学习或者使用PHP能有所帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php Undefined index和Undefined variable的解决方法
Mar 27 PHP
在同一窗体中使用PHP来处理多个提交任务
May 08 PHP
一贴学会PHP 新手入门教程
Aug 03 PHP
php实现快速排序法函数代码
Aug 27 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
Nov 05 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
Sep 23 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 PHP
CodeIgniter记录错误日志的方法全面总结
May 17 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
PHP获取数组中指定的一列实例
Dec 27 PHP
php curl批处理实现可控并发异步操作示例
May 09 PHP
注意!PHP 7中不要做的10件事
Sep 18 #PHP
深入理解PHP类的自动载入机制
Sep 16 #PHP
PHP实现链式操作的原理详解
Sep 16 #PHP
详解PHP中websocket的使用方法
Sep 15 #PHP
PHP简单实现上一页下一页功能示例
Sep 14 #PHP
PHP自定义函数格式化json数据示例
Sep 14 #PHP
ThinkPHP中session函数详解
Sep 14 #PHP
You might like
PHP 数组基础知识小结
2010/08/20 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
2019/11/12 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
Python3使用requests发闪存的方法
2016/05/11 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
环境科学专业大学生自荐信格式
2013/09/21 职场文书
土木工程师岗位职责
2013/11/24 职场文书
财务管理制度范本
2015/08/04 职场文书
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript
Python数据结构之队列详解
2022/03/21 Python