/**
* 获取当前程序运行了多少个进程
* @param $processName 程序进程名,要唯一
*/
function GetInstancePids($processName)
{
// 把文件放到外面去,防止发布版本把状态文件搞没了
$dir = dirname(dirname(dirname(dirname(__FILE__)))).'/data'.'/pids';
$file = $dir . DIRECTORY_SEPARATOR . $processName;
$pinfo = getCurrentProcessInfo();
if (!file_exists($file)) {
file_put_contents($file, "{$pinfo['pid']}\t{$pinfo['cmd']}\n");
return true;
}
$i = 0;
$pidfile = fopen($file, 'r+');
do {
if (flock($pidfile, LOCK_EX)) {
break;
} else {
if ($i++ == 10) {
exit('try 10 times to lock pid file,faild');
}
usleep(1000);
}
} while (true);
$read = fread($pidfile, 10240);
rewind($pidfile);
$read = explode("\n", trim($read));
$process_info = [];
foreach ($read as $index => $line) {
list($pid, $cmd) = explode("\t", $line);
if (!empty($pid) && isPidExists($pid, $cmd)) {
$process_info[] = "{$pid}\t{$cmd}";
}
}
$process_info[] = "{$pinfo['pid']}\t{$pinfo['cmd']}";
ftruncate($pidfile,0);
fwrite($pidfile, implode("\n", $process_info));
fflush($pidfile);
flock($pidfile, LOCK_UN);
fclose($pidfile);
return true;
}
/**
* 返回自身进程信息
*/
function getCurrentProcessInfo()
{
$mypid = getmypid();
$outputs = [];
exec('ps -ax | grep -E "^\s*' . $mypid . '\s+"', $outputs);
$matched = [];
preg_match('/^\s*(\S+?)\s+?\S+?\s+?(\S+?)\s+?\S+?\s+?(.+)/', $outputs[0], $matched);
return [
'pid' => $matched[1],
'uptime' => $matched[2],
'cmd' => $matched[3],
];
}
function isPidExists($pid, $cmd)
{
exec('ps -ax | grep -E "^\s?'. $pid . '.+?'.$cmd.'"', $result);
return isset($result[0]);
}
使用的时候:
$pids = GetInstancePids(“xxx”);
if (count($pids) > 1) die(“程序运行中”);