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 相关文章推荐
用Zend Encode编写开发PHP程序
Oct 09 PHP
打造计数器DIY三步曲(下)
Oct 09 PHP
php Memcache 中实现消息队列
Nov 24 PHP
PHP排序算法的复习和总结
Feb 15 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
详解WordPress中简码格式标签编写的基本方法
Dec 22 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
Mar 07 PHP
Smarty简单生成表单元素的方法示例
May 23 PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 PHP
Zend Framework过滤器Zend_Filter用法详解
Dec 09 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
Apr 09 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 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五种设计模式小结
2011/03/23 PHP
php支付宝接口用法分析
2015/01/04 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
JavaScript内核之基本概念
2011/10/21 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
Vue computed 计算属性代码实例
2020/04/22 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
详解Vite的新体验
2021/02/22 Javascript
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
python递归全排列实现方法
2018/08/18 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
小学英语课后反思
2014/04/26 职场文书
航海技术专业毕业生推荐信
2014/07/09 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
财政局长个人总结
2015/03/04 职场文书
个人年度总结报告
2015/03/09 职场文书
python 提取html文本的方法
2021/05/20 Python
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
Win11快速关闭所有广告推荐
2022/04/19 数码科技