php 常用的自定义方法(日志记录等)

<?php

/**
 * 生成 GUID
 */
function createGuid() : string {
  $charId = strtoupper(md5(uniqid(mt_rand(), true)));
  $hyphen = chr(45);  // '-'
  $guid = substr($charId, 0, 8) . $hyphen
          . substr($charId, 8, 4) . $hyphen
          . substr($charId, 12, 4) . $hyphen
          . substr($charId, 16, 4) . $hyphen
          . substr($charId, 20, 12);
  return $guid;
}


/**
 * 根据xml节点获取数组
 */
function getArray($node) {
  $array = false;
  if ($node->hasAttributes()) {
    foreach ($node->attributes as $attr) {
      $array[$attr->nodeName] = $attr->nodeValue;
    }
  }
  if ($node->hasChildNodes()) {
    foreach ($node->childNodes as $childNode) {
      if ($childNode->nodeType != XML_TEXT_NODE) {
        $array[$childNode->nodeName][] = getArray($childNode);
      }
    }
  }
  if($node->nodeValue != ''){
    $array[$node->nodeName] = $node->nodeValue;
  }
  return $array;
}

/**
 * 将xml字符串转换成数组
 */
function xml2array(string $xmlstring = '') {
  try {
    $dom = new DOMDocument('1.0','utf-8');
    $dom->loadXML($xmlstring);
    $arr = getArray($dom->documentElement);
  } catch (Exception $e) {
    $arr = [];
  }
  return $arr;
}

/**
 * 移除 xml 字符串头
 */
function removeXmlHeader(string $xml = '') : string {
  try {
    $xml = nl2br($xml);
    $xml = explode('<br />', $xml);
    $xml = substr($xml[1], 1);
  } catch (Exception $e) {
    $xml = '';
  }
  return $xml;
}

/**
 * 把下划线转换成驼峰式
 */
function convertUnderline(string $str, bool $ucfirst = false) : string {
  $str = ucwords(str_replace('_', ' ', $str));
  $str = str_replace(' ','',lcfirst($str));
  return $ucfirst ? ucfirst($str) : $str;
}

/**
 * 下载文件
 */
function download($filename, $data = null, $filetype = null) {
  $basename = pathinfo($filename);
  if (!$data) {
    ob_clean();
    flush();
    $data = file_get_contents($filename);
    header('Content-Length:' . filesize($filename));  //指定文件大小的
  }
  if ($filetype) {
    header("Content-Type: $filetype"); //指定下载文件类型的
  }
  // $name = urlencode($basename['basename']);
  $name = base64_encode($basename['basename']);
  header('Content-Disposition:attachment;filename=' . $name);
  echo $data;
}

/**
 *
 * 打包下载多个文件
 * 单个文件则不打包
 * @param $fileList
 * @param string $filename 多个文件为 zip 单个为 txt
 * @return bool
 */
function downloadFiles($fileList, $filename = "file") {
  if (count($fileList) < 1) return false;

    ob_start();

    if (count($fileList) > 1) {
        ob_end_clean();
        $files  = implode($fileList,' ');
        $filePath= config("download_path") . 'excel/'.$filename.'.zip';
        $zip = "zip -jr $filePath $files";
        exec($zip);
        foreach ($fileList as $file) {
            unlink($file);
        }
        $basename = pathinfo($filePath);
        ob_clean();
        flush();
        $data = file_get_contents($filePath);
        header('Content-Length:' . filesize($filePath));  //指定文件大小的
        $name = base64_encode($basename['basename']);
        header('Content-Disposition:attachment;filename=' . $name);
        echo $data;
        unlink($filePath);exit();
    } else {
        $pos = strrpos($filename,'.');
        if (!$pos) {
            $fileInfo = pathinfo($fileList[0]);
            $ext = $fileInfo["extension"];
            $filename .= '.'.$ext;
        } else {
            $filename .= '.txt';
        }

        $data = file_get_contents($fileList[0]);
    }

    ob_end_clean();

    download($filename, $data);

    foreach ($fileList as $file) {
        unlink($file);
    }
}


/**
 * 返回指定单位的时间数据
 */
