最新公告
  • 欢迎您光临002y资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • php中实现进程锁与多进程的方法

    正文概述    2023-07-03   8749

    为什么需要进程锁?

    主要作用就是防止你重复执行同一程序,主要用在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能有所帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


    002y资源网 » php中实现进程锁与多进程的方法

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    微信支付
    余额支付
    ×
    微信扫码支付 0 元