PHP短网址

参考工具

社交平台中添加链接后,后台会将域名转换为t.cn等形式。2011年3月,新浪微博收购t.cn短网址,取代之前的短链。例如t.cn是最短的域名,t是微博的代名词,twittert.co作为短网址,sina有t.cn,taobao有c.tb.cn

短网址实际指的是将原来较长的网址转化为较短的网址,从而便于用户记忆和传播。以新浪微博威力,用户输入需缩短的长网址,转化后得到以http://t.cn域名开头的短网址,其后用户将该网址通过微信或微博等方式分享给朋友。朋友点击后即可将进入原本长网址所对应的页面。

4933701-806b63157f44f94a.png
新浪微博短网址

实现短网址关键点

  • 如何将任意长的字符串转化为较短且唯一的字符串
  • 如何将短网址还原为真实网址

短链实现思路

  • 将网址存入数据库获得自增主键id,将其加密后字符串后输出。调用短链时,通过路由解密获取实际链接,最后重定向进行跳转。

  • 对每个网址生成对应的编码,例如php中可采用base_convert(number, frombase, tobase),此编码作为短网址域名后的参数,将网址和编码一并存入数据库。访问短链时,通过路由获取编码,根据编码查询数据库得到真实网址后,进行重定向跳转。

短链接具体步骤

  1. 将真实网址存入数据库,获得自增主键,由于自增主键是唯一且自增的。
DROP TABLE IF EXISTS `shorturl`;
CREATE TABLE IF NOT EXISTS `shorturl`{
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `url` varchar(255) NOT NULL DEFAULT '' COMMENT '真实网址',
  `code` varchar(32) NOT NULL DEFAULT '' COMMENT '短链编码',
  `created_at` timestamp NOT NULL DEFAULT 0 COMMENT '创建时间',
  `updated_at` timestamp NOT NULL DEFAULT 0 COMMENT '修改时间'
}ENGINE=InnoDB auto_increment=1 charset utf-8 COMMENT '短网址';
  1. 将自增主键通过进制编码形成字符串作为编码,此编码也是唯一的。
<?php
$id = 1;
$code = base_convert($id, 10, 36);//对十进制的id进行进制转换为36进制
?>

此处的思路有多种

  • 直接对自增主键进行编码解码,需要编码解码的函数或类库支持。
  • 采用进制转换时直接使用随机数替代自增主键
$code = base_convert(rand(100000,999999), 10, 36);
  • 采用自定义的编码方式而非进制转换的方式
function shorturl($url){
  return code(sprintf("%u", crc32($url)));//%u为long long int型
}
function code($int){
  $code = '';
  while($int>0){
    $n = $int%62;
    if($n > 35){
      $n = char($n + 61);
    }elseif($n>9 && $n<=35){
      $n = char($n + 55);
    }
    $code .= $n;
    $int= floor($int/ 62);
  }
  return $code ;
}
  1. 将编码和短域名合并形成短网址
http://t.cn/kj12m

以上思路,仅供参考。具体环境涉及数据规模、并发、重复情况、执行效率等因素,需根据实际测试情况,权衡利弊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值