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+mysql保存和输出文件
Oct 09 PHP
php录入页面中动态从数据库中提取数据的实现
Oct 09 PHP
php5.2时间相差8小时
Jan 15 PHP
dedecms模版制作使用方法
Apr 03 PHP
PHP之变量、常量学习笔记
Mar 27 PHP
VIM中设置php自动缩进为4个空格的方法详解
Jun 14 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
推荐5款跨平台的PHP编辑器
Dec 25 PHP
thinkPHP的表达式查询用法详解
Sep 14 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
如何理解PHP核心特性命名空间
May 28 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高自定义性安全验证码代码
2011/11/27 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
2018/08/30 PHP
如何在Mozilla Gecko 用Javascript加载XSL
2007/01/09 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
jquery 学习笔记一
2010/04/07 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
php与js的区别是什么
2013/08/05 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
Python 深入理解yield
2008/09/06 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
Python3.8中使用f-strings调试
2019/05/22 Python
anaconda如何查看并管理python环境
2019/07/05 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
Python修改列表值问题解决方案
2020/03/06 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
2020/06/06 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
领导参观欢迎词
2015/01/26 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
科技馆观后感
2015/06/08 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书