function time2Unit($time, $unit = 'seconds') {
  if ($unit == 'minutes') return floor($time / 60);
  if ($unit == 'hours') return floor($time / (60 * 60));
  if ($unit == 'days') return floor($time / (60 * 60 * 24));
  if ($unit == 'months') return floor($time / (60 * 60 * 24 * 31));
  if ($unit == 'years') return floor($time / (60 * 60 * 24 * 365));
  if ($unit == 'weeks') return floor($time / (60 * 60 * 24 * 7));
  return $time;
}

/**
 * 文件导出
 */
function exportFile($filename, $headerTitle, $formatData, $type) {
  try {
    array_unshift($formatData, $headerTitle);
    switch($type) {
      case 'xlsx': return exportFileXlsx($filename . '.xlsx', $formatData);
      case 'html': return exportFileHtml($filename . '.html', $formatData);
      case 'pdf': return exportFilePdf($filename . '.pdf', $formatData);
    }
  } catch(\Exception $e) {

    return 0;
  }
}
/**
 * 获取Excel格子编号
 * $isrow 是否获取行编号,否则获取列编号
 * A1 B1 C1 ... AA1 ...
 * A2 B2 C2 ... AA2 ...
 * ...
 */
function getExcelNextCellID($isrow = true, $curId = null, $newline = false) {
  $match = [];
  if (is_null($curId) || !\preg_match("/^([A-Z]+)(\d+)$/", $curId, $match)) return 'A1';
  $alphaIncr = false; // 字母+1
  $numIncr = false; // 数字+1
  if ($isrow) {
    $alphaIncr = true;
  } else {
    $numIncr = true;
  }
  if ($newline) {
    $alphaIncr = false;
    $numIncr = true;
    $match[1] = 'A';
  }
  if ($alphaIncr) {
    $len = strlen($match[1]);
    for($i = $len - 1; $i >= 0; $i--) {
      if ($match[1][$i] < 'Z') {
        $match[1][$i] = \chr(\ord($match[1][$i]) + 1);
        break;
      } else {
        $match[1][$i] = 'A';
        // 需进位
        if ($i == 0) {
          $match[1] = 'A' . $match[1];
        }
      }
    }
  }
  if ($numIncr) {
    $match[2]++;
  }
  return $match[1] . $match[2];
}
/**
 * 导出Excel,可导出多个sheet
 */
