phpプロセス関連

5095 ワード

プロセスが実行されているかどうかを確認します.linuxの上であなたはps-ef|grepあなたのそのプロセスの経路名|wc-lを使ってこのように得たのはいったいいくつかあって、もし2より小さいならば、あなたは彼にps-ef|grepあなたのそのプロセスの経路名|wc-lを実行させて、まだいくつかの判断があって、1つのファイルの中であなたが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...
"
;
  
file_put_contents($lockfile, getmypid()); // create lockfile
} else {
   print
"PID is still alive! can not run twice!
"
;
   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回実行するように設定していますが、プログラムは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 ..."); }