<?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} ");if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) { die(date("Y-m-d H:i:s") . " Process already exists. ");}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 ");}if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) { die(date("Y-m-d H:i:s") . " Process already exists. ");}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 表示具体调用的时候用的是哪个参数。
use yiiconsoleController;
然后在crontab中,命令如下,用yii自带的命令来执行定时脚本。然后进程锁的代码和上面的一样就可以了。* * * * * root /usr/local/bin/php /data/www/html/newVanish/yii 控制器名/方法 传递的参数 > /dev/null 2>&14.杀死进程的命令
ps aux|grep process_name |grep -v grep|awk "{print $2}"|xargs kill -9总结