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维护文件系统
Oct 09 PHP
PHP伪静态写法附代码
Jun 20 PHP
php中判断文件空目录是否有读写权限的函数代码
Aug 07 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
PHP中常用的转义函数
Feb 28 PHP
php 利用array_slice函数获取随机数组或前几条数据
Sep 30 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 PHP
Laravel框架文件上传功能实现方法示例
Apr 16 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 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具体实现代码
2010/10/12 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
学习php中的正则表达式
2014/08/17 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
2016/12/10 PHP
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
基于node.js实现爬虫的讲解
2019/02/18 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
Python pandas库中的isnull()详解
2019/12/26 Python
Pytorch之finetune使用详解
2020/01/18 Python
python算的上脚本语言吗
2020/06/22 Python
五种Python转义表示法
2020/11/27 Python
python数据抓取3种方法总结
2021/02/07 Python
python re模块常见用法例举
2021/03/01 Python
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
总裁助理岗位职责
2014/02/17 职场文书
新教师岗前培训方案
2014/06/05 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android