首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 短網址生成三大方案完整比較:MySQL、INI 配置、Base32 演算法與 Rewrite 規則

     編輯:PHP 綜合知識

短網址核心原理

建立「短代碼 ⟺ 原網址」映射關係,用戶訪問短網址 → 伺服器查找映射 → 301/302 重導向至原網址。

方案一:PHP + MySQL (標準企業級)

短代碼生成演算法 (Base62 編碼)

<?php
function code62($x) {
    $show = '';
    while ($x > 0) {
        $s = $x % 62;
        if ($s > 35) $s = chr($s + 61);      // a-z
        elseif ($s > 9) $s = chr($s + 55);   // A-Z
        else $s = chr($s + 48);              // 0-9
        $show .= $s;
        $x = floor($x / 62);
    }
    return strrev($show); // 低位在前需反轉
}

function shorturl($url) {
    $crc = crc32($url);                // 32 位雜湊
    $unsigned = sprintf("%u", $crc);   // 無號整數
    return code62($unsigned);          // 6 位短碼
}

echo shorturl('https://www.jb51.net/'); // 輸出類似: 1EeIv2
?>

資料表設計

CREATE TABLE `short_url` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `code` VARCHAR(10) NOT NULL UNIQUE,      -- 短代碼
    `url` TEXT NOT NULL,                     -- 原網址
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `hits` INT UNSIGNED DEFAULT 0,           -- 訪問計數
    INDEX `idx_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

重導向腳本 (link.php)

<?php
include_once('db.php');
$code = $_GET['url'] ?? '';
if ($code) {
    $stmt = $pdo->prepare("SELECT url FROM short_url WHERE code = ?");
    $stmt->execute([$code]);
    if ($row = $stmt->fetch()) {
        header('Location: ' . $row['url'], true, 301);
        $pdo->exec("UPDATE short_url SET hits = hits + 1 WHERE code = '$code'");
        exit;
    }
}
header('HTTP/1.0 404 Not Found');
echo 'Unknown link.';
?>

Apache/Nginx Rewrite 規則

# Apache .htaccess
RewriteEngine On
RewriteRule ^([a-zA-Z0-9]+)$ /link.php?url=$1 [L]

# Nginx
location / {
    rewrite ^/([a-zA-Z0-9]+)$ /link.php?url=$1 last;
}

方案二:PHP + INI 配置 (輕量級/靜態映射)

links.ini

baidu = https://www.baidu.com/
qq = https://www.qq.com/
hw = https://www.hw.com/
dm = https://www.dm.com/view-blog-362.html

index.php

<?php
$links = parse_ini_file('links.ini');
$key = $_GET['l'] ?? '';

if ($key && isset($links[$key])) {
    header('Location: ' . $links[$key], true, 301);
    exit;
}
header('HTTP/1.0 404 Not Found');
echo 'Unknown link.';
?>

Rewrite 規則

# Apache
RewriteRule ^([a-z]+)$ /index.php?l=$1 [L]

# Nginx
rewrite ^/([a-z]+)$ /index.php?l=$1 last;

方案三:Base32 演算法無資料庫 (短網址服務核心邏輯)

<?php
function shorturl($input) {
    $base32 = array_merge(range('a','z'), range('0','5')); // 32 字元
    $hex = md5($input);                    // 32 字元十六進位
    $output = [];
    
    for ($i = 0; $i < 4; $i++) {           // 產生 4 組 6 字元短碼
        $subHex = substr($hex, $i * 8, 8); // 取 8 字元 (32 bits)
        $int = 0x3FFFFFFF & hexdec($subHex); // 與 30 位 1 進行 AND
        
        $out = '';
        for ($j = 0; $j < 6; $j++) {
            $val = 0x1F & $int;            // 取低 5 位 (0-31)
            $out .= $base32[$val];
            $int >>= 5;
        }
        $output[] = $out;
    }
    return $output; // 陣列含 4 個備選短碼
}

print_r(shorturl('https://www.jb51.net/'));
/* 輸出範例:
Array (
    [0] => a3z8f2
    [1] => k9m1p4
    [2] => q7w5e8
    [3] => r6t2y9
)
*/
?>

三方案比較表

維度MySQLINI 配置Base32 演算法
儲存方式資料庫表檔案配置純演算法 (無儲存)
動態新增✅ 支援✅ 需重寫檔案❌ 不可控 (單向)
查詢效能索引 O(1)記憶體 O(1)運算 O(1)
適用場景大量動態短網址少量固定映射短網址服務核心生成
維護成本中 (備份/監控)低極低
衝突處理唯一索引重試手動避免多組備選碼

完整短網址服務架構建議

  1. 生成層:Base32 演算法產生多組候選碼 → 檢查資料庫唯一性 → 寫入 MySQL
  2. 存取層:Redis 快取熱門映射 (code → url) → 降低 DB 壓力
  3. 重導層:Nginx Lua / OpenResty 直接查 Redis → 极速 301 導向
  4. 統計層:非同步寫入點擊數、來源、地理位置 → 大數據分析
  5. 管理層:後台建立/停用/編輯短網址、設定有效期、密碼保護
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved