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 相关文章推荐
PHP Session变量不能传送到下一页的解决方法
Nov 27 PHP
PHP中的integer类型使用分析
Jul 27 PHP
深入php 正则表达式的学习探讨
Jun 06 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
Aug 20 PHP
Yii使用Captcha验证码的方法
Dec 28 PHP
php实现贪吃蛇小游戏
Jul 26 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
浅析php-fpm静态和动态执行方式的比较
Nov 09 PHP
php in_array() 检查数组中是否存在某个值详解
Nov 23 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
Laravel框架中缓存的使用方法分析
Sep 06 PHP
Swoole扩展的6种模式深入详解
Mar 04 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文件的实现方法
2007/03/19 PHP
php学习之function的用法
2012/07/14 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
HR vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
学习ExtJS border布局
2009/10/08 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
django session完成状态保持的方法
2018/11/27 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
Pyqt5自适应布局实例
2019/12/13 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
考试作弊被抓检讨书
2014/01/10 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
临时用工协议书范本
2014/10/29 职场文书
2014年教育工作总结
2014/11/26 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
个人收入证明范本
2015/06/12 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书