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

PHP 实现短链接的优雅方案

在信息流转如光的时代,链接已成为数字世界中的语言桥梁。从微博到社交圈,从即时通讯到内容分享,我们每日穿梭于无数网页之间,而冗长复杂的URL却常如荆棘横亘于传播之路。尤其在微信、QQ等移动端场景中,一串串字符不仅刺眼难记,更削弱了分享的流畅之美。



于是,“短链接”应运而生——它如同一位优雅的翻译官,将繁复的原始地址凝练为简洁明眸的一串字符,轻轻一点,便可抵达千里之外的页面彼岸。在这场化繁为简的旅程中,我们倾心打造了名为 “快缩短网址”suo.run)的匠心之作,以技术之精微,成就体验之从容。

一、初心所向:为何再造短链?



市面上虽已有诸多短链服务,但我们始终相信,真正的便捷不止于“变短”,更在于迅捷、稳定与可信赖。因此,我们选择回归本质,用最扎实的技术架构,构建一个轻盈却不失深度的系统。而PHP,这一历久弥新的语言,以其成熟的生态与广泛的兼容性,成为我们启程的理想舟楫。

---

二、架构之美:从环境到核心



为实现高并发下的丝滑响应,我们搭建了高效协同的技术栈:

- 后端语言:PHP 7+
- 数据存储:MySQL(持久化主库)
- 缓存加速:Redis 与 Memcached 双引擎驱动
- 异步处理:Swoole 引擎赋能非阻塞I/O
- 开发工具:Sublime Text 编码诗意,MySQL Workbench 精雕结构



这套组合既兼顾开发效率,又为未来扩展预留无限可能。

---



三、数据之基:简约而不简单



一切流转始于一张精心设计的数据表。以下是支撑“快缩短网址”的核心结构:

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,
KEY idx_create_time (create_time) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短链接映射表';


每一个字段皆有其使命:short_code 是通往远方的密钥,唯一索引保障无冲突;create_time 记录每一次生成的瞬间轨迹,为后续分析埋下伏笔。

---

四、灵魂所在:代码的艺术表达



以下是“快缩短网址”背后的核心逻辑,凝练、清晰且具备延展性:

// MySQL 配置
$mysql_config = [
'host' => 'localhost',
'port' => '3306',
'username' => 'root',
'password' => '123456',
'dbname' => 'test',
'charset' => 'utf8mb4',
];

// Redis & Memcache 缓存配置(用于热点加速)
$redis_config = [
'host' => 'localhost',
'port' => 6379,
'db_index' => 0,
];

$memcache_config = [
'host' => 'localhost',
'port' => 11211,
];

/<em></em>
* 生成短码:基于MD5摘要算法提取前六位
* 实际生产环境中可升级为Base62或雪花算法增强可读性与容量
*/
function generateShortCode($url) {
return substr(md5($url), 0, 6);
}

/<em></em>
* 获取短链接:若已存在则复用,否则入库并返回新码
*/
function getShortUrl($url) {
global $mysql_config;

$mysqli = new mysqli(
$mysql_config['host'],
$mysql_config['username'],
$mysql_config['password'],
$mysql_config['dbname'],
$mysql_config['port']
);

if ($mysqli->connect_error) {
return false;
}

$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'] === $url ? "https://suo.run/{$short_code}" : false;
}

// 插入新记录
$insert = $mysqli->prepare("INSERT INTO short_url (short_code, url) VALUES (?, ?)");
$insert->bind_param("ss", $short_code, $url);

if ($insert->execute()) {
return "https://suo.run/{$short_code}";
}

return false;
}

/<em></em>
* 解析短码:通过 short_code 查找原始链接
*/
function getOriginUrl($short_code) {
global $mysql_config, $redis_config;

// 优先查询Redis缓存
$redis = new Redis();
$redis->connect($redis_config['host'], $redis_config['port']);
if ($cached = $redis->get("shorturl:{$short_code}")) {
return $cached;
}

<img src="https://suo.run/uploads/20251015/55.png" alt="" class="img-fluid" />

// 缓存未命中,查数据库
$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();
$origin_url = $row['url'];

// 写入Redis,设置过期时间为24小时
$redis->setex("shorturl:{$short_code}", 86400, $origin_url);

return $origin_url;
}

return null;
}


> 注:以上代码仅为示意原型,在 suo.run 的实际部署中,我们引入了分布式锁防止重复生成、采用Base62编码提升短码利用率,并结合Swoole实现毫秒级响应。

---

五、升华之道:不止于短



在“快缩短网址”,我们追求的不仅是长度的压缩,更是体验的升维:

- 智能去重:相同链接永不生成多个短码
- 缓存穿透防护:布隆过滤器预判无效请求
- 访问统计雏形:每跳皆可追踪,未来支持可视化报表
- 自定义别名:让用户掌握命名权,赋予链接个性温度

更重要的是,我们坚持简洁界面、零广告干扰、全平台适配——让每一次点击都专注而宁静。

---

六、结语:链接世界的另一种方式



当信息洪流奔涌不息,我们愿做那座静默的桥。
快缩短网址suo.run),不只是工具,更是一种对效率与美感的双重致敬。

在这里,每个长链都被温柔折叠,每段分享都变得轻盈可触。
未来之路,我们将持续打磨细节,拓展边界,只为让你的每一次转发,都如风般自由。