宝哥软件园

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

编辑:宝哥软件园 来源:互联网 时间:2021-09-07

为什么我需要进程锁?

主要功能是防止你重复执行同一个程序,主要用在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('无法创建锁定文件{ $ lock _ file } n ');if(!flock($lock_file_handle,LOCK _ EX LOCK _ NB)){ die(date(' Y-m-d h : I :s ')。流程已经存在。 n ');}while(1){}然后,在linux环境下,这段代码会第一次正常运行,然后第二次提示:Process已经存在。无论执行多少次,都会出现此提示,表示该过程已经失败。

PHP process.php//symbol表示在后台运行PHP

上面的代码也可以用在你的预定脚本中,只需在开头添加它。相当于给单个脚本添加一个进程锁。

2.进程锁实现多进程

上面说的是锁对应于一个php脚本。如果想用一个进程锁实现多个进程,其实可以让一个进程拥有多个进程锁。可以通过稍微改变上述代码中进程锁的名称部分来实现。进程锁的名称是根据传入的参数确定的。如果传入的参数一致,则它对应于同一个锁。

if(!($ argc 1)){ $ lock _ FILE=dir name(_ _ FILE _ _)。/process . lock ';} else { unset($ argv[0]);$lock_file=dirname(__FILE__)。/process '。内爆('.',$argv)。“锁定”;} $ lock _ file _ handle=fopen($ lock _ file,' w ');if($ lock _ file _ handle===false){ die('无法创建锁定文件$ lock _ file n ');}if(!flock($lock_file_handle,LOCK _ EX LOCK _ NB)){ die(date(' Y-m-d h : I :s ')。流程已经存在。 n ');}而(1){}在linux环境下。输入文件所在的目录,执行PHP process.php 1,然后打开一个新窗口。如果您执行PHP process.php 1,您将被提示错误进程已经存在,但如果您执行PHP process.php 2,它将正常运行。同样,您可以传递两个参数,例如PHP process.php 12。在这种情况下,相应的进程锁是新的。这个实现主要使用两个php参数,argc和argv。argc指示参数的总数,argv指示调用时使用哪个参数。

3.yii2中进程锁的实现

要在yii2中实现多进程的进程锁,需要继承yii控制台中的控制器,从而实现参数的传递,使用yii console Controller然后,在crontab中,命令如下,定时脚本用yii的命令执行。那么进程锁的代码和上面一样。

* * * * *

这绝对是壁橱底部的东西。我不告诉他一般人。可以通过一个命令删除相应的进程。以下命令可以直接删除进程名为process_name的所有进程。要删除某些内容,只需将process_name直接更改为要删除的进程的名称

psaux | grep process _ name | grep-v grep | awk“{ print $ 2 }”| xargs kill-9摘要

以上都是关于php中的进程锁和多进程实现。希望本文的内容对大家学习或使用PHP有所帮助。有问题可以留言交流。谢谢你的支持。

更多资讯
游戏推荐
更多+