微博字數限制催生短網址服務。本文揭秘核心原理——資料庫自增 ID + 62 進制編碼,並提供完整 PHP 實作,讓你輕鬆打造專屬短網址系統。
seq (BIGINT AUTO_INCREMENT)、url (VARCHAR, UNIQUE INDEX)。seq,否則寫入取得新 seq。seq(10 進制)轉為 62 進制字串(0-9, a-z, A-Z),大幅縮短長度:10,000,000,000 (11 位) → aUKYOA (6 位) 縮短 45%
// 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
<?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 漂移 | 秒級故障切換 |
filter_var($url, FILTER_VALIDATE_URL))。掌握 62 進制編碼與 Key-Value 儲存,即可構建高效能、可擴展的短網址服務。