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 27 PHP
PHP 一个页面执行时间类代码
Mar 05 PHP
php 编写安全的代码时容易犯的错误小结
May 20 PHP
php实现utf-8和GB2312编码相互转换函数代码
Feb 07 PHP
php cli模式学习(PHP命令行模式)
Jun 03 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 PHP
yii2简单使用less代替css示例
Mar 10 PHP
php mysql_list_dbs()函数用法示例
Mar 29 PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 PHP
php中isset与empty函数的困惑与用法分析
Jul 05 PHP
PHP开发API接口签名生成及验证操作示例
May 27 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下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
详细分析React 表单与事件
2020/07/08 Javascript
Vue性能优化的方法
2020/07/30 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
python 捕获shell脚本的输出结果实例
2017/01/04 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
大学学年自我鉴定
2013/10/28 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
大学班长的职责
2014/01/27 职场文书
婚前协议书
2014/04/15 职场文书
公司应聘自荐书
2014/06/14 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript