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和XSL stylesheets转换XML文档
Oct 09 PHP
PHP新手上路(七)
Oct 09 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
Jul 04 PHP
php开启openssl的方法
May 15 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
Dec 12 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
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
php 表单数据的获取代码
2009/03/10 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
简介Python中用于处理字符串的center()方法
2015/05/18 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
医药专业推荐信
2013/11/15 职场文书
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
中专生求职自荐信范文
2013/12/22 职场文书
教师评优事迹材料
2014/01/10 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
公司租房协议书范本
2014/10/08 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python
python中pymysql包操作数据库方法
2022/04/19 Python