强制PHP命令行脚本单进程运行的方法

  

复制代码 代码如下:

  /**

  * 保证单进程

  *

  * @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");

  }