function makeExportFileXlsxSubContent ($filename, &$fileWriter, $formatData, &$nextRowIdx = 0) {
  if (!$fileWriter) {
    $fileWriter = new \PHPExcel();
    $fileWriter->getProperties()->setCreator("Venustech")
              ->setLastModifiedBy("Venustech")
              ->setTitle($filename);
  }
  $sheet = $fileWriter->setActiveSheetIndex(0);
  $rowIdx = $nextRowIdx ? $nextRowIdx : 0;
  foreach($formatData as $rowData) {
    foreach($rowData as $colInx => $value) {
      // $sheet->setCellValue($cellid, $value);
      $sheet->setCellValueByColumnAndRow($colInx, $rowIdx, $value);
    }
    $rowIdx++;
  }
  $nextRowIdx = $rowIdx;
}
function exportFileXlsx($filename, $formatData, $isPdf = false) {
  $objPHPExcel = new \PHPExcel();
  $objPHPExcel->getProperties()->setCreator("Venustech")
              ->setLastModifiedBy("Venustech")
              ->setTitle($filename);
              // ->setSubject("subject")
              // ->setDescription("Description")
              // ->setKeywords("Keywords")
              // ->setCategory("Category");
  if (\array_key_exists('WorkSheet', $formatData)) {
    // 需要制作多个sheet
    foreach ($formatData['WorkSheet'] as $index => $workSheet) {
      if ($index != 0) {
        $objPHPExcel->createSheet();
      }
      $sheet = $objPHPExcel->setActiveSheetIndex($index);

      $cellid = getExcelNextCellID();
      foreach($workSheet['data'] as $idx =>$rowData) {
        foreach($rowData as $value) {
          $sheet->setCellValue($cellid, $value);

          if (!$idx) {
            \preg_match("/([A-Z]+)/", $cellid, $match);
            $sheet->getColumnDimension($match[0])->setWidth(24);
          }
          $cellid = getExcelNextCellID(true, $cellid);
        }
        $cellid = getExcelNextCellID(false, $cellid, true);
      }
      if (\array_key_exists('name', $workSheet) && $workSheet['name']) {
        $objPHPExcel->getActiveSheet()->setTitle($workSheet['name']);
      } else {
        $objPHPExcel->getActiveSheet()->setTitle('WorkSheet' . $index);
      }
    }
    $objPHPExcel->setActiveSheetIndex(0); // 设置第一个sheet为工作sheet
  } else {
    $sheet = $objPHPExcel->setActiveSheetIndex(0);

    $cellid = getExcelNextCellID();
    foreach($formatData as $idx =>$rowData) {
      foreach($rowData as $value) {
        $sheet->setCellValue($cellid, $value);

        if (!$idx) {
          \preg_match("/([A-Z]+)/", $cellid, $match);
          $sheet->getColumnDimension($match[0])->setWidth(24);
        }
        $cellid = getExcelNextCellID(true, $cellid);
      }
      $cellid = getExcelNextCellID(false, $cellid, true);
    }
    // $objPHPExcel->getActiveSheet()->setTitle('Simple');
  }
  if ($isPdf) {
    header('Content-Type: application/pdf');
    $rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF;
    $rendererLibrary = 'tcpdf';
    $rendererLibraryPath = dirname(__FILE__).'/../vendor/tecnick.com/' . $rendererLibrary;
    if (!\PHPExcel_Settings::setPdfRenderer(
      $rendererName,
      $rendererLibraryPath
      )) {
      throw("NOTICE: Please set the valid values : $rendererName and $rendererLibraryPath");
    }
    // $objPHPExcel->getActiveSheet()->setShowGridLines(false);
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
    $objWriter->SetFont('stsongstdlight', '', 20);
    // $objWriter->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
    // $objWriter->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  } else {
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    // $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); // xls
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); // xlsx
  }
  header("Content-Disposition: attachment;filename=" . \base64_encode($filename));
  // header('Cache-Control: max-age=0');
  // If you're serving to IE 9, then the following may be needed
  // header('Cache-Control: max-age=1');
  $objWriter->save('php://output');
  exit;
}
/**
 * 根据数据
 * 组织成HTML
 */
function makeExportFileHtmlContent($formatData) {
  $rowStr = '';
  foreach($formatData as &$rowData) {
    if ($rowStr) $rowStr .= ", ";
    foreach ($rowData as &$d) $d = preg_replace('/\r\n|\n/', '<br />', (\addslashes($d)));
    $rowStr .= ("['" . \implode("', '", $rowData) . "']");
  }
  $templateStr = "<script>var data = [$rowStr]</script>\n";
  $templateData = \file_get_contents(ROOT_PATH . 'download/import_data_template.html');
  $totalData = $templateStr . $templateData;
  return $totalData;
}
/**
 * 分多次写入,导出文件
 * type: start  middle  end start_end
 */
