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 相关文章推荐
如何将数据从文本导入到mysql
Oct 09 PHP
网络资源
Oct 09 PHP
PHP数字格式化
Dec 06 PHP
php设计模式 Strategy(策略模式)
Jun 26 PHP
检查php文件中是否含有bom的函数
May 31 PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
PHP在线书签系统分享
Jan 04 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
详解laravel安装使用Passport(Api认证)
Jul 27 PHP
PHP钩子实现方法解析
May 21 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 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入门速成(2)
2006/10/09 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
jQuery 选择器详解
2015/01/19 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
transform python环境快速配置方法
2018/09/27 Python
python安装pil库方法及代码
2019/06/25 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
Python计算信息熵实例
2020/06/18 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
python asyncio 协程库的使用
2021/01/21 Python
了解AppleTalk协议吗
2014/04/01 面试题
先进事迹报告会感言
2014/01/24 职场文书
小班下学期个人总结
2015/02/12 职场文书
2015年餐厅服务员工作总结
2015/04/23 职场文书
降价通知函
2015/04/23 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS