仿新浪微博短网址PHP实现方案
微博限制140字,但是我们知道有时需要分享一个类似淘宝商品的链接,很长,为了避免这个问题,所有了短网址的概念,废话不多说,直接把我的实现方案分享一下:
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
以上算法我也是网上学来的,网上有很多相关的资料,我只是用php实现了一遍,用在项目当中而已
实现方案:
1、客户端将长的url传递至短网址服务器,服务器将通过上述算法产生一个唯一的6个字符的key值
例如:
接收:{"url_info":[{"idx":"1","url":"http://www.baidu.com"},{"idx":"2","url":"http://www.qq.com"}]}
返回:{"url_info":[{"idx":"1","url":"http:\/\/127.0.0.1\/uMBrU3"},{"idx":"2","url":"http:\/\/127.0.0.1\/QfUBf2"}]}
关键部分实现代码:
/**
* 生成key
* @return mixed
*/
function createUrl() {
foreach($this->url_info as $key=>$row ){
//已经是短网址了就不要处理了
if( false == $this->isShortUrl($row->url) ){
$base32 = $GLOBALS['u_base64'];
$hex = md5($row->url);
$hexLen = strlen($hex);
$subHexLen = $hexLen / 8;
$output = array(); for ($i = 0; $i < $subHexLen; $i++) {
$subHex = substr ($hex, $i * 8, 8);
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
$out = '';
for ($j = 0; $j < 6; $j++) {
$val = 0x0000003D & $int;
$out .= $base32[$val];
$int = $int >> 5;
}
$output[] = $out;
} $this->urls[$output[0]] = $row->url;
$row->url = $GLOBALS['u_short_server'].$output[0];
//处理完了就删了,剩下的则原来就是短网址,直接返回给客户端即可
} }
}
2、将key 和长url建立对应关系存放在mysql数据库中,同事写入memcache
3、当通过http://127.0.0.1/uMBrU3访问的是后,利用url_rewirte功能具体配置如下:
# BEGIN url
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /loader.php [L]
</IfModule>
# END url
4、loader.php 代码如下
<?php
/**
* 重定向处理页面
* @author lsl
*/
include_once ('global.php'); $params = explode('/',$_SERVER['REQUEST_URI']);
$keyword = $params[count($params)-1];
$long_url = getUrlFromServerByKey($keyword,DIR); $prefix = strtolower(substr($long_url,0,7));
if($prefix != '' && $prefix != 'http://'){
$long_url = 'http://'.$long_url;
} if( $long_url != '' ){
urls_redirect($long_url);
} else {
urls_redirect("http://p.langma.cn");
} /**
* 页面重定向
* @param $location
*/
function urls_redirect( $location ) {
if( !headers_sent() ) {
header( "Location: $location" );
} else {
echo '<script type="text/javascript">
window.location="$location";
</script>';
}
die();
}
仿新浪微博短网址PHP实现方案的更多相关文章
- C#生成新浪微博短网址 示例源码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DotN ...
- 腾讯短链接url生成接口/腾讯短网址在线生成/新浪微博短链接生成器的分享
在通常情况下,URL是由系统生成的,通常包括URI路径,多个查询参数,可以对参数进行加密和解密. 当人们要分享某个URL,比如短信,邮件,社交媒体,这就需要短URL.而短网址,顾名思义就是在长度上比较 ...
- php生成短网址的思路与方法
生成短网址的思路以及使用php生成短网址的实现方法. 生成短网址的思路:如果把短网址还原了,你知道是个什么样子的吗?比如:http://www.jbxue.com/sitejs-17300-1.htm ...
- C# 实现对微博短网址的重定向还原
新浪微博中,为了节省输入字数,通过短网址对发布微博中链接进行重定向.我们可以通过代码实现对短网址进行还原,代码如下: private string GetOrignalLink(string link ...
- 长网址 短网址(http://www.zhihu.com/question/19852154?rf=21975802)
短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...
- 短网址ShortUrl的算法
场景: 我们在新浪微博上公布网址的时候.微博会自己主动判别网址.并将其转换.比如:http://t.cn/hrYnr0. 为什么要这样做的,原因我想有这样几点: 1.微博限制字数为140字一条,那么假 ...
- 新浪短网址最新api接口
1,雨林短网址 网站链接:http://yldwz.cn 雨林短网址采用新浪.腾讯官方API接口,强大的多功能API,简单易用,质量高官 网提供强技术支持,99.9% SLA服务稳定安全可靠的校验机制 ...
- [LeetCode] 534. Design TinyURL 设计短网址
Note: For the coding companion problem, please see: Encode and Decode TinyURL. How would you design ...
- 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)
短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...
随机推荐
- java查找重复类/jar包/普通文件
开发web应用时,有时更新了类却没有生效,其实是因为jboss/tomcat中其他发布包下有同名类(包括全路径都相同). 于是萌发了做个程序来检查指定目录是否存在重复类(通过asm从类文件中取类的全路 ...
- Linux权限机制
权限是操作系统用来限制用户.组.进程对操作系统资源(文件.设备等)的访问的机制 权限分为:读.写.执行,一般表示为 r.w.x http://itercast.com/lecture/22 每个文件或 ...
- Micro Python - Python for microcontrollers
Micro Python - Python for microcontrollers MicroPython
- python学习之路-3 初始python数据类型以及文件操作
本篇涉及内容 set集合 函数 三元运算 文件操作 set集合 set是一个无序的且不重复的元素集合 1.创建set集合的方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- classloader.getresources() 介绍
◆普通情况下,我们都使用相对路径来获取资源,这种灵活性比較大. 比方当前类为com/bbebfe/Test.class 而图像资源比方sample.gif应该放置在com/bbebfe/sample. ...
- According to TLD or attribute directive in tag file, attribute value does not accept any expressions
1.错误描写叙述 2014-7-13 17:27:21 org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one ...
- 用户向导页面实现左右滑动的ImageSwitcher
当你第一次打开app时刻,通常有使用向导现在演示APK基本功能和用法,该向导是非常重要的,用户可以知道并调整到速度app如何. 实现此使用向导有非常多种方法,比方用ImageSwitcher.View ...
- boost库在工作(39)网络UDP异步服务端之九
前面创建的UDP服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的.如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以 ...
- iOS获取网络时间与转换格式
[NSDate date]可以获取系统时间,但是会造成一个问题,用户可以自己修改手机系统时间,所以有时候需要用网络时间而不用系统时间.获取网络标准时间的方法: 1.先在需要的地方实现下面的代码,创 ...
- css之浏览器初始化方案
HTML, body, div, h1, h2, h3, h4, h5, h6, ul, ol, dl, li, dt, dd, p, blockquote,pre, form, fieldset, ...