function makeExportFileHtmlSubContent($formatData, $type = 'middle') {
  $header = '<tr>';
  $logTitle = '';
  $totalTitle = '';

  if (isset($formatData[0]) && !empty($formatData[0])) {
      foreach($formatData[0] as $key => $rowData) {
          if ($key == 0) {
              $logTitle = $rowData;
          } elseif ($key == 1) {
              $totalTitle = $rowData;
          } else {
              $header .= "<th>".$rowData."</th>";
          }
      }
      $header .= '</tr>';
  }

  array_shift($formatData);
  $body = '<tr>';
  foreach($formatData as $key => $rowData) {
    array_unshift($rowData,$key+1);
    foreach ($rowData as $value) {
        $body .= "<td><a>".$value."</a></td>";
    }
    $body .= '<tr>';
  }
  $count = $formatData ? count($formatData) : 0;

  return '<!DOCTYPE html>
            <html lang="en">
            <head>
              <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
              <title id="title">'.$logTitle.'</title>
            </head>
            <style type="text/css">
              *{margin: 0;padding: 0;}
              body {
                padding: 40px 100px;
              }
              .demo {
              width: 600px;
              margin: 40px auto;
              font-family: \'trebuchet MS\', \'Lucida sans\', Arial;
              font-size: 14px;
              color: #444;
              }
            
              table {
                *border-collapse: collapse; /* IE7 and lower */
                border-spacing: 0;
                width: 100%;
              }
            
              .bordered {
                border: solid #ccc 1px;
                -moz-border-radius: 6px;
                -webkit-border-radius: 6px;
                border-radius: 6px;
                -webkit-box-shadow: 0 1px 1px #ccc;
                -moz-box-shadow: 0 1px 1px #ccc;
                box-shadow: 0 1px 1px #ccc;
              }
            
              .bordered tr {
                -o-transition: all 0.1s ease-in-out;
                -webkit-transition: all 0.1s ease-in-out;
                -moz-transition: all 0.1s ease-in-out;
                -ms-transition: all 0.1s ease-in-out;
                transition: all 0.1s ease-in-out;
              }
              .bordered .highlight,
              .bordered tr:hover {
                background: #df6f6fef;
              }
              .bordered td,
              .bordered th {
                border-left: 1px solid #ccc;
                border-top: 1px solid #ccc;
                padding: 10px;
                text-align: left;
              }
              .bordered th {
                text-align: left;
                background-color: #dcedf9;
                background-image: -webkit-gradient(linear, left top, left bottom, from(#ebf3fc), to(#dce9f9));
                background-image: -webkit-linear-gradient(top, #ebf3fc, #dce9f9);
                background-image: -moz-linear-gradient(top, #ebf3fc, #dce9f9);
                background-image: -ms-linear-gradient(top, #ebf3fc, #dce9f9);
                background-image: -o-linear-gradient(top, #ebf3fc, #dce9f9);
                background-image: linear-gradient(top, #ebf3fc, #dce9f9);
                filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#ebf3fc, endColorstr=#dce9f9);
                -ms-filter: "progid:DXImageTransform.Microsoft.gradient (GradientType=0, startColorstr=#ebf3fc, endColorstr=#dce9f9)";
                -webkit-box-shadow: 0 1px 0 rgba(255,255,255,.8) inset;
                -moz-box-shadow:0 1px 0 rgba(255,255,255,.8) inset;
                box-shadow: 0 1px 0 rgba(255,255,255,.8) inset;
                border-top: none;
                text-shadow: 0 1px 0 rgba(255,255,255,.5);
              }
              .bordered td:first-child,
              .bordered th:first-child {
                border-left: none;
              }
              .bordered th:first-child {
                -moz-border-radius: 6px 0 0 0;
                -webkit-border-radius: 6px 0 0 0;
                border-radius: 6px 0 0 0;
              }
              .bordered th:last-child {
                -moz-border-radius: 0 6px 0 0;
                -webkit-border-radius: 0 6px 0 0;
                border-radius: 0 6px 0 0;
              }
              .bordered tr:last-child td:first-child {
                -moz-border-radius: 0 0 0 6px;
                -webkit-border-radius: 0 0 0 6px;
                border-radius: 0 0 0 6px;
              }
              .bordered tr:last-child td:last-child {
                -moz-border-radius: 0 0 6px 0;
                -webkit-border-radius: 0 0 6px 0;
                border-radius: 0 0 6px 0;
              }
              a {
                color: #000000;
                text-decoration: none;
              }
            </style>
            <body>
              <div><span id="totalTitle">'.$totalTitle.':</span><span id="totalnum">'.$count.'</span> </div>
              <table class="bordered">
                <thead>
                  <tr id="header">'.$header.'</tr>
                </thead>
                <tbody id="content">'.$body.'</tbody>
              </table>
            </body>
            </html>';
}
/**
 * 导出html
 */
function exportFileHtml($filename, $formatData) {
  $totalData = makeExportFileHtmlContent($formatData);
  header('Content-Type: text/webviewhtml');
  header("Content-Disposition: attachment;filename=" . \base64_encode($filename));
  echo $totalData;
}
/**
 * 导出pdf
 */
function exportFilePdf($filename, $formatData) {
  $totalData = '<table style="width:100%;"><thead><tr>'; // makeExportFileHtmlContent($formatData);
  $header = '';
  foreach($formatData[0] as $value) {
    $header .= ("<td>$value</td>");
  }
  $totalData .= $header . '</tr></thead><tbody>';
  $body = '';
  foreach($formatData as $idx => $rowData) {
    if (!$idx) continue;
    $body .= ("<tr>");
    foreach($rowData as $value) {
      $body .= ("<td>$value</td>");
    }
    $body .= ("</tr>");
  }
  $totalData .= $body . '</tbody></table>';


  $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  $pdf->SetCreator("Venustech");
  $pdf->SetAuthor("Venustech");
  $pdf->SetTitle($filename);
  // $pdf->SetSubject('TCPDF Tutorial');
  // $pdf->SetKeywords('TCPDF, PDF, example, test, guide');

  $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); // set auto page breaks
  // set text shadow effect
  $pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));
  $pdf->AddPage();
  $pdf->writeHTMLCell(0, 0, '', '', $totalData, 0, 1, 0, true, '', true); // 死循环了

  // header('Content-Type: application/pdf');
  // header("Content-Disposition: attachment;filename=" . \base64_encode($filename));

  $data = $pdf->Output(\base64_encode($filename), 'I');
  // echo $data;
  // exit;
}


function genMixCode($size = 6)
{
    $codeString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $maxNum = strlen($codeString) - 1;
    $newPass = '';
    for ($i = 0; $i < $size; $i++) {
        $idx = \rand(0, $maxNum);
        $newPass = $newPass . substr($codeString, $idx, 1);
    }
    return $newPass;
}

/**
 * 转义字符串
 * '  "  \   :  /
 */
function addslashesCustom($str) {
  $str = \addcslashes($str, '-\'\":/\ ()[]{}*^?!~');
  return $str;
}

function importExcel($file, $type) {
  try {
    // 判断文件是否存在
    if (!\file_exists($file)) {
      Log::debug('<<<<< import excel failed,not exist,filename=' . $file);
      return false;
    }
    // ini_set('max_execution_time', '0');
    // Vendor('PHPExcel.PHPExcel');
    $objReader = PHPExcel_IOFactory::createReader($type); // 判断使用哪种格式
    $objReader->setReadDataOnly(true); // 只读取数据,会智能忽略所有空白行
    $objPHPExcel = $objReader->load($file); // 加载Excel文件
    $sheetCount = $objPHPExcel->getSheetCount(); // 获取sheet工作表总个数
    $rowData = [];
    $RowNum = 0;
    /* 读取表格数据 */
    for ($i = 0; $i <= $sheetCount - 1; $i++) { // 循环sheet工作表的总个数
      $sheet = $objPHPExcel->getSheet($i);
      $highestRow = $sheet->getHighestRow();
      $RowNum += $highestRow - 1; // 计算所有sheet的总行数
      $highestColumn = $sheet->getHighestColumn();
      // 从第$i个sheet的第1行开始获取数据
      for ($row = 1; $row <= $highestRow; $row++) {
        // 把每个sheet作为一个新的数组元素 键名以sheet的索引命名 利于后期数组的提取
        $rowData[$i][] = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
      }
    }
    /*删除每行表头数据*/
    // foreach ($rowData as $k => $v) {
    //   array_shift($rowData[$k]);
    // }
  } catch (\Exception $e) {
    \think\Log::info('import excel error: ' . ($e->xdebug_message ? $e->xdebug_message : $e->message));
    return false;
  }

  return ['rowNum' => $RowNum, "excelData" => $rowData];
}

/**
 * 判断IP格式
 */
function validateIP($ip, $type) {
  if ($type === 1) return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); // 合法的IPv4
  else if ($type === 2) return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE); // 合法的公共IPv4 192.168.1.1这类的私有IP地址将会排除在外
  else if ($type === 3) return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); // 合法的IPv6
  else if ($type === 4) return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE); // 合法的IPv4/6
  else return filter_var($ip, FILTER_VALIDATE_IP); // 合法的IP
}

