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数组总结篇(一)
Sep 30 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
Apr 11 PHP
深入解析php之apc
May 15 PHP
php创建sprite
Feb 11 PHP
php使用$_POST或$_SESSION[]向js函数传参
Sep 16 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
PHP实现二维数组根据key进行排序的方法
Dec 30 PHP
PHP后端银联支付及退款实例代码
Jun 23 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
php nginx 实时输出的简单实现方法
Jan 21 PHP
laravel 解决多库下的DB::transaction()事务失效问题
Oct 21 PHP
php字符串倒叙
Apr 01 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设计模式 Facade(外观模式)
2011/06/26 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
详解Javascript 中的 class、构造函数、工厂函数
2017/12/20 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
Python中字典和集合学习小结
2017/07/07 Python
python机器人行走步数问题的解决
2018/01/29 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
flask 实现token机制的示例代码
2019/11/07 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
优秀幼教自荐信
2014/02/03 职场文书
实习生求职自荐信
2014/02/07 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
部队2014年终工作总结
2014/11/27 职场文书