php实现短网址
实现短网址的原理
短网址服务的核心是将原始长URL通过算法或映射关系转换为短字符串。常见实现方式包括自增ID、哈希算法或预生成短码。PHP中可通过数据库存储原始URL与短码的映射关系,并通过重定向实现访问跳转。
数据库设计
创建数据表存储URL映射关系,基本字段如下:
CREATE TABLE short_urls (
id INT AUTO_INCREMENT PRIMARY KEY,
long_url TEXT NOT NULL,
short_code VARCHAR(10) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
生成短码方法
使用Base62编码将自增ID转换为短字符串:
function generateShortCode($id) {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$code = '';
while ($id > 0) {
$code = $chars[$id % 62] . $code;
$id = floor($id / 62);
}
return $code;
}
存储URL映射
处理URL提交并生成短码:
function createShortUrl($longUrl, $pdo) {
$stmt = $pdo->prepare("INSERT INTO short_urls (long_url) VALUES (?)");
$stmt->execute([$longUrl]);
$id = $pdo->lastInsertId();
$shortCode = generateShortCode($id);
$stmt = $pdo->prepare("UPDATE short_urls SET short_code = ? WHERE id = ?");
$stmt->execute([$shortCode, $id]);
return $shortCode;
}
重定向处理
通过短码查询原始URL并跳转:
function redirectShortUrl($shortCode, $pdo) {
$stmt = $pdo->prepare("SELECT long_url FROM short_urls WHERE short_code = ?");
$stmt->execute([$shortCode]);
$url = $stmt->fetchColumn();
if ($url) {
header("Location: " . $url);
exit;
} else {
header("HTTP/1.0 404 Not Found");
echo "URL not found";
}
}
调用示例
创建短链接:
$pdo = new PDO('mysql:host=localhost;dbname=shortener', 'username', 'password');
$shortCode = createShortUrl('https://example.com/very/long/url', $pdo);
echo "Short URL: https://yourdomain.com/" . $shortCode;
处理短链接访问:
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$shortCode = ltrim($path, '/');
redirectShortUrl($shortCode, $pdo);
优化建议
增加缓存机制提升查询性能,使用Memcached或Redis存储热门短码映射。添加有效期控制和访问统计功能,防止短码被暴力破解可考虑添加随机盐值。HTTPS支持确保传输安全,自定义短码功能需验证唯一性。







