ajax 发表于 2008-10-25 23:52:08

DISCUZ架构:misc.func.php文件分析一

/**
* 这个函数看着很长,其实要实现的功能很少,就是通过ip地址返回一个对应的地理位置
* @para string $ip //给定的ip,要符合点分十进制
*
* @return string
*/
function convertip($ip) {
      if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
                return '';
      }

      if($fd = @fopen(DISCUZ_ROOT.'./ipdata/wry.dat', 'rb')) {

                $ip = explode('.', $ip);
                $ipNum = $ip * 16777216 + $ip * 65536 + $ip * 256 + $ip;

                $DataBegin = fread($fd, 4);
                $DataEnd = fread($fd, 4);
                $ipbegin = implode('', unpack('L', $DataBegin));
                if($ipbegin < 0) $ipbegin += pow(2, 32);
                $ipend = implode('', unpack('L', $DataEnd));
                if($ipend < 0) $ipend += pow(2, 32);
                $ipAllNum = ($ipend - $ipbegin) / 7 + 1;

                $BeginNum = 0;
                $EndNum = $ipAllNum;

                while($ip1num > $ipNum || $ip2num < $ipNum) {
                        $Middle= intval(($EndNum + $BeginNum) / 2);

                        fseek($fd, $ipbegin + 7 * $Middle);
                        $ipData1 = fread($fd, 4);
                        if(strlen($ipData1) < 4) {
                              fclose($fd);
                              return '- System Error';
                        }
                        $ip1num = implode('', unpack('L', $ipData1));
                        if($ip1num < 0) $ip1num += pow(2, 32);

                        if($ip1num > $ipNum) {
                              $EndNum = $Middle;
                              continue;
                        }

                        $DataSeek = fread($fd, 3);
                        if(strlen($DataSeek) < 3) {
                              fclose($fd);
                              return '- System Error';
                        }
                        $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
                        fseek($fd, $DataSeek);
                        $ipData2 = fread($fd, 4);
                        if(strlen($ipData2) < 4) {
                              fclose($fd);
                              return '- System Error';
                        }
                        $ip2num = implode('', unpack('L', $ipData2));
                        if($ip2num < 0) $ip2num += pow(2, 32);

                        if($ip2num < $ipNum) {
                              if($Middle == $BeginNum) {
                                        fclose($fd);
                                        return '- Unknown';
                              }
                              $BeginNum = $Middle;
                        }
                }

                $ipFlag = fread($fd, 1);
                if($ipFlag == chr(1)) {
                        $ipSeek = fread($fd, 3);
                        if(strlen($ipSeek) < 3) {
                              fclose($fd);
                              return '- System Error';
                        }
                        $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
                        fseek($fd, $ipSeek);
                        $ipFlag = fread($fd, 1);
                }

                if($ipFlag == chr(2)) {
                        $AddrSeek = fread($fd, 3);
                        if(strlen($AddrSeek) < 3) {
                              fclose($fd);
                              return '- System Error';
                        }
                        $ipFlag = fread($fd, 1);
                        if($ipFlag == chr(2)) {
                              $AddrSeek2 = fread($fd, 3);
                              if(strlen($AddrSeek2) < 3) {
                                        fclose($fd);
                                        return '- System Error';
                              }
                              $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
                              fseek($fd, $AddrSeek2);
                        } else {
                              fseek($fd, -1, SEEK_CUR);
                        }

                        while(($char = fread($fd, 1)) != chr(0))
                              $ipAddr2 .= $char;

                        $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
                        fseek($fd, $AddrSeek);

                        while(($char = fread($fd, 1)) != chr(0))
                              $ipAddr1 .= $char;
                } else {
                        fseek($fd, -1, SEEK_CUR);
                        while(($char = fread($fd, 1)) != chr(0))
                              $ipAddr1 .= $char;

                        $ipFlag = fread($fd, 1);
                        if($ipFlag == chr(2)) {
                              $AddrSeek2 = fread($fd, 3);
                              if(strlen($AddrSeek2) < 3) {
                                        fclose($fd);
                                        return '- System Error';
                              }
                              $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
                              fseek($fd, $AddrSeek2);
                        } else {
                              fseek($fd, -1, SEEK_CUR);
                        }
                        while(($char = fread($fd, 1)) != chr(0))
                              $ipAddr2 .= $char;
                }
                fclose($fd);

                if(preg_match('/http/i', $ipAddr2)) {
                        $ipAddr2 = '';
                }
                $ipaddr = "$ipAddr1 $ipAddr2";
                $ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);
                $ipaddr = preg_replace('/^\s*/is', '', $ipaddr);
                $ipaddr = preg_replace('/\s*$/is', '', $ipaddr);
                if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
                        $ipaddr = '- Unknown';
                }

                return '- '.$ipaddr;

      } else {

                $datadir = DISCUZ_ROOT.'./ipdata/';
                $ip_detail = explode('.', $ip);
                if(file_exists($datadir.$ip_detail.'.txt')) {
                        $ip_fdata = @fopen($datadir.$ip_detail.'.txt', 'r');
                } else {
                        if(!($ip_fdata = @fopen($datadir.'0.txt', 'r'))) {
                              return '- Invalid IP data file';
                        }
                }
                for($i = 0; $i <= 3; $i++) {
                        $ip_detail[$i] = sprintf('%03d', $ip_detail[$i]);
                }
                $ip = join('.', $ip_detail);
                do {
                        $ip_data = fgets($ip_fdata, 200);
                        $ip_data_detail = explode('|', $ip_data);
                        if($ip >= $ip_data_detail && $ip <= $ip_data_detail) {
                              fclose($ip_fdata);
                              return '- '.$ip_data_detail.$ip_data_detail;
                        }
                } while(!feof($ip_fdata));
                fclose($ip_fdata);
                return '- UNKNOWN';

      }

}

