php mysql 短链接_PHP实现URL长连接转短连接方法总结

短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。

这样的话其好处为:1、内容需要;2、用户友好;3、便于管理。

实现短网址(short URL)系统比较流行的算法有两种自增序列算法、 摘要算法

自增序列算法:

自增序列算法 也叫永不重复算法

设置 id 自增,一个 10进制 id 对应一个 62进制的数值,1对1,也就不会出现重复的情况。这个利用的就是低进制转化为高进制时,字符数会减少的特性。

摘要算法:

1、将长网址 md5 生成 32 位签名串,分为 4 段, 每段 8 个字节

2、对这四段循环处理, 取 8 个字节, 将他看成 16 进制串与 0x3fffffff(30位1) 与操作, 即超过 30 位的忽略处理

3、这 30 位分成 6 段, 每 5 位的数字作为字母表的索引取得特定字符, 依次进行获得 6 位字符串

4、总的 md5 串可以获得 4 个 6 位串,取里面的任意一个就可作为这个长 url 的短 url 地址

这种算法,虽然会生成4个Code,但是仍然存在重复几率

依据第二种算法,URL长连接转短连接实现方法如下:

语言:PHP5.6

服务器环境:LNMP

假设:长连接地址:http://www.test.com/index.php

短连接地址:http://t.test.com/六位code码

第一步:利用shortUrl()函数,生成短连接Code码,并将数据存入Mysql数据库;

函数shorturl():

* 由长连接生成短链接操作

*

* 算法描述:使用6个字符来表示短链接,我们使用ASCII字符中的'a'-'z','0'-'9','A'-'Z',共计62个字符做为集合。

* 每个字符有62种状态,六个字符就可以表示62^6(56800235584),那么如何得到这六个字符,

* 具体描述如下:

* 1. 对传入的长URL+设置key值 进行Md5,得到一个32位的字符串(32 字符十六进制数),即16的32次方;

* 2. 将这32位分成四份,每一份8个字符,将其视作16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;

* 3. 这30位分成6段, 每5个一组,算出其整数值,然后映射到我们准备的62个字符中, 依次进行获得一个6位的短链接地址。

**/

function shortUrl( $long_url)

{$key = 'swz0823'; //自定义key值

$base32 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//利用md5算法方式生成hash值

$hex = hash('md5', $long_url.$key);$hexLen = strlen($hex);$subHexLen = $hexLen / 8;$output = array();for( $i = 0; $i < $subHexLen; $i++)

{//将这32位分成四份,每一份8个字符,将其视作16进制串与0x3fffffff(30位1)与操作

$subHex = substr($hex, $i*8, 8);$idx = 0x3FFFFFFF & (1 * ('0x' . $subHex));//这30位分成6段, 每5个一组,算出其整数值,然后映射到我们准备的62个字符

$out = '';for( $j = 0; $j < 6; $j++)

{$val = 0x0000003D & $idx;$out .= $base32[$val];$idx = $idx >> 5;

}$output[$i] = $out;

}return $output;

}$url = 'http://www.test.com/index.php';//长连接

$ret = shortUrl($url);var_dump($ret);################ 打印结果 ################/*array(4) {

[0]=>

string(6) "2aEzqe"

[1]=>

string(6) "Rj6Bve"

[2]=>

string(6) "f2mQvi"

[3]=>

string(6) "z2eqYv"

}*/

#将长连接url与短链接Code结果存入数据库,取其中一个用于显示即可。例:短连接地址:http://t.test.com/2aEzqe

数据库结构(可自定义):

CREATE TABLE `long_short_url` (

`id` int(32) unsigned NOT NULL AUTO_INCREMENT,`long_url` varchar(255) DEFAULT NULL,`short_url_code` varchar(255) DEFAULT NULL,`create_time` varchar(32) DEFAULT NULL,PRIMARYKEY(`id`)

) ENGINE=InnoDB AUTO_INCREMENT=387 DEFAULT CHARSET=utf8;

第二步:服务器301/302重定向Api接口如下,(假如此Api接口地址:http://www.test.com/api/longUrl?code=六位code码)

public functionlongUrl(){$map['short_url'] = $_GET['code'];$data =M('long_short_url')->where($map) ->find();$url = $data['long_url'];header("location:$url");

}

第四部:修改Nginx服务器nginx.conf配置文件

在底部(任意位置)增添以下代码:

server {

listen80;

server_name t.test.com;

rewrite^/(.*) http://www.test.com/Api/longUrl?code=$1 redirect;

access_log off;

}

然后保存,重启Nginx服务器。

当我们请求通过短连接地址:http://t.test.com/2aEzqe时,服务器会通过Code短码 2aEzqe 获取对应的长 URL,并通过HTTP 301/302重定向到对应的长连接地址;

另外:

1.自增序列算法实现方法参考实例:

2.PHP开源短连接生成系统:

YOURLS (Your Own URL Shortener) 是一款使用PHP+Mysql开发的短链接程序,让你可以轻松建立属于自己的短网址生成系统。而无需第三方平台你就可以获得所有的数据统计,并且支持一系列插件扩展。

安装流程:

将安装包解压并上传至服务器;

将 user/config-sample.php 重命名为 user/config.php;

编辑 user/config.php 文件,填入数据库信息和配置站点等选项;

访问 http://yoursite.com/admin/ 即可!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值