php中实现进程锁与多进程的方法

 更新时间:2016年09月18日 09:14:50   转载 作者:Rodgexue  
这篇文章给大家介绍了单进程的情况的进程锁实现、进程锁实现多进程、进程锁在yii2中的实现以及杀死进程的命令,有需要的朋友们可以参考借鉴,下面来一起看看吧。

为什么需要进程锁?

主要作用就是防止你重复执行同一程序,主要用在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


上面的代码同样可以利用在你定时计划的脚本里,在开头加上就好了。相当于对单个脚本加上进程锁。

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实现的数组和XML文件相互转换功能示例

    PHP实现的数组和XML文件相互转换功能示例

    这篇文章主要介绍了PHP实现的数组和XML文件相互转换功能,结合实例形式分析了php针对xml格式数据与数组相互转换操作技巧,需要的朋友可以参考下
    2018-03-03
  • php连接oracle数据库及查询数据的方法

    php连接oracle数据库及查询数据的方法

    这篇文章主要介绍了php连接oracle数据库及查询数据的方法,以实例形式较为详细的分析了php操作oracle数据库的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • php实现保存submit内容之后禁止刷新

    php实现保存submit内容之后禁止刷新

    这篇文章主要介绍了php保存submit内容之后禁止刷新的具体实现,需要的朋友可以参考下
    2014-03-03
  • PHP如何实现订单的延时处理详解

    PHP如何实现订单的延时处理详解

    这篇文章主要给大家介绍了关于利用PHP如何实现订单的延时处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • php生成酷炫的四个字符验证码

    php生成酷炫的四个字符验证码

    可以生成随机颜色、干扰线条元素、干扰点元素的php验证码,这篇文章主要介绍了php生成酷炫的四个字符验证码的编写方法,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • php实现微信公众号无限群发

    php实现微信公众号无限群发

    本文给大家分享的是php实现的利用微信的客服接口进行各类消息的无限群发,思路非常巧妙,有需要的小伙伴可以参考下
    2015-10-10
  • php将html转成wml的WAP标记语言实例

    php将html转成wml的WAP标记语言实例

    这篇文章主要介绍了php将html转成wml的WAP标记语言的方法,实例分析了php实现标签的转换与过滤的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-07-07
  • php自动给网址加上链接的方法

    php自动给网址加上链接的方法

    这篇文章主要介绍了php自动给网址加上链接的方法,可实现对本文中的网址加上链接的功能,涉及正则匹配的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 浅谈PHP定义命令空间的几个注意点(推荐)

    浅谈PHP定义命令空间的几个注意点(推荐)

    下面小编就为大家带来一篇浅谈PHP定义命令空间的几个注意点(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)

    php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,RE

    获取用户IP地址的三个属性的区别HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR,需要的朋友可以参考下
    2012-09-09

最新评论