common.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. <?php
  2. use think\facade\Request;
  3. use think\facade\Log;
  4. // 应用公共文件
  5. /**
  6. * 打印调试函数
  7. * @param $content
  8. * @param $is_die
  9. */
  10. function pre($content, $is_die = true)
  11. {
  12. header('Content-type: text/html; charset=utf-8');
  13. echo '<pre>' . print_r($content, true);
  14. $is_die && die();
  15. }
  16. /**
  17. * 隐藏敏感字符
  18. * @param $value
  19. * @return string
  20. */
  21. function substr_cut($value)
  22. {
  23. $strlen = mb_strlen($value, 'utf-8');
  24. if ($strlen <= 1) return $value;
  25. $firstStr = mb_substr($value, 0, 1, 'utf-8');
  26. $lastStr = mb_substr($value, -1, 1, 'utf-8');
  27. return $strlen == 2 ? $firstStr . str_repeat('*', $strlen - 1) : $firstStr . str_repeat("*", $strlen - 2) . $lastStr;
  28. }
  29. /**
  30. * 获取当前系统版本号
  31. * @return mixed|null
  32. * @throws Exception
  33. */
  34. function get_version()
  35. {
  36. try {
  37. $file = root_path() . '/version.json';
  38. $version = json_decode(file_get_contents($file), true);
  39. return $version['version'];
  40. } catch (\Exception $e) {
  41. return '';
  42. }
  43. }
  44. /**
  45. * 驼峰命名转下划线命名
  46. * @param $str
  47. * @return string
  48. */
  49. function toUnderScore($str)
  50. {
  51. $dstr = preg_replace_callback('/([A-Z]+)/', function ($matchs) {
  52. return '_' . strtolower($matchs[0]);
  53. }, $str);
  54. return trim(preg_replace('/_{2,}/', '_', $dstr), '_');
  55. }
  56. /**
  57. * 生成密码hash值
  58. * @param $password
  59. * @return string
  60. */
  61. function salt_hash($password)
  62. {
  63. return md5(md5($password) . 'jjjshop_salt_2020');
  64. }
  65. /**
  66. * curl请求指定url (post)
  67. * @param $url
  68. * @param array $data
  69. * @return mixed
  70. */
  71. function curlPost($url, $data = [])
  72. {
  73. $ch = curl_init();
  74. curl_setopt($ch, CURLOPT_POST, 1);
  75. curl_setopt($ch, CURLOPT_HEADER, 0);
  76. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  77. curl_setopt($ch, CURLOPT_URL, $url);
  78. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  79. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  80. $result = curl_exec($ch);
  81. curl_close($ch);
  82. return $result;
  83. }
  84. /**
  85. * 多维数组合并
  86. * @param $array1
  87. * @param $array2
  88. * @return array
  89. */
  90. function array_merge_multiple($array1, $array2)
  91. {
  92. $merge = $array1 + $array2;
  93. $data = [];
  94. foreach ($merge as $key => $val) {
  95. if (
  96. isset($array1[$key])
  97. && is_array($array1[$key])
  98. && isset($array2[$key])
  99. && is_array($array2[$key])
  100. ) {
  101. $data[$key] = array_merge_multiple($array1[$key], $array2[$key]);
  102. } else {
  103. $data[$key] = isset($array2[$key]) ? $array2[$key] : $array1[$key];
  104. }
  105. }
  106. return $data;
  107. }
  108. /**
  109. * 二维数组排序
  110. * @param $arr
  111. * @param $keys
  112. * @param bool $desc
  113. * @return mixed
  114. */
  115. function array_sort($arr, $keys, $desc = false)
  116. {
  117. $key_value = $new_array = array();
  118. foreach ($arr as $k => $v) {
  119. $key_value[$k] = $v[$keys];
  120. }
  121. if ($desc) {
  122. arsort($key_value);
  123. } else {
  124. asort($key_value);
  125. }
  126. reset($key_value);
  127. foreach ($key_value as $k => $v) {
  128. $new_array[$k] = $arr[$k];
  129. }
  130. return $new_array;
  131. }
  132. /**
  133. * 数据导出到excel(csv文件)
  134. * @param $fileName
  135. * @param array $tileArray
  136. * @param array $dataArray
  137. */
  138. function export_excel($fileName, $tileArray = [], $dataArray = [])
  139. {
  140. ini_set('memory_limit', '512M');
  141. ini_set('max_execution_time', 0);
  142. ob_end_clean();
  143. ob_start();
  144. header("Content-Type: text/csv");
  145. header("Content-Disposition:filename=" . $fileName);
  146. $fp = fopen('php://output', 'w');
  147. fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));// 转码 防止乱码(比如微信昵称)
  148. fputcsv($fp, $tileArray);
  149. $index = 0;
  150. foreach ($dataArray as $item) {
  151. if ($index == 1000) {
  152. $index = 0;
  153. ob_flush();
  154. flush();
  155. }
  156. $index++;
  157. fputcsv($fp, $item);
  158. }
  159. ob_flush();
  160. flush();
  161. ob_end_clean();
  162. }
  163. /**
  164. * 写入日志
  165. * @param $value
  166. * @param string $type
  167. */
  168. function log_write($value, $channel = '')
  169. {
  170. $msg = is_string($value) ? $value : var_export($value, true);
  171. if($channel != ''){
  172. Log::channel('task')->write($msg);
  173. }else{
  174. Log::channel($channel)->write($msg);
  175. }
  176. }
  177. /**
  178. * 获取当前域名及根路径
  179. * @return string
  180. */
  181. function base_url()
  182. {
  183. static $baseUrl = '';
  184. if (empty($baseUrl)) {
  185. $request = Request::instance();
  186. //$subDir = str_replace('\\', '/', dirname($request->server('PHP_SELF')));
  187. $baseUrl = $request->scheme() . '://' . $request->host() . '/';
  188. }
  189. return $baseUrl;
  190. }
  191. /**
  192. * 左侧填充0
  193. * @param $value
  194. * @param int $padLength
  195. * @return string
  196. */
  197. function pad_left($value, $padLength = 2)
  198. {
  199. return \str_pad($value, $padLength, "0", STR_PAD_LEFT);
  200. }
  201. /**
  202. * 过滤emoji表情
  203. * @param $text
  204. * @return null|string|string[]
  205. */
  206. function filter_emoji($text)
  207. {
  208. // 此处的preg_replace用于过滤emoji表情
  209. // 如需支持emoji表情, 需将mysql的编码改为utf8mb4
  210. return preg_replace('/[\xf0-\xf7].{3}/', '', $text);
  211. }
  212. /**
  213. * 获取全局唯一标识符
  214. * @param bool $trim
  215. * @return string
  216. */
  217. function getGuidV4($trim = true)
  218. {
  219. // Windows
  220. if (function_exists('com_create_guid') === true) {
  221. $charid = com_create_guid();
  222. return $trim == true ? trim($charid, '{}') : $charid;
  223. }
  224. // OSX/Linux
  225. if (function_exists('openssl_random_pseudo_bytes') === true) {
  226. $data = openssl_random_pseudo_bytes(16);
  227. $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
  228. $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
  229. return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
  230. }
  231. // Fallback (PHP 4.2+)
  232. mt_srand((double)microtime() * 10000);
  233. $charid = strtolower(md5(uniqid(rand(), true)));
  234. $hyphen = chr(45); // "-"
  235. $lbrace = $trim ? "" : chr(123); // "{"
  236. $rbrace = $trim ? "" : chr(125); // "}"
  237. $guidv4 = $lbrace .
  238. substr($charid, 0, 8) . $hyphen .
  239. substr($charid, 8, 4) . $hyphen .
  240. substr($charid, 12, 4) . $hyphen .
  241. substr($charid, 16, 4) . $hyphen .
  242. substr($charid, 20, 12) .
  243. $rbrace;
  244. return $guidv4;
  245. }
  246. function format_time($value)
  247. {
  248. return date('Y-m-d', $value);
  249. }
  250. /**
  251. * curl请求指定url (get)
  252. * @param $url
  253. * @param array $data
  254. * @return mixed
  255. */
  256. function curl($url, $data = [])
  257. {
  258. // 处理get数据
  259. if (!empty($data)) {
  260. $url = $url . '?' . http_build_query($data);
  261. }
  262. $curl = curl_init();
  263. curl_setopt($curl, CURLOPT_URL, $url);
  264. curl_setopt($curl, CURLOPT_HEADER, false);
  265. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  266. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。
  267. $result = curl_exec($curl);
  268. curl_close($curl);
  269. return $result;
  270. }
  271. /**
  272. * json 转换true,false
  273. */
  274. function jsonRecursive(&$array)
  275. {
  276. foreach ($array as $key => $value) {
  277. if (is_array($value)) {
  278. jsonRecursive($array[$key]);
  279. } else {
  280. if($value === 'true'){
  281. $array[$key] = true;
  282. } else if($value === 'false'){
  283. $array[$key] = false;
  284. }
  285. }
  286. }
  287. }
  288. /**
  289. * 判断浏览器名称和版本
  290. */
  291. function get_client_browser()
  292. {
  293. if(empty($_SERVER['HTTP_USER_AGENT'])){
  294. return 'robot!';
  295. }
  296. if( (false == strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident')!==FALSE) ){
  297. return 'Internet Explorer 11.0';
  298. }
  299. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 10.0')){
  300. return 'Internet Explorer 10.0';
  301. }
  302. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 9.0')){
  303. return 'Internet Explorer 9.0';
  304. }
  305. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 8.0')){
  306. return 'Internet Explorer 8.0';
  307. }
  308. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 7.0')){
  309. return 'Internet Explorer 7.0';
  310. }
  311. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 6.0')){
  312. return 'Internet Explorer 6.0';
  313. }
  314. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Edge')){
  315. return 'Edge';
  316. }
  317. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Firefox')){
  318. return 'Firefox';
  319. }
  320. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Chrome')){
  321. return 'Chrome';
  322. }
  323. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Safari')){
  324. return 'Safari';
  325. }
  326. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Opera')){
  327. return 'Opera';
  328. }
  329. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'360SE')){
  330. return '360SE';
  331. }
  332. //微信浏览器
  333. if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessage')){
  334. return 'MicroMessage';
  335. }
  336. return '';
  337. }
  338. /**
  339. * 金钱格式化小数点
  340. * @param $money
  341. * @param int $decimal 小数点位数,默认系统配置2位
  342. * @return float
  343. */
  344. function moneyFormat($money, $decimal=null){
  345. $formatConfig = [];
  346. $charset = !empty($formatConfig['charset'])? trim($formatConfig['charset']) : 'utf-8';
  347. if($decimal === null){
  348. $decimal = isset($formatConfig['moneyDecimal'])? intval($formatConfig['moneyDecimal']): 2;
  349. }
  350. $money = round($money, $decimal+1);
  351. $data = explode('.', $money);
  352. $money = isset($data[0])? $data[0] : 0;
  353. $float = isset($data[1])? $data[1] : '';
  354. $len = $float? mb_strlen($float, $charset) : 0;
  355. $decimal = $decimal>=0? intval($decimal) : 2;
  356. $num1 = isset($data[1])? $data[1] : '';
  357. $float = $len>=$decimal? mb_substr($num1, 0, $decimal, $charset) : $float.str_repeat('0', $decimal-$len);
  358. $money = $money.'.'.$float;
  359. return number_format($money, $decimal, '.', '');
  360. }