/**
 * 格式化通用时间格式
 */
function formatTime($time, $format = 'Y-m-d H:i:s') {
  $fmtTime = \date($format, strtotime($time));
  return $fmtTime ? $fmtTime : '';
}


/**
 * 将多维对象全部转换成数组
 */
function objectToArray($obj){
    $arr = [];
    $_arr = is_object($obj) ? get_object_vars($obj) :$obj;
    foreach ($_arr as $key=>$val) {
        $val = (is_array($val) || is_object($val)) ? objectToArray($val):$val;
        $arr[$key] = $val;
    }
    return $arr;
}


/**
 * std to array
 * @param $array
 * @return array
 */
function stdClassToArray($array)
{
    if(is_object($array)) {
        $array = (array)$array;
    } if(is_array($array)) {
    foreach($array as $key=>$value) {
        $array[$key] = stdClassToArray($value);
    }
}
    return $array;
}

/**
 * 记录日志  年月/日/日志等级/日_日志等级.log
 * @param $level string 日志等级
 * @param $msg  string 日志信息
 * @return bool
 */
function logMessage($level, $msg) {
    $level    = strtolower($level);
    $msg      = is_array($msg) || is_object($msg) ? json_encode($msg) : $msg;
    $webLog   = config('web_log');
    $logLevel = $webLog["level"];
    $logTime  = $webLog["time"];
    $logPath  = $webLog["path"];

    // 支持的错误类型
    if (!in_array($level, $logLevel)) {
        return false;
    }
    // 删除有效期外的日志
    $delDir = $logPath . date("Ym", strtotime("-$logTime day")) . DS . date("d", strtotime("-$logTime day")) . DS;
    if (is_dir($delDir)) {
        delDir($delDir);
    }
    // 文件夹目录
    $folder = $logPath . date('Ym', time()) . DS . date('d', time()) . DS . $level . DS;
    if (!file_exists($folder)) {
        Directory($folder);
    }

    $info = array(
        'REMOTE_ADDR'    => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '',
        'REQUEST_METHOD' => isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : '',
        'REQUEST_URI'    => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '',
    );

    $info    = implode(' --> ', $info);
    $file    = date('H') . '_hours_' . $level . '.log';
    $txt     = '---------------------------------------------------------------' . "\n";
    $content = $txt . '[ ' . date('Y-m-d H:i:s ') . '] ' . $info . "\n" . '[ ' . $level . ' ]:' . $msg . "\n";
    $path    = $folder . $file;
    if (!file_put_contents($path, $content, FILE_APPEND)) {
        logMessage('fatal', ' 写入日志失败:' . $content);
    }
}

