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学习之运算符相关概念
Jun 09 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
浅析echo(),print(),print_r(),return之间的区别
Nov 27 PHP
一个PHP针对数字的加密解密类
Mar 20 PHP
ThinkPHP实现跨模块调用操作方法概述
Jun 20 PHP
php构造函数的继承方法
Feb 09 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
May 20 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
Oct 17 PHP
PHP获取HTTP body内容的方法
Dec 31 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的ZIP压缩类分享
2014/05/04 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
ajax异步刷新实现更新数据库
2012/12/03 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
python对json的相关操作实例详解
2017/01/04 Python
python实现Zabbix-API监控
2018/09/17 Python
python 中如何获取列表的索引
2019/07/02 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
酒店值班经理的工作职责范本
2014/02/18 职场文书
家长会欢迎词
2015/01/23 职场文书
比赛主持人开场白
2015/05/29 职场文书
催款函怎么写
2015/06/24 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
公司年会主持词范文!
2019/05/07 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