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 相关文章推荐
Ajax PHP简单入门教程代码
Apr 25 PHP
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
Mar 10 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
PHP常用正则表达式集锦
Aug 17 PHP
php计算数组相同值出现次数的代码(array_count_values)
Jan 20 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
php类自动加载器实现方法
Jul 28 PHP
分享PHP守护进程类
Dec 30 PHP
PHP中的多种加密技术及代码示例解析
Oct 20 PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP封装的XML简单操作类完整实例
Nov 13 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 显示客户端IP与服务器IP的代码
2010/10/12 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
PHP中大于2038年时间戳的问题处理方案
2015/03/03 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
超级强大的表单验证
2006/06/26 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
javascript判断office版本示例
2014/04/11 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
python实现ID3决策树算法
2017/12/20 Python
python 常用的基础函数
2018/07/10 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
生态养殖创业计划书
2014/05/06 职场文书
小学雷锋月活动总结
2014/07/03 职场文书
大学生找工作求职信
2014/07/09 职场文书
竞选学委演讲稿
2014/09/13 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python