生成短链接

扫描二维码 上传二维码
选择防红平台类型,避免链接被拦截
选择允许访问的平台类型

PHP 短链接 - 实现长连接的优雅缩短

在数字社交蓬勃发展的今天,长链接的频繁使用已成为信息流转中的常态。然而,当这些冗长、复杂的 URL 被嵌入微信、QQ 等移动端场景时,不仅影响阅读体验,更阻碍了高效传播。于是,短链接应运而生——它以精炼之姿承载原始地址,轻盈跳转之间,打通信息传递的最后一公里。

“快缩短网址”(suo.run)正是为此而生:一个简洁、可靠、高效的短链接服务平台。其核心理念,是将繁复化为简约,让每一次分享都优雅从容。

在技术实现上,PHP 凭借其成熟生态与开发便捷性,成为构建此类系统的理想选择。以下是我们基于 PHP 打造短链接服务的关键路径:

---

一、环境准备



- 语言与数据库:PHP + MySQL
- 扩展依赖
- mysqli:用于数据库连接与操作
- Redis / Memcached:实现高频访问缓存、分布式锁及过期策略
- Swoole(可选):支撑高并发请求,提升系统吞吐能力
- 开发工具:Sublime Text、MySQL Workbench 等

---

二、数据表设计



我们定义一张核心表 short_url,结构如下:

``sql
CREATE TABLE
short_url (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
short_code varchar(16) NOT NULL COMMENT '短码',
url varchar(256) NOT NULL COMMENT '原始长链接',
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (
id),
UNIQUE KEY
idx_short_code (short_code) USING BTREE COMMENT '确保短码唯一',
KEY
idx_create_time (create_time) USING BTREE COMMENT '便于按时间查询'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短链接映射表';


该设计兼顾性能与扩展性,为后续缓存与索引优化奠定基础。

---

三、核心逻辑实现



#### 1. 短码生成策略

采用稳定且低碰撞概率的哈希算法,例如:

php
function generateShortCode($url) {
return substr(md5($url), 0, 6); // 取 MD5 前6位作为短码
}


> 注:生产环境中可结合自增ID、Base62编码或雪花算法进一步降低冲突风险。

#### 2. 获取或创建短链接

php
function getShortUrl($url) {
global $mysql_config;
$mysqli = new mysqli(
$mysql_config['host'],
$mysql_config['username'],
$mysql_config['password'],
$mysql_config['dbname'],
$mysql_config['port']
);

$short_code = generateShortCode($url);

// 查询是否已存在
$stmt = $mysqli->prepare("SELECT url FROM short_url WHERE short_code = ?");
$stmt->bind_param("s", $short_code);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
return $row['url']; // 已存在,返回原链接(或根据需求返回短码)
}

// 不存在则插入
$stmt = $mysqli->prepare("INSERT IGNORE INTO short_url (short_code, url) VALUES (?, ?)");
$stmt->bind_param("ss", $short_code, $url);
if ($stmt->execute()) {
return $short_code; // 成功生成短码
}



return false;
}
`

> 使用预处理语句防止 SQL 注入,
INSERT IGNORE 避免并发写入冲突。

#### 3. 短码解析跳转

php
function getOriginUrl($short_code) {
global $mysql_config;
$mysqli = new mysqli(
$mysql_config['host'],
$mysql_config['username'],
$mysql_config['password'],
$mysql_config['dbname'],
$mysql_config['port']
);

$stmt = $mysqli->prepare("SELECT url FROM short_url WHERE short_code = ?");
$stmt->bind_param("s", $short_code);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
return $row['url'];
}



return false; // 未找到对应链接
}


配合 Web 入口(如
suo.run/abc123),即可实现自动 302 跳转至目标页面。

---

四、性能优化进阶



- 缓存层:将热点短码-长链接映射存入 Redis,大幅减少数据库查询。
- 分布式锁:在高并发生成场景下,通过 Redis 的
SETNX` 避免重复插入。
- 过期机制:为短链接设置 TTL(如 30 天无访问自动归档),节省存储资源。
- 异步处理:借助 Swoole 实现非阻塞 I/O,应对流量洪峰。

---

五、结语



“快缩短网址”(suo.run)不仅是一个技术方案,更是一种对效率与美感的追求。它让冗长退场,让简洁登场;让分享不再被格式束缚,让信息流动如风般自由。

我们相信,好的工具应当无声无息地融入日常,却在关键时刻熠熠生辉。欢迎访问 suo.run,体验真正“快”意链接的智慧之道。