PHP进程同步代码实例


Posted in PHP onFebruary 12, 2015

经常遇到这样一种情况,计划任务定时后台执行某个php程序,有时候也需要手动执行,可能多个人都需要执行这个程序,如果任务持续时间非常长,就很容易造成重复执行,所以就开发了下面的类。

作用:在实际代码运行前检查与当前相同操作的进程是否正在运行,高并发运行是可靠的,运行中的进程中途异常中断不会产生任何影响。

构造方法传递pid文件目录的绝对路径,需要自己保证不同进程对应不同pid文件。

<?php
/*

 * 同一个PHP进程只运行一次,根据进程名字判断是否为排重进程,只能运行于linux,高并发条件下是并发安全的。

 */
class SyncProcess {
 private $pidFile;
 function __construct($pidFile) {

  $this->pidFile = $pidFile;

 }
 /**

  * 非阻塞方式返回进程是否正在运行

  */

 function check() {

  if (PHP_OS == 'Linux') {

   $pidFile = $this->pidFile;

   if (!empty($pidFile)) {

    $flag = false;

    $pidDir = dirname($pidFile);

    if (is_dir($pidDir)) {

     $flag = true;

    }

    if ($flag) {

     $running = true;

     clearstatcache(true, $this->pidFile);

     if (!file_exists($this->pidFile))

      file_put_contents($this->pidFile, '', LOCK_EX);

     $f = fopen($this->pidFile, 'r+');

     if (flock($f, LOCK_EX ^ LOCK_NB)) {

      $pid = trim(fgets($f));

      if (!$this->is_process_running($pid)) {

       $running = false;

      }

     }

     if (!$running) {

      fseek($f, 0);

      ftruncate($f, 0);

      fwrite($f, getmypid());

     }

     flock($f, LOCK_UN);

     fclose($f);

     return $running;

    } else {

     debug_print("pid file($pidFile) is invalid", E_USER_WARNING);

    }

   } else {

    debug_print("pid file cant't be empty", E_USER_WARNING);

   }

  } else {

   debug_print(__CLASS__ . ' can only run in Linux', E_USER_WARNING);

   return true;

  }

 }
 /**

  * 如果正在运行或者发生未知错误返回true,如果没有运行返回false

  * @param mixed $pid

  */

 private function is_process_running($pid) {

  if (is_numeric($pid) && $pid > 0) {

   $output = array();

   $line = exec("ps -o pid --no-headers -p $pid", $output);

   //返回值有空格

   $line = trim($line);

   if ($line == $pid) {

    return true;

   } else {

    if (empty($output)) {

     return false;

    } else {

     if (php_sapi_name() == 'cli')

      $n = "\n";

     else

      $n = "<br>";

     //到这一步的话应该是出什么问题了

     $output = implode($n, $output);

     debug_print($output, E_USER_WARNING);

     return true;

    }

   }

  }else {

   return false;

  }

 }
}

Demo:

$sync = new SyncProcess(APP_PATH . '/data/pid'.implode('', $this->getRoute()));

if ($sync->check()) {

 exit("process is running\n");

}
PHP 相关文章推荐
模仿OSO的论坛(一)
Oct 09 PHP
简单的页面缓冲技术
Oct 09 PHP
GBK的页面输出JSON格式的php函数
Feb 16 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
Jun 20 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 PHP
yii实现使用CUploadedFile上传文件的方法
Dec 28 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
总结PHP内存释放以及垃圾回收
Mar 29 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
Oct 17 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
PHP文件操作简单介绍及函数汇总
Dec 11 PHP
PHP CURL 内存泄露问题解决方法
Feb 12 #PHP
PHP中捕获超时事件的方法实例
Feb 12 #PHP
php单例模式示例分享
Feb 12 #PHP
PHP 正则表达式小结
Feb 12 #PHP
一个非常完美的读写ini格式的PHP配置类分享
Feb 12 #PHP
PHP动态输出JavaScript代码实例
Feb 12 #PHP
PHP使用JSON和将json还原成数组
Feb 12 #PHP
You might like
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
微信小程序实现侧边栏分类
2019/10/21 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
Python 返回汉字的汉语拼音
2009/02/27 Python
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
浅述python2与python3的简单区别
2018/09/19 Python
Python调用C语言的实现
2019/07/26 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
Lookfantastic俄罗斯:欧洲在线化妆品零售商
2019/08/06 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
餐饮业员工工作决心书
2014/03/11 职场文书
公司建议书怎么写
2014/05/15 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
2015年端午节活动方案
2015/05/05 职场文书