git 2 年之前
父节点
当前提交
19160cf9e5

+ 4 - 0
.data/log/20221206/abnormal_labels.log

@@ -0,0 +1,4 @@
+[2022-12-06 10:44:11]{"id":"01000424","event":{"dec":8,"lowBattery":0,"entry":0,"leave":1,"in":0},"time":"1667529922"}
+[2022-12-06 10:44:11]{"id":"01000422","event":{"dec":20,"lowBattery":0,"entry":1,"leave":0,"in":1},"time":"1667529922"}
+[2022-12-06 10:44:21]{"id":"01000424","event":{"dec":8,"lowBattery":0,"entry":0,"leave":1,"in":0},"time":"1667529922"}
+[2022-12-06 10:44:21]{"id":"01000422","event":{"dec":20,"lowBattery":0,"entry":1,"leave":0,"in":1},"time":"1667529922"}

+ 235 - 0
Home/Lib/Action/DahuaUtil.php

@@ -0,0 +1,235 @@
+<?php
+
+namespace Jiaruan;
+
+class DahuaUtil
+{
+    /*位操作*/
+    public static function getb($val, $pos)
+    {
+        //获取整数$val第$pos位的值
+        return (($val & 1 << $pos) > 0) ? 1 : 0;
+    }
+
+    public static function setb(&$val, $pos, $newVal)
+    {
+        //设置整数$val第$pos位的值 $newVal为0或1
+        if ($newVal) {//设置为1
+            $val |= (1 << $pos);
+        } else {//设置为0
+            $val &= ~(1 << $pos);
+        }
+    }
+
+    public static function getBit($val, $posArr)
+    {
+        //$val整数  $posArr位置数组[1,2,3]  或  $posArr[0]='1-3'; $posArr = [0, 1, 2, 3]
+        //返回值 整数
+        if (strpos($posArr[0], '-')) {
+            $tmp = explode('-', $posArr[0], 2);
+            $posArr = range($tmp[0], $tmp[1]);
+        }
+        $ret = '';
+        foreach ($posArr as $pos) {
+            $ret = DahuaUtil::getb($val, $pos) . $ret;
+        }
+        return bindec($ret);
+    }
+
+    public static function setBit(&$val, $posArr, $newVal)
+    {
+        //$val 整数 旧值
+        //$posArr 数组 要更改的位 $posArr[0]='1-3'; $posArr = [0, 1, 2, 3]
+        //$newVal 整数 新值
+        if (strpos($posArr[0], '-')) {
+            $tmp = explode('-', $posArr[0], 2);
+            $posArr = range($tmp[0], $tmp[1]);
+        }
+        $ival = strrev(decbin($newVal));//反转下
+        $k = 0;
+        foreach ($posArr as $pos) {
+            if (!isset($ival[$k])) {
+                $ival[$k] = 0;
+            }
+            DahuaUtil::setb($val, $pos, $ival[$k]);
+            $k++;
+        }
+    }
+
+    /*位操作*/
+
+
+    public static function parseLocation($str)
+    {
+        $location_arr = explode(',', $str);
+
+        $location = [];
+        $location['locationState'] = $location_arr[0];
+        $lat_d = substr($location_arr[1], 0, 2);
+        $lat_m = substr($location_arr[1], 2);
+        $location['lat'] = $lat_d + $lat_m * 60;
+        $location['latType'] = $location_arr[2];
+        $lng_d = substr($location_arr[3], 0, 3);
+        $lng_m = substr($location_arr[3], 3);
+        $location['lng'] = $lng_d + $lng_m * 60;
+        $location['lngType'] = $location_arr[4];
+        return $location;
+    }
+
+    public static function rlog(...$args)
+    {
+        //函数参数是可变参数 使用前查下static开始的大写变量配置是否正确
+        //rlog('info', [1,2,3], $a = null, '[]', $this, false);
+        $args = func_get_args();
+//        if (empty($args[0])) {
+//            return;
+//        }
+        static $LOG_CONSOLE = true;//是否输出到控制台 fpm需要为false cli可以为true
+        static $LOG_NAME = "dahua.log";//值为空时 不写入文件
+        static $LOG_SIZE = 128 * 1024 * 1024;//文件最大尺寸 大于这个尺寸时 会生成个后缀.old的文件
+
+        static $LOG_CACHE = false;//是否缓存日志内容 用于批量写入文件 如需强制刷新第一个参数传sync
+        static $CACHE_DURATION = 10;//缓存最大时间 秒
+        static $CACHE_SIZE = 1024;//缓存大小
+        static $cacheStartTime = 0;
+        static $cacheBuf = '';
+
+        static $LOG_TIMES = 10;//调用这个函数最大次数 超过次数或$logCount==1 会判断下文件大小 决定是否新生成文件
+        static $logCount = 0;
+
+        static $MAX_LEN = 5048;//数据不能超过这个  不然就截断了
+
+        $sync = false;//如果是true 使用$LOG_CACHE时会把数据保存到磁盘
+
+        $implicit0 = ['imsync', 'imtrace'];//这个函数的参数0 隐藏用法
+        $buf = '';
+        if (count($args) == 1 && $args[0] == "\n") {//只有换行时 不写入时间戳了
+            $buf = "\n";
+        } else {
+            $sync = strtolower($args[0]) == $implicit0[0];
+
+            $pid = '';//进程id
+            if (function_exists('posix_getpid')) {
+                $pid = ' ' . posix_getpid() . ' ';
+            }
+            $fileLine = '';//文件名:行号
+            {
+                $debug = debug_backtrace();
+                $backtrace = 0;
+                if (strpos($args[0], $implicit0[1]) === 0) {
+                    $backtrace = intval(str_replace($implicit0[1], '', $args[0]));
+                    unset($args[0]);
+                } else if ($sync) {
+                    unset($args[0]);
+                }
+                $fileLine = ($pid == '' ? ' ' : '') . basename($debug[$backtrace]['file'])
+                    . ':' . $debug[$backtrace]['line'] . '';
+
+            }
+
+            $allPara = '';
+            foreach ($args as $para) {
+                if (is_array($para)) {
+                    $allPara .= json_encode($para) . ' ';
+                } else if (is_object($para)) {
+                    if (method_exists($para, '__toString')) {
+                        $allPara .= $para . ' ';
+                    } else {
+                        $allPara .= get_class($para) . json_encode($para) . ' ';
+                    }
+                } else if (is_bool($para)) {
+                    $allPara .= $para ? 'true ' : 'false ';
+                } else if (is_null($para)) {
+                    $allPara .= 'null ';
+                } else {
+                    $allPara .= $para . ' ';
+                }
+            }
+
+            $len = strlen($allPara);
+            if ($len > $MAX_LEN) {
+                $allPara = substr($allPara, 0, $MAX_LEN) . "({$len})......";
+            }
+
+            $buf = "[" . date("y-m-d H:i:s") . "{$pid}{$fileLine}]" . $allPara . "\n";
+        }
+
+        $logCount++;
+        if (!empty($LOG_NAME)) {
+            if ($LOG_CACHE) {
+                if ($cacheBuf == '') {
+                    $cacheStartTime = time();
+                }
+                $cacheBuf .= $buf;
+                //超过缓存尺寸 或者 超过缓存时长 写缓存到文件
+                if (strlen($cacheBuf) > $CACHE_SIZE || time() - $cacheStartTime > $CACHE_DURATION) {
+                    $cacheStartTime = time();
+                    goto write;
+                } else {
+                    if ($sync) {
+                        goto write;
+                    } else {
+                        goto skipWrite;
+                    }
+                }
+            } else {
+                $cacheBuf = $buf;
+            }
+            write: {
+                if ($logCount > 100) {//会有缓存
+                    clearstatcache();
+                }
+                //超过尺寸后 删除旧文件 把新文件重命名为旧文件
+                if (($logCount == 1 || $logCount > $LOG_TIMES) && filesize($LOG_NAME) > $LOG_SIZE) {
+
+                    //获取独占锁
+                    $fp = fopen($LOG_NAME . '.lock', 'a');
+                    $k = 0;
+                    do {
+                        $isLock = flocK($fp, LOCK_EX);
+                        $k++;
+                        if (!$isLock && $k > 1000) {
+                            echo "lock 1000\n";
+                            goto PUT;
+                        }
+                    } while (!$isLock);
+
+                    //另外一个进程进入时 重新判断下
+                    clearstatcache();
+                    if (filesize($LOG_NAME) <= $LOG_SIZE) {
+                        goto UN;
+                    }
+
+                    //删除旧文件和重命名文件
+                    $oldLogName = $LOG_NAME . '.old';
+                    if (file_exists($oldLogName)) {
+                        if (!unlink($oldLogName)) {
+                            echo "unlink err\n";
+                        }
+                    }
+                    if (!rename($LOG_NAME, $oldLogName)) {
+                        echo "rename err\n";
+                    }
+
+                    //解锁
+                    UN:
+                    flock($fp, LOCK_UN);
+                    fclose($fp);
+
+
+                    $logCount = 0;
+                }
+                PUT:
+                if (!file_put_contents($LOG_NAME, $cacheBuf, FILE_APPEND)) {
+                    echo "file_put_contents err\n";
+                }
+                $cacheBuf = '';
+            }
+            skipWrite:{
+            }
+        }
+        if ($LOG_CONSOLE) {
+            echo $buf;
+        }
+    }
+}

