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函数
May 31 PHP
PHP中使用Imagick操作PSD文件实例
Jan 26 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
php的4种常见运行方式
Mar 20 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
关于PHP中字符串与多进制转换函数的实例代码
Nov 03 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
PHP实现权限管理功能示例
Sep 22 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
如何优雅的使用 laravel 的 validator验证方法
Nov 11 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 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实现redis数据库指定库号迁移的方法
2015/01/14 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
vue使用监听实现全选反选功能
2018/07/06 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
Python lambda表达式用法实例分析
2018/12/25 Python
Python多进程fork()函数详解
2019/02/22 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
浅析Django中关于session的使用
2019/12/30 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
python中实现栈的三种方法
2020/12/19 Python
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
优秀的导游求职信范文
2014/04/06 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
党支部先进事迹材料
2014/12/24 职场文书
运动与健康自我评价
2015/03/09 职场文书
结婚堵门保证书
2015/05/08 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android