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实现的功能是显示8条基色色带
Oct 09 PHP
PHP入门学习的几个不错的实例代码
Jul 13 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
Aug 17 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
Jun 25 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
PHP中Session可能会引起并发问题
Jun 26 PHP
PHP中iconv函数知识汇总
Jul 02 PHP
PHP+Ajax+JS实现多图上传
May 07 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 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 Socket配置以及实例的详细介绍
2013/06/13 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
[35:26]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第三局
2016/02/26 DOTA
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
python list排序的两种方法及实例讲解
2017/03/20 Python
名片管理系统python版
2018/01/11 Python
python实现朴素贝叶斯算法
2018/11/19 Python
Django配置文件代码说明
2019/12/04 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
美术教师自我鉴定
2014/02/12 职场文书
亲属关系公证书样本
2015/01/23 职场文书
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers