php代码示例如何生成短链接_php生成短链接代码示例【示例】

发布时间 - 2026-02-01 00:00:00    点击率:
短链接生成的核心逻辑是将自增ID通过Base62编码为固定长度字符串,而非随机生成或哈希截断;需保证可逆、防冲突(加唯一索引)、防开放重定向,并记录元数据以支持追溯与统计。

短链接生成的核心逻辑是什么

短链接不是靠随机字符串“凑”出来的,而是把原始 URL 做哈希或自增 ID 编码后映射成固定长度的字符串。直接用 md5()sha1() 截取前 6 位看似简单,但冲突概率高、不可逆、无法追踪;更稳妥的做法是用「自增主键 + 进制转换」,比如把数据库里刚插入的 id(10 进制)转成 62 进制(a–z, A–Z, 0–9)。

用 base62 编码实现可逆短码

PHP 没有内置 base62,但逻辑极简:不断对 ID 取模 62,查表拼字符。注意别漏掉 0 的处理,否则 id=0 会生成空字符串。

function idToShort($id) {
    $chars = 'abc

defghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; if ($id == 0) return 'a'; // 映射 0 → 'a' $short = ''; while ($id > 0) { $short = $chars[$id % 62] . $short; $id = (int)($id / 62); } return $short; }

反向解码时按权展开即可,关键点:$id = $id * 62 + strpos($chars, $char)。务必校验输入字符是否全在 $chars 中,否则可能静默出错。

数据库必须加唯一索引防重复

即使编码逻辑完美,高并发下两个请求同时拿到相同 id 并生成相同短码的情况极少,但插入前没校验、没索引就会导致数据错乱或报错 Integrity constraint violation

  • 建表时给 short_code 字段加 UNIQUE 索引
  • 插入失败时捕获 23000 错误码(MySQL),重试编码下一个 id
  • 避免用 SELECT ... FOR UPDATE 锁表,性能差且易死锁

跳转时如何安全重定向

收到短码请求后,先查库获取原 URL,再用 header('Location: ...', true, 302) 跳转。这里有两个硬性要求:

  • 必须检查查到的 original_url 是否以 http://https:// 开头,否则拒绝跳转,防止开放重定向漏洞
  • 必须在 header() 前确保无任何输出(包括空格、BOM、echo),否则报错 Cannot modify header information
  • 建议加 exit; 防止后续代码执行

真正难的不是生成那几行代码,而是怎么让每次生成都可追溯、不冲突、不被滥用——短码表里至少得存 idshort_codeoriginal_urlcreated_atclick_count,少一个字段后期就容易卡住。


# mysql  # php  # 编码  # ai  # echo  # strpos  # for  # select  # 字符串  # char  # Chars  # 并发  # bom  # location  # 数据库  # http  # https  # 跳转  # 重定向  # 死锁  # 报错  # 就会  # 成都  # 再用  # 不被  # 而非  # 无任何 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  googleplay官方入口在哪里_Google Play官方商店快速入口指南  用v-html解决Vue.js渲染中html标签不被解析的问题  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel如何配置任务调度?(Cron Job示例)  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  香港服务器租用费用高吗?如何避免常见误区?  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Python文件流缓冲机制_IO性能解析【教程】  如何在七牛云存储上搭建网站并设置自定义域名?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  如何基于云服务器快速搭建个人网站?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  如何快速启动建站代理加盟业务?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  重庆市网站制作公司,重庆招聘网站哪个好?  Laravel怎么实现验证码(Captcha)功能  Java遍历集合的三种方式  Linux系统运维自动化项目教程_Ansible批量管理实战  如何快速搭建高效可靠的建站解决方案?  如何用免费手机建站系统零基础打造专业网站?  Android中AutoCompleteTextView自动提示  EditPlus中的正则表达式实战(5)  Laravel如何发送系统通知?(Notification渠道示例)  Laravel如何使用Telescope进行调试?(安装和使用教程)  简历在线制作网站免费版,如何创建个人简历?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  高防服务器如何保障网站安全无虞?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  用yum安装MySQLdb模块的步骤方法  百度浏览器如何管理插件 百度浏览器插件管理方法  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何自定义分页视图?(Pagination示例)  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何快速搭建高效服务器建站系统?  高性价比服务器租赁——企业级配置与24小时运维服务  高防服务器:AI智能防御DDoS攻击与数据安全保障  原生JS获取元素集合的子元素宽度实例  详解jQuery中基本的动画方法  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  简历没回改:利用AI润色让你的文字更专业  米侠浏览器网页背景异常怎么办 米侠显示修复