common.php 9.1 KB

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