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留言本实例代码
May 09 PHP
PHP中的string类型使用说明
Jul 27 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
php的hash算法介绍
Feb 13 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
php广告加载类用法实例
Sep 23 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
php实现可逆加密的方法
Aug 11 PHP
Thinkphp3.2.3分页使用实例解析
Jul 28 PHP
PHP编程获取各个时间段具体时间的方法
May 26 PHP
Laravel学习教程之View模块详解
Sep 18 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程序
2006/10/09 PHP
关于尾递归的使用详解
2013/05/02 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
JS动画效果代码3
2008/04/03 Javascript
js几个验证函数代码
2010/03/25 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
详解如何运行vue项目
2019/04/15 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
深入学习python的yield和generator
2016/03/10 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
用Python制作音乐海报
2021/01/26 Python
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
运动会邀请函范文
2014/01/31 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
敬老模范事迹
2014/05/21 职场文书
高中运动会广播稿
2014/09/16 职场文书
走进毛泽东观后感
2015/06/04 职场文书
摘录式读书笔记
2015/07/01 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
一文带你探究MySQL中的NULL
2021/11/11 MySQL