本节主要内容:
根据IP地址获取城市名称的php代码。
用到了纯真IP数据库实现。
本例php代码,透过纯真IP数据库的支持,可以精确地定位城市位置。
支持多种查询方式形如:本机IP、自定义IP、自定义域名三种方式。
http://domain/ip 直接查询本机IP所在城市位置
http://domain/ip/?q=xxx.xxx.xxx.xxx 获取自定义IP的城市位置
http://domain/ip/?q=baidu.com 获取域名所在的城市位置
例子:
/**
* 根据IP地址取得城市名称 纯真IP数据库
* edit: www.
*/
function convertip($ip) {
//IP数据文件路径
$dat_path = 'QQWry.Dat';
//检查IP地址
if(!filter_var($ip, FILTER_VALIDATE_IP)) {
return 'IP Address Error';
}
//打开IP数据文件
if(!$fd = @fopen($dat_path, 'rb')){
return 'IP date file not exists or access denied';
}
//分解IP进行运算,得出整形数
$ipNum = ip2long($ip);
//获取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; //使用二分查找法从索引记录中搜索匹配的IP记录 while($ip1num>$ipNum || $ip2num<$ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);
//偏移指针到索引位置读取4个字节
fseek($fd, $ipbegin + 7 * $Middle);
$ipData1 = fread($fd, 4);
if(strlen($ipData1) < 4) {
fclose($fd);
return 'System Error';
}
//提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32); //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环 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;
}
header("Content-type: text/html; charset=utf-8");
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
if(isset()($_GET['q'])){
$ip = $_GET['q'];
if(filter_var("http://".$ip,FILTER_VALIDATE_URL,FILTER_FLAG_HOST_REQUIRED)){
$ip = gethostbyname($ip);
}
}
echo "$ip,".mb_convert_encoding(convertip($ip),"utf-8","gb2312");
?>
本节提供的这段php天气预报代码,其天气预报信息采集自中央气象台,信息准确,覆盖面广,代码简单。
返回是json代码,可以用于客户端调用,也可以在服务器端处理后显示。
注意:此代码会在服务器产生缓存文件,需要在当前目录中新建data文件夹,保证文件夹可写。
例子:
/**
* php 天气预报代码
* by www.
*/
if(!isset()($_GET['q'])){
//根据IP查询所在地
$p = file_get_contents("http://www./ip/?q={$_SERVER['HTTP_X_FORWARDED_FOR']}");
}
else{
$p = $_GET['q'];
}
$k = 0;
$encoding = mb_detect_encoding($p);
if($encoding != "UTF-8"){
$p = mb_convert_encoding($p,"utf-8","gbk");
}
$p_arr = array(
"01" => "北京",
"02" => "上海",
"03" => "天津",
"04" => "重庆",
"05" => "黑龙江",
"06" => "吉林",
"07" => "辽宁",
"08" => "内蒙古",
"09" => "河北",
"10" => "山西",
"11" => "陕西",
"12" => "山东",
"13" => "新疆",
"14" => "西藏",
"15" => "青海",
"16" => "甘肃",
"17" => "宁夏",
"18" => "河南",
"19" => "江苏",
"20" => "湖北",
"21" => "浙江",
"22" => "安徽",
"23" => "福建",
"24" => "江西",
"25" => "湖南",
"26" => "贵州",
"27" => "四川",
"28" => "广东",
"29" => "云南",
"30" => "广西",
"31" => "海南",
"32" => "香港",
"33" => "澳门",
"34" => "台湾"
);
function find(&$item,$key,$data){
global $k;
if(preg_match("/$item/u",$data)){
$k = $key;
}
}
function get_data_arr($key){
if(!file_exists("./data/city{$key}.xml")){
$c =file_get_contents( "http://m.weather.com.cn/data5/city{$key}.xml" );
file_put_contents("./data/city{$key}.xml",$c);
}
else{
$c = file_get_contents("./data/city{$key}.xml");
}
$arr = explode()(",",$c);
foreach($arr as $v){
$data = explode("|",$v);
$ret[$data[0]] = $data[1];
}
return $ret;
}
array_walk($p_arr,'find',$p);
array_walk(get_data_arr($k),'find',$p);
array_walk(get_data_arr($k),'find',$p);
$ccode = get_data_arr($k);
echo file_get_contents("http://m.weather.com.cn/data/{$ccode[$k]}.html");
?>
您可能感兴趣的文章:
php调用yahoo sina api天气预报的实现代码php调用google天气api的实例代码
Google API 获取当前天气信息的php代码
本节主要内容:
php实现mysql数据库的读写分离。
实现代码:
假设:
127.0.0.1:3306 为读的数据库
127.0.0.2:3306 为写的数据库
例子:
/**
* mysql读写分离
* edit: www.
*/
class db
{
public function __construct($sql)
{
$chestr = strtolower()(trim($sql));
//判断sql语句有select关键字的话,就连接读的数据库,否则就连接写数据库
if(substr($chestr,0,6)=='select')
{
echo 'I am using select db..<br>';
$link = mysql_connect()("127.0.0.1:3306", "root", "") or die("Could not connect: " . mysql_error());
mysql_select_db("test");
$result = mysql_query()($sql);
while ($row = mysql_fetch_array($result, MYSQL_NUM))
{
printf("%s %s", $row[0],$row[1]);
}
echo mysql_get_host_info($link).mysql_get_server_info($link).mysql_get_proto_info($link).mysql_get_client_info().'<br>';
}
else
{
echo 'I am using insert db..<br>';
$link = mysql_connect("127.0.0.2:3306","root","") or die("Could not connect: " . mysql_error());
mysql_select_db("test");
$result = mysql_query($sql);
echo @mysql_affected_rows($result);
echo mysql_get_host_info($link).mysql_get_server_info($link).mysql_get_proto_info($link).mysql_get_client_info().'<br>';
}
}
}
$d = new db(" update `users` set `select`='fasdf' where `id` =1");
$d2 = new db(" SELECT * from `users`");
附,数据库读写分享的相关解释。
数据库的读写分离,可以有效降低降低数据库的压力。
一个主数据库,多个从数据库的架构,实现读写分离,是经常用到的方案。
主数据库提供写操作,从数据库提供读操作。
其实分散数据库的压力,并不一定要读写分离,但是读写分离还是有自身的诸多好处的。
比如:
1、有利于数据库的负载均衡实现。
2、有利于实现主从数据库热备份。如果不分离,那么就要考虑做双向热备份策略了。
这个的配置比较复杂,并且出问题后也比较麻烦。
3、有利于保持数据库的高可用性,特别是在数据库集群的环境。
4、最后,实现读写分离后,对mysql的查询速度以及稳定性会更有信心。