/**
 * 递归创建文件
 * @param $dir
 * @return bool
 */
function Directory($dir){
    if(is_dir($dir) || @mkdir($dir,0777,true)){
        return true;
    }else{
        $dirArr = explode('/',$dir);
        array_pop($dirArr);
        $newDir = implode('/',$dirArr);
        Directory($newDir);
        if(@mkdir($dir , 0777,true)){
            return true;
        }
    }
}

/**
 * 获取当前浏览器型号
 * @return mixed|string
 */
function getBrowse() {
    $browse = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
    if(preg_match('/360SE/', $browse)){
        $browse = "360se";
    }
    elseif (preg_match('/Maxthon/', $browse)){
        $browse = "maxthon";
    }
    elseif (preg_match('/Tencent/', $browse)){
        $browse = "tencent";
    }
    elseif (preg_match('/Green/', $browse)){
        $browse = "green";
    }
    elseif (preg_match('/baidu/', $browse)){
        $browse = "baidu";
    }
    elseif (preg_match('/TheWorld/', $browse)){
        $browse = "tw";
    }
    elseif (preg_match('/MetaSr/', $browse)){
        $browse = "sogou";
    }
    elseif (preg_match('/Firefox/', $browse)){
        $browse = "firefox";
    }
    elseif (preg_match('/MSIE\s6\.0/', $browse)){
        $browse = "ie";
    }
    elseif (preg_match('/MSIE\s7\.0/', $browse)){
        $browse = "ie";
    }
    elseif (preg_match('/MSIE\s8\.0/', $browse)){
        $browse = "ie";
    }
    elseif (preg_match('/MSIE\s9\.0/', $browse)) {
        $browse = "ie";
    }
    elseif (preg_match('/Netscape/', $browse)){
        $browse = "netscape";
    }
    elseif (preg_match('/Opera/', $browse)){
        $browse = "opera";
    }
    elseif (preg_match('/Chrome/', $browse)){
        $browse = "chrome";
    }
    elseif (preg_match('/Gecko/', $browse)){
        $browse = "gecko";
    }
    elseif (preg_match('/Safari/', $browse)){
        $browse = "safari";
    }
    else{
        $browse = "unknow";
    }
    return $browse;
}