ajax 发表于 2008-10-25 23:52:41

/**
* 目前发现这个函数在两个地方用到,search.php和digest.php,这个函数的用处是把从数据库中得到的帖子处理一下,然后给前端显示。
* @para array $thread //从数据库中取出的帖子原始数据
*
* @return array
*/
function procthread($thread) {
      global $dateformat, $timeformat, $timeoffset, $ppp, $colorarray;

      if(empty($colorarray)) {
                $colorarray = array('', 'red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple', 'gray');
      }

      $thread['forumname'] = $GLOBALS['_DCACHE']['forums'][$thread['fid']]['name'];
      $thread['dateline'] = gmdate($dateformat, $thread['dateline'] + $timeoffset * 3600);
      $thread['lastpost'] = gmdate("$dateformat $timeformat", $thread['lastpost'] + $timeoffset * 3600);
      $thread['lastposterenc'] = rawurlencode($thread['lastposter']);

      if($thread['replies'] > $thread['views']) {
                $thread['views'] = $thread['replies'];
      }

      $postsnum = $thread['replies'] + 1;
      $pagelinks = '';
      if($postsnum> $ppp) {
                $posts = $postsnum;
                $topicpages = ceil($posts / $ppp);
                for($i = 1; $i <= $topicpages; $i++) {
                        $pagelinks .= '<a href="viewthread.php?tid='.$thread['tid'].'&page='.$i.'" target="_blank">'.$i.'</a> ';
                        if($i == 6) {
                              $i = $topicpages + 1;
                        }
                }
                if($topicpages > 6) {
                        $pagelinks .= ' .. <a href="viewthread.php?tid='.$thread['tid'].'&page='.$topicpages.'" target="_blank">'.$topicpages.'</a> ';
                }
                $thread['multipage'] = '   ( <img src="'.IMGDIR.'/multipage.gif" class="absmiddle" border="0" alt="" /> '.$pagelinks.')';
      } else {
                $thread['multipage'] = '';
      }

      if($thread['highlight']) {
                $string = sprintf('%02d', $thread['highlight']);
                $stylestr = sprintf('%03b', $string);

                $thread['highlight'] = 'style="';
                $thread['highlight'] .= $stylestr ? 'font-weight: bold;' : '';
                $thread['highlight'] .= $stylestr ? 'font-style: italic;' : '';
                $thread['highlight'] .= $stylestr ? 'text-decoration: underline;' : '';
                $thread['highlight'] .= $string ? 'color: '.$colorarray[$string] : '';
                $thread['highlight'] .= '"';
      } else {
                $thread['highlight'] = '';
      }

      if($thread['attachment']) {
                require_once DISCUZ_ROOT.'./include/attachment.func.php';
                $thread['attachment'] = attachtype($thread['attachment']).' ';
      } else {
                $thread['attachment'] = '';
      }

      return $thread;
}
页: [1]
查看完整版本: DISCUZ架构:misc.func.php文件分析一

网站推广