+ 91 - 71
Home/Lib/Action/ListeningFileCreateAction.class.php

@@ -16,19 +16,36 @@ class ListeningFileCreateAction extends Action {
 	
  
 	public  function redis_to_kafka(  ){
+				include('DahuaUtil.php');
 				ini_set('memory_limit', '1024M');
-				$redis = new redis();
-				$redis->connect('192.168.1.105',6379);
-				$redis->select(1);
-				$result = $redis->ping();
-				echo "redis连接结果=>".$result.PHP_EOL;
+				DahuaUtil::rlog('从redis中获取被扫描的文件');
+				try{
+
+					$redis = new redis();
+					DahuaUtil::rlog('redis连接中....');
+					$redis->connect('192.168.1.105',6379);
+					$redis->select(1);
+					$result = $redis->ping();
+					if($result=='+PONG')
+					{
+						DahuaUtil::rlog('redis连接成功');
+					}else
+					{
+						DahuaUtil::rlog('redis连接失败');
+					}
 				
+				}catch(Exception $e)
+				{
+					DahuaUtil::rlog('redis连接异常',$e->getMessage());
+				}
+				
+				echo "redis连接结果=>".$result.PHP_EOL;
 				$i=0;
+				DahuaUtil::rlog('开始扫描文件');
 				while(true)
 				{
 					$data=null;
 				    $res =  $redis->rPop('redis_to_kafka');
-					
 				    if(!$res)
 				    {
 				        sleep(1);
@@ -38,8 +55,9 @@ class ListeningFileCreateAction extends Action {
 				    {
 				        continue;
 				    }
-					echo $res.PHP_EOL;
-					$start_time = time();
+					
+					DahuaUtil::rlog('扫描文件路径为:'.$res);
+					$start_time = microtime(true);
 					$fuc=function($res)
 					{	
 						$handle = fopen($res, 'rb');
@@ -54,84 +72,86 @@ class ListeningFileCreateAction extends Action {
 					$t=0;
 					foreach($fuc($res) as $value)
 					{
-						$t++;
-						$i++;
+						if(!empty($value))
+						{
+							$t++;
+							$i++;
+						}
+						
 		
 					}
 					
-					
-				
-					$end_time = time();
-					echo  '一个文件处理完成时间'.($end_time-$start_time).'s';
-					echo '上传的文件有'.$t.'条'.PHP_EOL;
-					echo '总共有了'.$i.'条'.PHP_EOL;
+					$end_time = microtime(true);
+					DahuaUtil::rlog('完成扫描文件:'.$res);
+					DahuaUtil::rlog('一个文件处理完成时间:'.($end_time-$start_time).'s');
+					DahuaUtil::rlog('上传的文件有'.$t.'条');
+					DahuaUtil::rlog('总共有了'.$i.'条');
 					$res1=str_replace(".dat.redis",".md5",$res);
 					unlink($res);
 					unlink($res1);
+					DahuaUtil::rlog('删除文件:'.$res);
+					DahuaUtil::rlog('删除md5文件:'.$res1);
 				}
 					
+		
 	}
-	
- 
 	public  function scan_no_listening(  ){
 		include('DahuaUtil.php');
-				$dir = '/home/renlian';
-				$ip='192.168.1.105';
-				$post=6379;
-					if(is_file($dir))
+		$dir = '/home/renlian';
+		$ip='192.168.1.105';
+		$post=6379;
+			if(is_file($dir))
+			{
+			   return;
+			}
+		    $redis = new Redis();
+			DahuaUtil::rlog('连接redis'. $data);
+		
+			try{
+					 $redis->connect($ip,$post,2.5);
+					 $redis->auth($password); //设置密码
+					$redis->select(1);
+					$result = $redis->ping();
+					if($result=='+PONG')
 					{
-					   return;
+		             
+		             DahuaUtil::rlog('redis连接成功');
 					}
-				    $redis = new Redis();
-					echo '我被唤醒了';
-				
-					try{
-							 $redis->connect($ip,$post,2.5);
-							 $redis->auth($password); //设置密码
-							$redis->select(1);
-							$result = $redis->ping();
-							if($result=='+PONG')
-							{
-				             
-				             DahuaUtil::rlog('redis连接成功');
-							}
-							else
-							{
-								DahuaUtil::rlog("redis连接失败=>".$result);
-								
-							}
-				                  
-				       }catch (Exception $e){
-				
-				           DahuaUtil::rlog("redis连接异常".$e->getMessage());
-				
-				    }
-				
-					
-				    $files = scandir($dir);
-		
-					
-				    foreach($files as $k=>$filename) {//务必使用!==,防止目录下出现类似文件名“0”等情况
+					else
+					{
+						DahuaUtil::rlog("redis连接失败=>".$result);
 						
-		if ($filename != "." && $filename != ".." &&!strstr($filename,'.redis')&&!strstr($filename,'.md5')&&is_file($dir.'/'.$filename))    {
-				          $data = $dir.'/'.$filename;
-						  
-							  $file_md5 = str_replace('.dat','.md5',$data);
-							  if(!is_file($file_md5))
-							  {
-								  continue;
-							  }
-							 
-				          if(rename($data,$data.'.redis'))
-				          {
-				              $redis->lpush('redis_to_kafka',$data.'.redis');
-				          }
-				    }
-				                   }
-				   closedir($dir);
-					 $redis->close();
+					}
+		                  
+		       }catch (Exception $e){
+		
+		           DahuaUtil::rlog("redis连接异常".$e->getMessage());
+		
+		    }
+			
+			DahuaUtil::rlog('开始扫描文件夹 '. $dir);
+		    $files = scandir($dir);
+		    foreach($files as $k=>$filename) {//务必使用!==,防止目录下出现类似文件名“0”等情况
 				
-				   return;
+		    if ($filename != "." && $filename != ".." &&!strstr($filename,'.redis')&&!strstr($filename,'.md5')&&is_file($dir.'/'.$filename))    {
+		          $data = $dir.'/'.$filename;
+				  
+					  $file_md5 = str_replace('.dat','.md5',$data);
+					  if(!is_file($file_md5))
+					  {
+						  continue;
+					  }
+				  DahuaUtil::rlog('将文件添加到redis中'. $data);
+		          if(rename($data,$data.'.redis'))
+		          {
+		              $redis->lpush('redis_to_kafka',$data.'.redis');
+		          }
+		    }
+		                   }
+		   closedir($dir);
+			 $redis->close();
+		
+		   return;
 	}
 	
 

+ 1 - 1
Home/Lib/Action/RouteRfidKafkaAction.class.php

@@ -74,7 +74,7 @@ class RouteRfidKafkaAction extends Action {
 			$stid = oci_parse($conn, $sql);
 			
 		   $r = oci_execute($stid);
-			echo 
+			
 			echo 111;
 			throw new \Exception('insert data to oracle false');
 			if(!$r){