PHP實現URL長鏈接轉短鏈接方法總結

短連接,通俗來講,就是將長的URL 網址,經過程序計算等方式,轉換爲簡短的網址字符串。php

這樣的話其好處爲:一、內容須要;二、用戶友好;三、便於管理。nginx

實現短網址(short URL)系統比較流行的算法有兩種 自增序列算法、 摘要算法算法

自增序列算法:

自增序列算法 也叫永不重複算法sql

設置 id 自增,一個 10進制 id 對應一個 62進制的數值,1對1,也就不會出現重複的狀況。這個利用的就是低進制轉化爲高進制時,字符數會減小的特性。數據庫

摘要算法:

一、將長網址 md5 生成 32 位簽名串,分爲 4 段, 每段 8 個字節api

二、對這四段循環處理, 取 8 個字節, 將他當作 16 進制串與 0x3fffffff(30位1) 與操做, 即超過 30 位的忽略處理服務器

三、這 30 位分紅 6 段, 每 5 位的數字做爲字母表的索引取得特定字符, 依次進行得到 6 位字符串函數

四、總的 md5 串能夠得到 4 個 6 位串,取裏面的任意一個就可做爲這個長 url 的短 url 地址url

這種算法,雖然會生成4個Code,可是仍然存在重複概率spa

以上兩種算法具體實現原理參考:短網址(short URL)系統的原理及其實現

 

依據第二種算法,URL長鏈接轉短鏈接實現方法以下:

語言:PHP5.6

服務器環境:LNMP

假設:長鏈接地址:http://www.test.com/index.php

   短鏈接地址:http://t.test.com/六位code碼

第一步:利用shortUrl()函數,生成短鏈接Code碼,並將數據存入Mysql數據庫;

函數shorturl():

<?php  
/** 
 * 由長鏈接生成短連接操做 
 *  
 * 算法描述:使用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,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=387 DEFAULT CHARSET=utf8;

 

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

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

 

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

在底部(任意位置)增添如下代碼:

server {
listen 80;
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.自增序列算法實現方法參考實例:php實現短連接系統

2.PHP開源短鏈接生成系統:YOURLS 

YOURLS (Your Own URL Shortener) 是一款使用PHP+Mysql開發的短連接程序,讓你能夠輕鬆創建屬於本身的短網址生成系統。而無需第三方平臺你就能夠得到全部的數據統計,而且支持一系列插件擴展。

安裝流程:

  1. 將安裝包解壓並上傳至服務器;
  2. 將 user/config-sample.php 重命名爲 user/config.php
  3. 編輯 user/config.php 文件,填入數據庫信息和配置站點等選項;
  4. 訪問 http://yoursite.com/admin/ 便可!
相關文章
相關標籤/搜索