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 header函数分析详解
Aug 06 PHP
PHP中如何定义和使用常量
Feb 28 PHP
php curl的深入解析
Jun 02 PHP
使用php判断网页是否gzip压缩
Jun 25 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
php魔术变量用法实例详解
Nov 13 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
PHP PDOStatement::bindValue讲解
Jan 30 PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 PHP
laravel 5.3 单用户登录简单实现方法
Oct 14 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中MD5函数使用实例代码
2008/06/07 PHP
Yii框架登录流程分析
2014/12/03 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
python list语法学习(带例子)
2013/11/01 Python
python多线程操作实例
2014/11/21 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
用pycharm开发django项目示例代码
2018/10/24 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
用Python制作音乐海报
2021/01/26 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
测绘工程本科生求职信
2013/10/10 职场文书
公司员工管理制度
2015/08/04 职场文书
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