zoukankan      html  css  js  c++  java
  • 仿新浪微博短网址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、Uinx/Linux、C/C++等方面的项目开发。
  • 相关阅读:
    php微信支付v3版签名生成,代金券、微信支付分、支付即服务等
    docker基本命令及搭建php环境
    Nginx 负载均衡搭建
    laravel4.2 union联合,join关联分组查询最新记录时,查询条件不对,解决方案
    抓取腾讯视频弹幕
    laravel4.2 Redis 使用
    201771010106-东文财 实验一 软件工程准备-<构建之法与博客首秀>
    东文财201771010106《面向对象程序设计(java)》.18
    东文财201771010106《面向对象程序设计(java)》17
    201771010106东文财《面向对象程序设计(java)》实验16
  • 原文地址:https://www.cnblogs.com/lsl8966/p/3315204.html
Copyright © 2011-2022 走看看