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 相关文章推荐
计数器详细设计
Oct 09 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
PHP学习之字符串比较和查找
Apr 17 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
PHP的魔术常量__METHOD__简介
Jul 08 PHP
php文件上传简单实现方法
Jan 24 PHP
php等比例缩放图片及剪切图片代码分享
Feb 13 PHP
PHP如何将XML转成数组
Apr 04 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
tp5.1框架数据库子查询操作实例分析
May 26 PHP
PHP dirname简单使用代码实例
Nov 13 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
discuz authcode 经典php加密解密函数解析
2020/07/12 PHP
PHP关联链接常用代码
2012/11/05 PHP
PHP6新特性分析
2016/03/03 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
python操作MongoDB基础知识
2013/11/01 Python
Python中分数的相关使用教程
2015/03/30 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
什么是python的函数体
2020/06/19 Python
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
汽车维修专业个人求职信范文
2014/01/01 职场文书
旅游管理专业生自荐信范文
2014/01/02 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
学校工作推荐信范文
2014/07/11 职场文书
审计班子对照检查材料
2014/08/27 职场文书
找规律教学反思
2016/02/23 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫
Spring 使用注解开发
2022/05/20 Java/Android