common.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. <?php
  2. // 应用公共函数库文件
  3. use think\Request;
  4. use think\Log;
  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 $str
  19. * @return string
  20. */
  21. function toUnderScore($str)
  22. {
  23. $dstr = preg_replace_callback('/([A-Z]+)/', function ($matchs) {
  24. return '_' . strtolower($matchs[0]);
  25. }, $str);
  26. return trim(preg_replace('/_{2,}/', '_', $dstr), '_');
  27. }
  28. /**
  29. * 生成密码hash值
  30. * @param $password
  31. * @return string
  32. */
  33. function yoshop_hash($password)
  34. {
  35. return md5(md5($password) . 'yoshop_salt_SmTRx');
  36. }
  37. /**
  38. * 获取当前域名及根路径
  39. * @return string
  40. */
  41. function base_url()
  42. {
  43. static $baseUrl = '';
  44. if (empty($baseUrl)) {
  45. $request = Request::instance();
  46. $subDir = str_replace('\\', '/', dirname($request->server('PHP_SELF')));
  47. $baseUrl = $request->scheme() . '://' . $request->host() . $subDir . ($subDir === '/' ? '' : '/');
  48. // $baseUrl = 'https://' . $request->host() . $subDir . ($subDir === '/' ? '' : '/');
  49. }
  50. return $baseUrl;
  51. }
  52. /**
  53. * 写入日志 (废弃)
  54. * @param string|array $values
  55. * @param string $dir
  56. * @return bool|int
  57. */
  58. //function write_log($values, $dir)
  59. //{
  60. // if (is_array($values))
  61. // $values = print_r($values, true);
  62. // // 日志内容
  63. // $content = '[' . date('Y-m-d H:i:s') . ']' . PHP_EOL . $values . PHP_EOL . PHP_EOL;
  64. // try {
  65. // // 文件路径
  66. // $filePath = $dir . '/logs/';
  67. // // 路径不存在则创建
  68. // !is_dir($filePath) && mkdir($filePath, 0755, true);
  69. // // 写入文件
  70. // return file_put_contents($filePath . date('Ymd') . '.log', $content, FILE_APPEND);
  71. // } catch (\Exception $e) {
  72. // return false;
  73. // }
  74. //}
  75. /**
  76. * 写入日志 (使用tp自带驱动记录到runtime目录中)
  77. * @param $value
  78. * @param string $type
  79. */
  80. function log_write($value, $type = 'yoshop-info')
  81. {
  82. $msg = is_string($value) ? $value : var_export($value, true);
  83. Log::record($msg, $type);
  84. }
  85. /**
  86. * curl请求指定url (get)
  87. * @param $url
  88. * @param array $data
  89. * @return mixed
  90. */
  91. function curl($url, $data = [])
  92. {
  93. // 处理get数据
  94. if (!empty($data)) {
  95. $url = $url . '?' . http_build_query($data);
  96. }
  97. $curl = curl_init();
  98. curl_setopt($curl, CURLOPT_URL, $url);
  99. curl_setopt($curl, CURLOPT_HEADER, false);
  100. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  101. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。
  102. $result = curl_exec($curl);
  103. curl_close($curl);
  104. return $result;
  105. }
  106. /**
  107. * curl请求指定url (post)
  108. * @param $url
  109. * @param array $data
  110. * @return mixed
  111. */
  112. function curlPost($url, $data = [])
  113. {
  114. $ch = curl_init();
  115. curl_setopt($ch, CURLOPT_POST, 1);
  116. curl_setopt($ch, CURLOPT_HEADER, 0);
  117. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  118. curl_setopt($ch, CURLOPT_URL, $url);
  119. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  120. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  121. $result = curl_exec($ch);
  122. curl_close($ch);
  123. return $result;
  124. }
  125. if (!function_exists('array_column')) {
  126. /**
  127. * array_column 兼容低版本php
  128. * (PHP < 5.5.0)
  129. * @param $array
  130. * @param $columnKey
  131. * @param null $indexKey
  132. * @return array
  133. */
  134. function array_column($array, $columnKey, $indexKey = null)
  135. {
  136. $result = array();
  137. foreach ($array as $subArray) {
  138. if (is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
  139. $result[] = is_object($subArray) ? $subArray->$columnKey : $subArray[$columnKey];
  140. } elseif (array_key_exists($indexKey, $subArray)) {
  141. if (is_null($columnKey)) {
  142. $index = is_object($subArray) ? $subArray->$indexKey : $subArray[$indexKey];
  143. $result[$index] = $subArray;
  144. } elseif (array_key_exists($columnKey, $subArray)) {
  145. $index = is_object($subArray) ? $subArray->$indexKey : $subArray[$indexKey];
  146. $result[$index] = is_object($subArray) ? $subArray->$columnKey : $subArray[$columnKey];
  147. }
  148. }
  149. }
  150. return $result;
  151. }
  152. }
  153. /**
  154. * 多维数组合并
  155. * @param $array1
  156. * @param $array2
  157. * @return array
  158. */
  159. function array_merge_multiple($array1, $array2)
  160. {
  161. $merge = $array1 + $array2;
  162. $data = [];
  163. foreach ($merge as $key => $val) {
  164. if (
  165. isset($array1[$key])
  166. && is_array($array1[$key])
  167. && isset($array2[$key])
  168. && is_array($array2[$key])
  169. ) {
  170. $data[$key] = array_merge_multiple($array1[$key], $array2[$key]);
  171. } else {
  172. $data[$key] = isset($array2[$key]) ? $array2[$key] : $array1[$key];
  173. }
  174. }
  175. return $data;
  176. }
  177. /**
  178. * 二维数组排序
  179. * @param $arr
  180. * @param $keys
  181. * @param bool $desc
  182. * @return mixed
  183. */
  184. function array_sort($arr, $keys, $desc = false)
  185. {
  186. $key_value = $new_array = array();
  187. foreach ($arr as $k => $v) {
  188. $key_value[$k] = $v[$keys];
  189. }
  190. if ($desc) {
  191. arsort($key_value);
  192. } else {
  193. asort($key_value);
  194. }
  195. reset($key_value);
  196. foreach ($key_value as $k => $v) {
  197. $new_array[$k] = $arr[$k];
  198. }
  199. return $new_array;
  200. }
  201. /**
  202. * 数据导出到excel(csv文件)
  203. * @param $fileName
  204. * @param array $tileArray
  205. * @param array $dataArray
  206. */
  207. function export_excel($fileName, $tileArray = [], $dataArray = [])
  208. {
  209. ini_set('memory_limit', '512M');
  210. ini_set('max_execution_time', 0);
  211. // ob_end_clean();
  212. ob_start();
  213. header("Content-Type: text/csv");
  214. header("Content-Disposition:attachment;filename=" . $fileName);
  215. $fp = fopen('php://output', 'w');
  216. fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));// 转码 防止乱码(比如微信昵称)
  217. fputcsv($fp, $tileArray);
  218. $index = 0;
  219. foreach ($dataArray as $item) {
  220. if ($index == 1000) {
  221. $index = 0;
  222. ob_flush();
  223. flush();
  224. }
  225. $index++;
  226. fputcsv($fp, $item);
  227. }
  228. ob_flush();
  229. flush();
  230. ob_end_clean();
  231. }
  232. /**
  233. * 隐藏敏感字符
  234. * @param $value
  235. * @return string
  236. */
  237. function substr_cut($value)
  238. {
  239. $strlen = mb_strlen($value, 'utf-8');
  240. if ($strlen <= 1) return $value;
  241. $firstStr = mb_substr($value, 0, 1, 'utf-8');
  242. $lastStr = mb_substr($value, -1, 1, 'utf-8');
  243. return $strlen == 2 ? $firstStr . str_repeat('*', $strlen - 1) : $firstStr . str_repeat("*", $strlen - 2) . $lastStr;
  244. }
  245. /**
  246. * 获取当前系统版本号
  247. * @return mixed|null
  248. * @throws Exception
  249. */
  250. function get_version()
  251. {
  252. static $version = null;
  253. if ($version) {
  254. return $version['version'];
  255. }
  256. $file = dirname(ROOT_PATH) . '/version.json';
  257. if (!file_exists($file)) {
  258. throw new Exception('version.json not found');
  259. }
  260. $version = json_decode(file_get_contents($file), true);
  261. if (!is_array($version)) {
  262. throw new Exception('version cannot be decoded');
  263. }
  264. return $version['version'];
  265. }
  266. /**
  267. * 获取全局唯一标识符
  268. * @param bool $trim
  269. * @return string
  270. */
  271. function getGuidV4($trim = true)
  272. {
  273. // Windows
  274. if (function_exists('com_create_guid') === true) {
  275. $charid = com_create_guid();
  276. return $trim == true ? trim($charid, '{}') : $charid;
  277. }
  278. // OSX/Linux
  279. if (function_exists('openssl_random_pseudo_bytes') === true) {
  280. $data = openssl_random_pseudo_bytes(16);
  281. $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
  282. $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
  283. return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
  284. }
  285. // Fallback (PHP 4.2+)
  286. mt_srand((double)microtime() * 10000);
  287. $charid = strtolower(md5(uniqid(rand(), true)));
  288. $hyphen = chr(45); // "-"
  289. $lbrace = $trim ? "" : chr(123); // "{"
  290. $rbrace = $trim ? "" : chr(125); // "}"
  291. $guidv4 = $lbrace .
  292. substr($charid, 0, 8) . $hyphen .
  293. substr($charid, 8, 4) . $hyphen .
  294. substr($charid, 12, 4) . $hyphen .
  295. substr($charid, 16, 4) . $hyphen .
  296. substr($charid, 20, 12) .
  297. $rbrace;
  298. return $guidv4;
  299. }
  300. /**
  301. * 时间戳转换日期
  302. * @param $timeStamp
  303. * @return false|string
  304. */
  305. function format_time($timeStamp)
  306. {
  307. return date('Y-m-d H:i:s', $timeStamp);
  308. }
  309. /**
  310. * 左侧填充0
  311. * @param $value
  312. * @param int $padLength
  313. * @return string
  314. */
  315. function pad_left($value, $padLength = 2)
  316. {
  317. return \str_pad($value, $padLength, "0", STR_PAD_LEFT);
  318. }
  319. /**
  320. * 过滤emoji表情
  321. * @param $text
  322. * @return null|string|string[]
  323. */
  324. function filter_emoji($text)
  325. {
  326. // 此处的preg_replace用于过滤emoji表情
  327. // 如需支持emoji表情, 需将mysql的编码改为utf8mb4
  328. return preg_replace('/[\xf0-\xf7].{3}/', '', $text);
  329. }
  330. /**
  331. * 根据指定长度截取字符串
  332. * @param $str
  333. * @param int $length
  334. * @return bool|string
  335. */
  336. function str_substr($str, $length = 30)
  337. {
  338. if (strlen($str) > $length) {
  339. $str = mb_substr($str, 0, $length, 'utf-8');
  340. }
  341. return $str;
  342. }