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 相关文章推荐
深入了解php4(2)--重访过去
Oct 09 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
PHP 面向对象详解
Sep 13 PHP
PHP入门之常量简介和系统常量
May 12 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
orm获取关联表里的属性值
Apr 17 PHP
thinkphp3.x中session方法的用法分析
May 20 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
php+Ajax无刷新验证用户名操作实例详解
Mar 04 PHP
PHP DB 数据库连接类定义与用法示例
Mar 11 PHP
关于laravel模板中生成URL的几种模式总结
Oct 18 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 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
mysql+php分页类(已测)
2008/03/31 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
php实现httpclient类示例
2014/04/08 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
2019/08/26 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
python中的句柄操作的方法示例
2019/06/20 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
python @classmethod 的使用场合详解
2019/08/23 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
HTML5 Blob对象的具体使用
2020/05/22 HTML / CSS
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
应聘美工求职信
2013/11/07 职场文书
开门红主持词
2014/04/02 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
星级党支部申报材料
2014/05/31 职场文书
nginx安装以及配置的详细过程记录
2021/09/15 Servers
Python借助with语句实现代码段只执行有限次
2022/03/23 Python
Java 多态分析
2022/04/26 Java/Android
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技