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 相关文章推荐
桌面中心(三)修改数据库
Oct 09 PHP
新手学PHP之数据库操作详解及乱码解决!
Jan 02 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 PHP
yii实现创建验证码实例解析
Jul 31 PHP
ThinkPHP多语言支持与多模板支持概述
Aug 22 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
Apr 15 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
php调用云片网接口发送短信的实现方法
Oct 25 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
phpMyAdmin通过密码漏洞留后门文件
Nov 20 PHP
PHP验证类的封装与使用方法详解
Jan 10 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
May 06 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+javascript液晶时钟
2006/10/09 PHP
PHP JSON 数据解析代码
2010/05/26 PHP
PHP类中Static方法效率测试代码
2010/10/17 PHP
一个PHP分页类的代码
2011/05/18 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
jquery创建一个ajax关键词数据搜索实现思路
2013/02/26 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python中运行并行任务技巧
2015/02/26 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
python绘制玫瑰的实现代码
2020/03/02 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
秘书岗位职责
2013/11/18 职场文书
基层干部十八大感言
2014/01/19 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
简易版租房协议书范本
2014/10/13 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
辅导员学期工作总结
2015/08/14 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书