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 相关文章推荐
PR值查询 | PageRank 查询
Dec 20 PHP
php读取javascript设置的cookies的代码
Apr 12 PHP
逆序二维数组插入一元素的php代码
Jun 08 PHP
php导出word格式数据的代码实例
Nov 25 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
Apr 05 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
Sep 12 PHP
php上传图片获取路径及给表单字段赋值的方法
Jan 23 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 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中使用gettext来支持多语言的方法
2011/05/02 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
2017/10/19 jQuery
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
js实现图片3D轮播效果
2019/09/21 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
vue单元格多列合并的实现
2020/11/26 Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
同事吵架检讨书
2014/02/05 职场文书
购房协议书范本
2014/04/11 职场文书
红领巾广播站广播稿
2015/08/19 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
《废话连篇——致新手》——chinapizza
2022/04/05 无线电
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js