php实现短网址
PHP实现短网址的方法
短网址服务通过将长URL转换为短字符串,便于分享和传播。以下是几种常见的PHP实现方法:
使用哈希算法生成短码
通过MD5或CRC32等哈希算法将长URL转换为短字符串:
function generateShortUrl($url) {
$hash = md5($url);
return substr($hash, 0, 6); // 取前6位作为短码
}
自增ID转短码
利用数据库自增ID和进制转换生成短码:
function idToShortCode($id) {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$code = '';
while ($id > 0) {
$code = $chars[$id % 62] . $code;
$id = floor($id / 62);
}
return $code;
}
使用第三方API
调用现成的短网址API服务(如百度、新浪等):
function getShortUrl($url) {
$apiUrl = 'http://api.t.sina.com.cn/short_url/shorten.json?source=APPKEY&url_long='.urlencode($url);
$result = json_decode(file_get_contents($apiUrl), true);
return $result[0]['url_short'];
}
数据库存储映射关系
需要创建数据库表存储原始URL和短码的映射:
CREATE TABLE short_urls (
id INT AUTO_INCREMENT PRIMARY KEY,
long_url TEXT NOT NULL,
short_code VARCHAR(10) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
完整示例代码
// 生成短码并存储
function createShortUrl($longUrl) {
$shortCode = generateShortCode($longUrl);
// 存储到数据库
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("INSERT INTO short_urls (long_url, short_code) VALUES (?, ?)");
$stmt->execute([$longUrl, $shortCode]);
return 'http://yourdomain.com/'.$shortCode;
}
// 重定向处理
if(isset($_GET['code'])) {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("SELECT long_url FROM short_urls WHERE short_code = ?");
$stmt->execute([$_GET['code']]);
$url = $stmt->fetchColumn();
if($url) {
header("Location: $url");
exit;
} else {
header("HTTP/1.0 404 Not Found");
}
}
注意事项
- 考虑短码冲突问题,可以添加重试机制
- 实现301永久重定向有利于SEO
- 添加防滥用机制限制频繁请求
- 定期清理过期或不活跃的短链接
以上方法可根据实际需求选择或组合使用,自增ID方式简单高效,哈希算法方式无需数据库交互但可能存在冲突。







