1、封装生成短网址方法:
/*** 获取短网址* @param string $url 原网址* @param string $domain 短链接使用域名* @return string*/public function get_short_url($url,$domain='') {$charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";$key = "liweishan";$urlhash = md5($key . $url);$len = strlen($urlhash);#将加密后的串分成4段,每段4字节,对每段进行计算,一共可以生成四组短连接for ($i = 0; $i < 4; $i++) {$urlhash_piece = substr($urlhash, $i * $len / 4, $len / 4);#将分段的位与0x3fffffff做位与,0x3fffffff表示二进制数的30个1,即30位以后的加密串都归零$hex = hexdec($urlhash_piece) & 0x3fffffff; #此处需要用到hexdec()将16进制字符串转为10进制数值型,否则运算会不正常$short_url = '';#生成6位短连接for ($j = 0; $j < 6; $j++) {#将得到的值与0x0000003d,3d为61,即charset的坐标最大值$short_url .= $charset[$hex & 0x0000003d];#循环完以后将hex右移5位$hex = $hex >> 5;}$short_url_list[] = $short_url;}$short_url = $domain . "s/" . $short_url_list[0];//查询是否已存在$whe['short_code'] = $short_url_list[0];$shortInfo = Db::name('short_url')->where($whe)->value('sid');if(empty($shortInfo)){ //插入数据$whe['long_url'] = $url;$whe['short_url'] = $short_url;$ins = Db::name('short_url')->insert($whe);}return $short_url;}
2、建一张数据表:
CREATE TABLE `short_url` (`sid` int(11) unsigned NOT NULL AUTO_INCREMENT,`long_url` varchar(255) DEFAULT '' COMMENT '长链接',`short_url` varchar(255) DEFAULT '' COMMENT '短链接',`short_code` varchar(50) DEFAULT '' COMMENT '短链接编码',`CreateTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`sid`),UNIQUE KEY `short_code` (`short_code`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;
3、路由配置:
<?php
use think\Route;
Route::get('s/:id','/index/index/short/s/:id');
4、路由跳转方法:
//短网址路由跳转public function short(){$s = request()->route('s');if(empty($s)){return;}//查询长链接$whe['short_code'] = $s;$long_url = Db::name('short_url')->where($whe)->value('long_url');if($long_url){echo "<script>location.href='".$long_url."'</script>";die;}}