/**
 * 删除文件夹及文件夹下所有的文件
 * @param $dir
 * @return bool
 */
function delDir($dir) {
    //先删除目录下的文件:
    if(!is_dir($dir)) {
        if (unlink($dir)) {
            return true;
        } else {
            return false;
        }
    } else {
        $dh = opendir($dir);
        while ($file=readdir($dh)) {
            if($file != "." && $file != "..") {
                $fullpath=$dir . "/" . $file;
                chmod($fullpath,0755);
                if(!is_dir($fullpath)) {
                    unlink($fullpath);
                } else {
                    delDir($fullpath);
                }
            }
        }

        closedir($dh);
        //删除当前文件夹:
        if(rmdir($dir)) {
            return true;
        } else {
            return false;
        }
    }
}

/**
 * 判断目录是否为空目录
 * @param $dir_path
 * @return bool
 */
function isEmptyDir($dir_path)
{
    $isEmpty = true;
    if (!is_dir($dir_path)){
        $isEmpty = true;
    } else {
        $dir = opendir($dir_path);
        while ($file = readdir($dir)){
            if($file == "." || $file == "..") continue;
            $isEmpty = false;
            break;
        }
        closedir($dir);
    }

    return $isEmpty;
}

/**
 * 以GET请求模拟访问
 * @param string $url 访问URL
 * @param array $query GET数
 * @param array $options
 * @return bool|string
 * @throws /Exception
 */
function curlGet($url = "", $query = [], $options = []) {
    $options['query'] = $query;
    return doRequest('get', $url, $options);
}

/**
 * 以post访问模拟访问
 * @param string $url 访问URL
 * @param array $data POST数据
 * @param array $options
 * @return bool|string
 * @throws /Exception
 */
function curlPost($url = "", $data = [], $options = [])
{
    $options['data'] = $data;
    return doRequest('post', $url, $options);
}

/**
 * CURL模拟网络请求
 * @param string $method 请求方法
 * @param string $url 请求方法
 * @param array $options 请求参数[headers,data,ssl_cer,ssl_key]
 * @return bool|string
 * @throws /Exception
 */
function doRequest($method, $url, $options = [])
{
    $curl = curl_init();
    // GET参数设置
    if (!empty($options['query'])) {
        $url .= (stripos($url, '?') !== false ? '&' : '?') . http_build_query($options['query']);
    }
    // CURL头信息设置
    if (!empty($options['headers'])) {
        curl_setopt($curl, CURLOPT_HTTPHEADER, $options['headers']);
    }
    // POST数据设置
    if (strtolower($method) === 'post') {
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $options['data']);
    }
    // 证书文件设置
    if (!empty($options['ssl_cer'])) {
        if (file_exists($options['ssl_cer'])) {
            curl_setopt($curl, CURLOPT_SSLCERTTYPE, 'PEM');
            curl_setopt($curl, CURLOPT_SSLCERT, $options['ssl_cer']);
        } else {
            throw new \Exception("Certificate files that do not exist. --- [ssl_cer]");
        }
    }
    // 证书文件设置
    if (!empty($options['ssl_key'])) {
        if (file_exists($options['ssl_key'])) {
            curl_setopt($curl, CURLOPT_SSLKEYTYPE, 'PEM');
            curl_setopt($curl, CURLOPT_SSLKEY, $options['ssl_key']);
        } else {
            throw new \Exception("Certificate files that do not exist. --- [ssl_key]");
        }
    }
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_TIMEOUT, 60);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    list($content, $status) = [curl_exec($curl), curl_getinfo($curl), curl_close($curl)];

    return (intval($status["http_code"]) === 200) ? $content : false;
}

