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

短網址服務原理與 PHP 實作:62 進制編碼讓長網址變短

     編輯:PHP 綜合知識

微博字數限制催生短網址服務。本文揭秘核心原理——資料庫自增 ID + 62 進制編碼,並提供完整 PHP 實作,讓你輕鬆打造專屬短網址系統。

核心原理

  1. 資料表僅需兩欄:seq (BIGINT AUTO_INCREMENT)、url (VARCHAR, UNIQUE INDEX)。
  2. 用戶提交長網址 → 查詢是否存在 → 存在則回傳現有 seq,否則寫入取得新 seq。
  3. 將 seq(10 進制)轉為 62 進制字串(0-9, a-z, A-Z),大幅縮短長度:
10,000,000,000 (11 位) → aUKYOA (6 位)  縮短 45%

PHP 62 進制雙向轉換函式

// 10 進制 → 任意進制 (預設 62)
function dec2any($num, $base = 62, $index = false) {
    if (!$base) $base = strlen($index);
    if (!$index) $index = substr('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 0, $base);
    $out = '';
    for ($t = floor(log($num, $base)); $t >= 0; $t--) {
        $a = floor($num / pow($base, $t));
        $out .= $index[$a];
        $num -= $a * pow($base, $t);
    }
    return $out;
}

// 任意進制 → 10 進制
function any2dec($num, $base = 62, $index = false) {
    if (!$base) $base = strlen($index);
    if (!$index) $index = substr('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 0, $base);
    $out = 0;
    $len = strlen($num) - 1;
    for ($t = 0; $t <= $len; $t++) {
        $out += strpos($index, $num[$t]) * pow($base, $len - $t);
    }
    return $out;
}

// 測試
echo dec2any(10000000000); // aUKYOA
echo any2dec('aUKYOA');    // 10000000000

完整流程範例(PDO + MySQL)

<?php
$pdo = new PDO("mysql:host=localhost;dbname=shorturl", "user", "pass");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$longUrl = $_POST['url'] ?? '';
if ($longUrl) {
    // 查詢或插入
    $stmt = $pdo->prepare("SELECT seq FROM urls WHERE url = ?");
    $stmt->execute([$longUrl]);
    $row = $stmt->fetch();
    if ($row) {
        $seq = $row['seq'];
    } else {
        $pdo->prepare("INSERT INTO urls (url) VALUES (?)")->execute([$longUrl]);
        $seq = $pdo->lastInsertId();
    }
    $shortCode = dec2any($seq);
    echo "短網址: https://your.domain/{$shortCode}";
}
?>

高效能架構建議

層級方案效能提升
儲存Redis / Tokyo Tyrant (TTServer) Key-Value單機百萬 QPS,無 SQL 解析開銷
重導向修改 TTServer 原始碼,HTTP 介面直接 302省去 PHP 啟動,單機日億級請求
高可用雙機主備 + VIP 漂移秒級故障切換

安全性補充

  • 驗證 URL 格式(filter_var($url, FILTER_VALIDATE_URL))。
  • 限制同 IP 建立頻率(Token Bucket 演算法)。
  • 定期掃描惡意/失效連結並下架。

掌握 62 進制編碼與 Key-Value 儲存,即可構建高效能、可擴展的短網址服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved