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 正则匹配函数体
Aug 25 PHP
php面向对象全攻略 (十) final static const关键字的使用
Sep 30 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
Apr 28 PHP
php自定义加密与解密程序实例
Dec 31 PHP
php不使用copy()函数复制文件的方法
Mar 13 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 PHP
用PHP的socket实现客户端到服务端的通信实例详解
Feb 04 PHP
Yii2框架类自动加载机制实例分析
May 02 PHP
php异常处理捕获错误整理
Sep 23 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
php 中的closure用法详解
2017/06/12 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
javascript打印输出json实例
2013/11/11 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
2015/05/12 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
实例讲解v-if和v-show的区别
2019/01/31 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
python 切换root 执行命令的方法
2019/01/19 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
Python datetime 如何处理时区信息
2020/09/02 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
毕业生找工作的自我评价
2013/10/18 职场文书
旷课检讨书范文
2014/10/30 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
个人年度总结报告
2015/03/09 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
深入理解python协程
2021/06/15 Python
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
Pygame Draw绘图函数的具体使用
2021/11/17 Python