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

本文介绍了一个强制PHP在单进程中执行的函数,多用在php命令行中和一些特殊需求的地方,需要的朋友可以参考下,代码如下:

  1. /**
  2. * 保证单进程
  3. *
  4. * @param string $processName 进程名
  5. * @param string $pidFile 进程文件路径
  6. * @return boolean 是否继续执行当前进程
  7. */
  8. function singleProcess($processName, $pidFile)
  9. {
  10. if (file_exists($pidFile) && $fp = @fopen($pidFile,"rb"))
  11. {
  12. flock($fp, LOCK_SH);
  13. $last_pid = fread($fp, filesize($pidFile));
  14. fclose($fp);
  15. if (!emptyempty($last_pid))
  16. {
  17. $command = exec("/bin/ps -p $last_pid -o command=");
  18. if ($command == $processName)
  19. {
  20. return false;
  21. }
  22. }
  23. }
  24. $cur_pid = posix_getpid();
  25. if ($fp = @fopen($pidFile, "wb"))
  26. {
  27. fputs($fp, $cur_pid);
  28. ftruncate($fp, strlen($cur_pid));
  29. fclose($fp);
  30. return true;
  31. }
  32. else
  33. {
  34. return false;
  35. }
  36. }
  37. /**
  38. * 获取当前进程对应的Command
  39. *
  40. * @return string 命令及其参数
  41. */
  42. function getCurrentCommand()
  43. {
  44. $pid = posix_getpid();
  45. $command = exec("/bin/ps -p $pid -o command=");
  46. return $command;
  47. }

使用方法:

  1. if (singleProcess(getCurrentCommand(), 'path/to/script.pid'))
  2. {
  3. // code goes here
  4. }
  5. else
  6. {
  7. exit("Sorry, this script file has already been running ...\n");
  8. }