php进程相关

就是检查一下某个进程是否在运行?在linux上你用
ps -ef|grep 你那个进程的路径名|wc -l
这样得到了 到底有几个,如果小于2,你让他在运行一下

把ps -ef|grep 你那个进程的路径名|wc -l
这些,还有些判断,写到一个文件里去
你可以用php写,这样用ps就是系统命令调用拉,象
exec('ps -ef|grep 你那个进程的路径名|wc -l',$a,$b);
?>
$a/$b是返回值吧,你测试一下
然后这个文件永远不能执行完,类似这样
while(true){
exec('ps -ef|grep 你那个进程的路径名|wc -l',$a,$b);
//其他代码
sleep(20)//每20秒检查一下
}
?>

你也可以用perl,那文件最前面加上
#!/usr/bin/perl 
如果php,最前面加上以下,就是命令行的php路径
#!/usr/local/php/bin/php -q
//然后php代码
while(true){
exec('ps -ef|grep 你那个进程的路径名|wc -l',$a,$b);
//其他代码
sleep(20)//每20秒检查一下
}
?>

最后你让这个文件后台运行
nohup 这个文件路径 &

 

 

最好不要在php开执行shell的函数...
可以通过register_shutdown_function注册一个函数
当php结束,或碰到致命错误停止时,就会执行注册的函数

 

getmypid()获得进程ID

 

统计进程数

function countProcesses($scriptName)
{
   
// ps aux|grep "[u]pdate.php"|wc -l
   
$first    =    substr($scriptName, 0, 1);
   
$rest    =    substr($scriptName, 1);
   
   
$name    =    '"['.$first.']'.$rest.'"';
   
$cmd    =    "ps aux | grep $name | wc -l";
           
   
$result    =    exec($cmd);
           
    return
$result;
}

 

All of the examples above require you to have shell command execution turned on- this example uses only PHP functions and should work on any system (posix is included by default)-

the key is posix_getsid which will return FALSE if the processes does not exist.

$lockfile = sys_get_temp_dir() . '/myScript.lock';
$pid = file_get_contents($lockfile);
if (
posix_getsid($pid) === false) {
   print
"process has died! restarting...\n";
  
file_put_contents($lockfile, getmypid()); // create lockfile
} else {
   print
"PID is still alive! can not run twice!\n";
   exit;
}
?>

:-) perfect if you need to make sure a cron job or shell script has ended before it can be started again.

This works across users- if the cron job is started as 'root' your 'web user' can see if the process is still alive (useful for system status pages)

 

 

PHP利用文件锁实现互斥的单进程运行。对某些人可能会有帮助。
比如有些发布程序或蜘蛛程序你设定每小时运行一次,结果程序执行了1小时没执行完。
下面的代码就是解决这类问题的。
  
1 php
2 //我们需要创建一个临时的互斥锁文件,注意,如果这个文件名跟你正在用的某些文件冲突,请自行改名!
3 $lock_file = $_SERVER['PHP_SELF'].'.single.lock';
4 //打开文件指针并加非阻塞的互斥锁!因为用了LOCK_NB这种非阻塞的模式,不能取得锁就立即返回,而不会傻傻的等着。
5 if(!flock($fp=fopen($lock_file,'w'), LOCK_NB | LOCK_EX))
6 {
7 //无法取得锁就退出
8 die('cannot get lock,already running?');
9 }
10 //成功的获取了锁,就往下干该干的事情。
11 //这里注册一个shutdown_function,目的是程序结束的时候自动删掉那个互斥锁文件,避免留下垃圾。
12 register_shutdown_function('unlink', $lock_file);
不是靠文件名,而是靠flock加的那个互斥的写锁。。。
只要程序结束了,不管是正常退出还是错误退出还是被杀掉,那个锁都自然释放了。

 

 

 

 

保证单进程运行

 /**
  * 保证单进程
  *
  * @param string $processName 进程名
  * @param string $pidFile 进程文件路径
  * @return boolean 是否继续执行当前进程
  */
 function singleProcess($processName, $pidFile)
 {
  if (file_exists($pidFile) && $fp = @fopen($pidFile,"rb"))
  {
   flock($fp, LOCK_SH);
   $last_pid = fread($fp, filesize($pidFile));
   fclose($fp);

   if (!empty($last_pid))
   {
    $command = exec("/bin/ps -p $last_pid -o command=");

    if ($command == $processName)
    {
     return false;
    }
   }
  }

  $cur_pid = posix_getpid();

  if ($fp = @fopen($pidFile, "wb"))
  {
   fputs($fp, $cur_pid);
   ftruncate($fp, strlen($cur_pid));
   fclose($fp);

   return true;
  }
  else
  {
   return false;
  }
 }

 /**
  * 获取当前进程对应的Command
  *
  * @return string 命令及其参数
  */
 function getCurrentCommand()
 {
  $pid     = posix_getpid();
  $command = exec("/bin/ps -p $pid -o command=");

  return $command;
 }

 

 

if (singleProcess(getCurrentCommand(), 'path/to/script.pid'))
{
    // code goes here
}
else
{
 exit("Sorry, this script file has already been running ...\n");
}

你可能感兴趣的:(php进程相关)