PHP长链接转短链接 ```php /** * step 1 * 建表 */ DROP TABLE IF EXISTS `cc_short_url`; CREATE TABLE `cc_short_url` ( `id` int(11) NOT NULL AUTO_INCREMENT, `short_url_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '短链接|input', `long_url` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '长链接|input', `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp(0) NULL DEFAULT NULL, `delete_time` timestamp(0) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '短链接' ROW_FORMAT = Dynamic; ``` ```php /** * step 2 * 建表后需要在全局路由添加监听方法 */ //添加miss方法 Route::miss('admin/Error/miss'); class Error extends Base { public function miss() { $path = request()->path(); $longurl = Db::name('short_url')->where('short_url_code', $path)->value('long_url'); if (isset($longurl) && !empty($longurl)) { header('Location: ' . $longurl); } else { return json(ajaxReturn(-1, "未知接口!"), 404); } } } ``` ```php /** * step 3 * 将长链接转化为短链接 */ /** * 生成唯一的6位短网址 */ protected function code62($x) { $show = ''; while ($x > 0) { $s = $x % 62; if ($s > 35) { $s = chr($s + 61); } elseif ($s > 9 && $s <= 35) { $s = chr($s + 55); } $show .= $s; $x = floor($x / 62); } return $show; } /** * 生成6位短网址 * 并存入数据库 * */ public function shorturl($url) { $urlInt = crc32($url); $result = sprintf("%u", $urlInt); $short_url = $this->code62($result); $result = Db::name('short_url')->insert([ 'short_url_code' => $short_url, 'long_url' => $url ]); if ($result) { return $short_url; } else { return false; } } ``` 使用方法 ```php $st = shorturl('request()->domain() . '/ccc/ScmQaMaterialException/index?id=aaa&name=bbb') ```