/**
 * 格式化输出
 * @param $data
 */
function dd($data) {
    echo "<pre>";
    var_dump($data);
    echo "</pre>";
    die;
}


/**
 * 格式化异步请求返回结果
 * @param array $data 返回的数据
 * @param string $msg 提示信息
 * @param int $status 状态码;0:failure,1:success
 */
function returnJson($data = [], string $msg = '', int $status = 1)
{
    echo json_encode([
        "data"   => $data,
        "msg"    => $msg,
        "result" => $status,
    ]);
    exit();
}

/**
 * 转化 URL 参数
 * @param array $data
 * @return string
 */
function setHttpQuery($data = [])
{
    $str = "";
    if ($data) {
        foreach ($data as $k => $v) {
            $str .= $k . '=' . $v . '&';
        }
    }
    return rtrim($str, '&');
}


/**
 * 格式化异步请求返回结果
 * @param array $data 返回的数据
 * @param string $msg 提示信息
 * @param int $code 状态码;0:success,1:failure
 * @param int $httpCode http 状态码
 * @param array $header header 头
 * @param array $options
 * @return \think\response\Json
 */
function show(array $data = [], string $msg = 'success', int $code = 0, int $httpCode = 200, array $header = [], array $options = [])
{
    $return = [
        "results"     => $data,
        "status_text" => $msg,
        "status_code" => $code,
    ];

    return json($return, $httpCode, $header, $options);
}

/**
 * 返回 api 格式
 * @param string $key
 * @param array $data
 */
function returnApiJson(array $data = [], string $key = "master")
{
    $arr = [
        "data"   => $data[0],
        "msg"    => $data[1],
        "result" => $data[2],
    ];
    switch ($key) {
        case "master" :
            $arr = [
                "data"   => $data[0],
                "msg"    => $data[1],
                "result" => $data[2],
            ];
            break;
        case "projectA" :
            $arr = [
                "results"     => $data[0],
                "status_text" => $data[1],
                "status_code" => $data[2],
            ];
            break;
        default:
            $arr;
            break;
    }

    echo json_encode($arr);
    exit();
}

/**
 * 通过 IP 掩码 获取ip
 * @param string $ipString IP 掩码:192.168.1.12/24
 * @return array
 */
function ipParse($ipString = "")
{
    $len = 32;
    if (strpos($ipString, "/") > 0) {
        list($ipString, $len) = explode("/", $ipString);
    }
    $ip      = ip2long($ipString);
    $mark    = 0xFFFFFFFF << (32 - $len) & 0xFFFFFFFF;
    $ipStart = $ip & $mark;
    $ipEnd   = $ip | (~$mark) & 0xFFFFFFFF;
    return [
        "ip"      => long2ip($ip),
        "mark"    => long2ip($mark),
        "ipStart" => long2ip($ipStart),
        "ipEnd"   => long2ip($ipEnd)
    ];
    // var_dump(ipParse("192.168.1.12/24"));
    // ["ip"]=>
    // string(12) "192.168.1.12"
    // ["mark"]=>
    // string(13) "255.255.255.0"
    // ["ipStart"]=>
    // string(11) "192.168.1.0"
    // ["ipEnd"]=>
    // string(13) "192.168.1.255"
}

/**
 * 检测当前Ip 是否 在Ip掩码内
 * @param string $ip 当前Ip 192.168.1.12
 * @param string $ipString Ip掩码 192.168.1.12/24
 * @return bool
 */
function ipIn($ip = "", $ipString = "")
{
    $len = 32;
    if (strpos($ipString, "/") > 0) {
        list($ipString, $len) = explode("/", $ipString);
    }
    $rightLen = 32 - $len;
    $bool = ip2long($ip) >> $rightLen == ip2long($ipString) >> $rightLen;
    if ($bool) {
        return true;
    } else {
        return false;
    }
   // var_dump(ipIn("192.168.1.12","192.168.1.12/24"));
   // bool(true)
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值