PHP - 读取操作IP地址数据库文件QQWry.dat

首先看看QQWry.Data文件的内容结构
,以及解读方式

一、文件结构
文件主要分三个结构
1、文件头,8个字节;
2、数据记录区,不定长度;
3、索引区,长度为 7 的整数倍;

二、文件头
文件头的8个字节分两部分,每个部分4个字节,分别指定了索引区的开始地址和结束地址。所以可以通过两个地址的差值 除 7 后 加 1 可以计算出总的记录数。

二、记录区
记录区的数据需要通过索引区的数据来获得各个数据的起始位置;本区数据记录了IP地址的结束地址和地区字符串;所有地区字符串都以 0×00 为结束。

三、索引区
检索IP对应的地区,关键就是找到IP起始地址对应的索引内容。一个IP索引数据包含7个字节,前4个字节是IP地址起始值,后3个字节是对应的IP数据 记录在文件内的偏移地址;IP数据记录中,前 4 个字节是IP结束地址;紧跟的数据有两种模式: 0×01 模式 和 0×02 模式。

0×01模式,即在IP数据的第5个字节是 0×01,则在后面的 3 个字节是国家地区数据的偏移地址;国家地区数据包括国家和地区这两个字符串。即
—————————————————————
4字节 | 3字节 重定向 0x NN NN NN -> 国家地区数据的文件偏移地址
—————————————————————

0×02模式,即在IP数据的第5个字节是 0×02,则在后面的 3 个字节是国家数据的偏移地址,地区数据是再往后的字符串,以 0×00 截至。即
—————————————————————————–
4字节 | 3字节 重定向 0x NN NN NN -> 国家数据的文件偏移地址 | 地区字符串 | 0×00
—————————————————————————–

对于 0×01 模式所得到的 国家地区数据中,它可能又带有一个重定向结构,即
————————————–
国家字符串 | 0×00 | 地区字符串 | 0×00
————————————–

————————————————————————-
国家字符串 | 0×00 | 0×02 | 3字节 0x NN NN NN -> 地区字符串的文件偏移地址
————————————————————————-

对于前一种情况,比较简单,直接读出两个字符串数据就可以了;对于后一种情况,需要再次重定向到地区字符串的偏移地址,然后读取到 0×00 为字符串结尾。

对于这种采取地址映射实际字符串值的方式,主要作用是避免重复记录字符串值。在整个IP地址库文件中,有太多相同字符串记录了,采用 3 字节的映射地址要比重复记录字符串值节省太多空间了。

PHP代码读取操作QQWry.dat文件

function bin2ip($bin){
	$ip = '';
	$bd = str_split($bin, 1);
	for($i = 4; $i > 0; $i--){
		$ip .= "." . sprintf("%03d", implode('', unpack('s', $bd[$i-1] . chr(0))));
	}
	return substr($ip, 1);
}

//--------------------------------------------------
$f = fopen('QQWry.Dat', 'r');
$c = fread($f, 4);
$d = fread($f, 4);

$index_begin	= implode('', unpack('L', $c));
$index_end		= implode('', unpack('L', $d));
if($index_begin < 0) $index_begin += pow(2, 32);
if($index_end < 0) $index_end += pow(2, 32);

$ip_num = ($index_end - $index_begin) / 7 + 1;

echo "index begin at: $index_begin\n";
echo "index end at: $index_end\n";
echo "ip data count : $ip_num\n";

$output = '';

for($i = 0; $i < $ip_num; $i++){

	//文件指针指到每个IP数据文件的索引取得索引数据(7字节)上
	fseek($f, $i * 7 + $index_begin);
	$ip4 = fread($f, 4); //IP起始地址
	if(strlen($ip4) < 4) exit('data file error');

	$ip3 = fread($f, 3); //IP记录偏移地址
	if(strlen($ip3) < 3) exit('data file error');

	$dataseek = implode('', unpack('L', $ip3 . chr(0)));
	if($dataseek < 0) $index_ip_record += pow(2, 32);

	//指向记录区 $dataseek 位置查找记录
	fseek($f, $dataseek);
	$ipdata = fread($f, 4); //IP结束地址
	if(strlen($ipdata) < 4) exit('data file error');

	$area = '';
	$country = '';

	//读一个标记位
	$flag = fread($f, 1);
	if($flag == chr(1)){ //国家名偏移标记位 模式一 0x01
		$area1seek = fread($f, 3);
		if(strlen($area1seek) < 3) exit('data file error');
		$area1seek = implode('', unpack('L', $area1seek . chr(0)));
		fseek($f, $area1seek);
		$flag = fread($f, 1); //可能又是标记位
	}
	if($flag == chr(2)){ //国家地区 重定向
		$area1seek = fread($f, 3);
		if(strlen($area1seek) < 3) exit('data file error');
		$area1seek = implode('', unpack('L', $area1seek . chr(0)));
		$flag = fread($f, 1);
		if($flag == chr(2)){
			$area2seek = fread($f, 3);
			$area2seek = implode('', unpack('L', $area2seek . chr(0)));
			fseek($f, $area2seek);
		}else{
			fseek($f, -1, SEEK_CUR);
		}
		while(($c = fread($f, 1)) != chr(0)) $area .= $c;
		fseek($f, $area1seek);
		while(($c = fread($f, 1)) != chr(0)) $country .= $c;
	}else{
		fseek($f, -1, SEEK_CUR);
		while(($c = fread($f, 1)) != chr(0)) $country .= $c;

		$flag = fread($f, 1); //如果地区是重定向的
		if($flag == chr(2)){
			$area2seek = fread($f, 3);
			$area2seek = implode('', unpack('L', $area2seek . chr(0)));
			fseek($f, $area2seek);
		}else{
			fseek($f, -1, SEEK_CUR);
		}
		while(($c = fread($f, 1)) != chr(0)) $area .= $c;
	}
	$adata = trim($country) . trim($area); //$country是国家字符串 , $area 是地区字符串
}
fclose($f);

顺便附上QQWry.dat文件下载地址

QQ IP数据库 纯真版20100815
IP数据记录:380573条
数据库大小:7919KB

Magento或osc使用首信易支付接口的示例表单参数

下面是最近Magento和Osc使用首信易支付方式
做支付接口包里的提交表单:

<?php
$v_mid    = "250";            // 商户号
:测试商务号250
$v_oid    = date('Ymd') .'-' . $v_mid .'-' . date('His');    // 订单编号:订单生成日期(yyyymmdd)-商户编号-商户流水号
$v_rcvname    = $v_mid;         // 收货人姓名
$v_rcvaddr    = $v_mid;         // 收货人地址
$v_rcvtel    = $v_mid;          // 收货人电话
$v_rcvpost    = $v_mid;         // 收货人邮政编码
$v_amount    = '89.99';         // 订单总金额:不可为空值,小数点后保留两位
$v_ymd        = date('Ymd');    // 订单产生日期:格式为yyyymmdd
$v_orderstatus    = "1";        // 配货状态:0为未配齐,1为已配齐;一般商户该参数无实际意义,建议统一配置为1的状态。
$v_ordername    = $v_mid;    // 订货人姓名,总长不超过64个字符
$v_moneytype    = '1';      // 支付币种:0为人民币,1为美元,2为欧元,3为英镑,4为日元,5为韩元
$v_url        = "http://demo.cn/easypay/recive.php";     // 返回商户页面地址
$MD5_Key    = "testtest";    // 商户密钥
:测试商务号密钥testtest
$source        = $v_moneytype.$v_ymd.$v_amount.$v_rcvname.$v_oid.$v_mid.$v_url;    // 七个参数的合并
$v_md5info    = hmac_md5
( $MD5_Key, $source );    // 订单数字指纹
:用hmac加密
$v_shipstreet    = 'v_shipstreet';    // 送货街道地址:为送货地址街道部分,总长不超过100个字符。
$v_shipcity        = 'v_shipcity';        // 送货城市:为送货地址城市部分,总长不超过50个字符。
$v_shipstate    = 'AL';                //*
送货省/州:如送货国家为美国或加拿大,应为两位字母代码,代码规范参见附件《州省 代码表

$v_shippost        = '12345';            // 送货邮编:为送货地址邮政编码部分,总长不超过20个字符。
$v_shipcountry    = '840';            //*
为送货国家三位数字代码,代码规范参见附件《国 家代码表

$v_shipphone    = '13808080880';    // 送货电话:为送货联系电话,总长不超过50个字符。
$v_shipemail    = 'chen@sjolzy.cn';    // 送货邮箱:为送货联系Email,总长不超过50个字符。
$paypal_content    =
'<form action="http://pay.beijing.com.cn/prs/e_user_payment.checkit" method="post" name="E_FORM" id="E_FORM">
<input type="hidden" name="v_mid" value="'.$v_mid.'" />
<input type="hidden" name="v_oid" value="'.$v_oid.'" />
<input type="hidden" name="v_rcvname" value="'.$v_rcvname.'" />
<input type="hidden" name="v_rcvaddr" value="'.$v_rcvaddr.'" />
<input type="hidden" name="v_rcvtel" value="'.$v_rcvtel.'" />
<input type="hidden" name="v_rcvpost" value="'.$v_rcvpost.'" />
<input type="hidden" name="v_amount" value="'.$v_amount.'" />
<input type="hidden" name="v_ymd" value="'.$v_ymd.'" />
<input type="hidden" name="v_orderstatus" value="'.$v_orderstatus.'" />
<input type="hidden" name="v_ordername" value="'.$v_ordername.'" />
<input type="hidden" name="v_moneytype" value="'.$v_moneytype.'" />
<input type="hidden" name="v_url" value="'.$v_url.'" />
<input type="hidden" name="v_md5info" value="'.$v_md5info.'" />
<input type="hidden" name="v_shipstreet" value="'.$v_shipstreet.'" />
<input type="hidden" name="v_shipcity" value="'.$v_shipcity.'" />
<input type="hidden" name="v_shipstate" value="'.$v_shipstate.'" />
<input type="hidden" name="v_shippost" value="'.$v_shippost.'" />
<input type="hidden" name="v_shipcountry" value="'.$v_shipcountry.'" />
<input type="hidden" name="v_shipphone" value="'.$v_shipphone.'" />
<input type="hidden" name="v_shipemail" value="'.$v_shipemail.'" />
<input type="submit" value="submit" />
</form>';
echo $paypal_content;
?>
用到的加密兼容性函数:(在有的php环境中可能没支持hmac函数)
<?php
function hmac_md5($key, $data)
{
    if (extension_loaded('mhash'))
    {
        return bin2hex(mhash(MHASH_MD5, $data, $key));
    }

    $b = 64;
    if (strlen($key) > $b)
    {
        $key = pack('H*', md5($key));
    }
    $key  = str_pad($key, $b, chr(0x00));
    $ipad = str_pad('', $b, chr(0x36));
    $opad = str_pad('', $b, chr(0x5c));

    $k_ipad = $key ^ $ipad;
    $k_opad = $key ^ $opad;

    return md5($k_opad . pack('H*', md5($k_ipad . $data)));
}
?>

对于要开发首信易支付接口包的使用,Magento和Osc都可以直接根据原有的Paypal支付接口程序包的目录,稍微整合修改代码就可用。

Demo网址://sjolzy.cn/php/PayEase/demo.php

首信易参考文档:

首信易支付(v4.3)接口说明_CYBS外卡20101103.doc

州省代码表

国家代码表

payEasy首信义帮助文档

承接Magento首信易支付接口开发和首信易中转站建设

做外贸网店搞电子商务最常见的网上支付风险问题几点总结

网上支付风险
一直伴随着外贸零售
,骗子到处都有。国际在线支付
难免存在支付风险,只能防范网上支付风险
,减少损失。开外贸网店
一般只有信用卡及paypal存在支付风险。网上支付风险主要有以下几点:

1)收货地址与账单地址不一致,这是最常见的支付风险。无论是信用卡还是paypal,都要求两个地址一致,否则不承认发货。可以和买家沟通,让收货地址与账单地址一致,paypal支持账户多地址,或者让买家在网上把收货地址也添加到账户,如果是老客户,地址不用太较真。在zen cart后台订单页面,地址不匹配会有红点提醒。

2)一单多货。小心了,这可能是骗单!客人支付后收到货或甚至还没收到就拒付。只要发觉客户购买的数量超过常规,就要注意风险。碰到这种情况应该先跟客人沟通,退款让他们用西联再汇款,我们给他一些折扣。如果不行,有时候还得放弃。

3)paypal通过支票支付。支票支付一般要三四天到账,一定要等款到了再发货。有些客人通过支票支付生成订单等确认发货后取消支付。这期间要耐心跟客人解释,因为客人的paypal账户显示已支付,通常的客人都没什么问题。

4)乱投诉,这点最头疼。努力提供证据证明自己吧,实在不行退款认载。

出现这几种情况就要注意网上支付风险,尽量减少损失。

学外贸零售,请继续关注外贸博客

thinkphp 自带常量

Action中使用的系统常量

THINK_PATH // ThinkPHP 系统目录
APP_PATH // 当前项目目录
APP_NAME // 当前项目名称
MODULE_NAME //当前模块名称
ACTION_NAME // 当前操作名称
TMPL_PATH // 项目模版目录
LIB_PATH // 项目类库目录
CACHE_PATH // 项目模版缓存目录
CONFIG_PATH //项目配置文件目录
LOG_PATH // 项目日志文件目录
LANG_PATH // 项目语言文件目录
TEMP_PATH //项目临时文件目录
PLUGIN_PATH // 项目插件文件目录
VENDOR_PATH // 第三方类库目录
DATA_PATH // 项目数据文件目录
IS_APACHE // 是否属于 Apache
IS_IIS //是否属于 IIS
IS_WIN //是否属于Windows 环境
IS_LINUX //是否属于 Linux 环境
IS_FREEBSD //是否属于 FreeBsd 环境
NOW_TIME // 当前时间戳
MEMORY_LIMIT_ON // 是否有内存使用限制
OUTPUT_GZIP_ON // 是否开启输出压缩
MAGIC_QUOTES_GPC // MAGIC_QUOTES_GPC
THINK_VERSION //ThinkPHP 版本号
LANG_SET // 浏览器语言
TEMPLATE_NAME //当前模版名称
TEMPLATE_PATH //当前模版路径
__ROOT__ // 网站根目录地址
__APP__ // 当前项目(入口文件)地址
__URL__ // 当前模块地址
__ACTION__ // 当前操作地址
__SELF__ // 当前 URL 地址
TMPL_FILE_NAME //当前操作的默认模版名(含路径)
WEB_PUBLIC_URL //网站公共目录
APP_PUBLIC_URL //项目公共模版目录

 

模板中使用的系统常量

_PHP_FILE_ /当前文件名
__ROOT__ // 网站根目录地址
__APP__ // 当前项目(入口文件)地址
__URL__ // 当前模块地址
__ACTION__ // 当前操作地址
__SELF__ // 当前 URL 地址
__PUBLIC__ // 网站公共目录
../Public(不区分大小写) // 项目公共模版目录
 

域名解析,A记录,MX记录,CNAME记录,url转发,frame转发,ns记录,动态域名解析

再次整理一下关于搞空间、域名要了解的一些必备知识

 

什么是域名解析:

域名解析就是域名到IP地址的转换过程。IP地址网路上标识您站点的数字地址,为了简单好 记,采用域名来代替IP地址标识站点地址域名的解析工作由DNS服务器完成。

 

什么是A记录(IP指向):

用来指定域名对应的IP地址记录用户可以将该域名解析到自己的webserver上。同时也可以设置域名的二级域名
说明用户可以将该域名下 的网站服务器指向到自己的web server上。同时也可以设置自己域名的二级域名。 
就是说:通过A记录,大家可以设置自 己的不同域名转到不同的IP上去!如: 
www.yourname.com 转到IP 321.32.321.321 
ftp.yourname.com 转 到IP 123.12.123.123 
mail.yourname.com 转到IP 213.21.213.213 

 

什么是cname记录(别名指向):

相当于用子域名来代替ip地址,优点是如果ip地址变化,只需要改动子域名 的解析,而不需要逐一改变ip地址解析。可以将注册的不同域名统统转到一个主域名上去!与A记录不同的是,CNAME别名记录设置的可以是一个域名的描述而不一定是IP地 址! 

 

什么是URL(转发):

访问您的域名时,将会自动跳转到您所指定的另一个网络地址(URL),此时在浏览器地址 栏显示的是你跳转的地址功能:如果您没有一台 独立的服务器(也就是没有一个独立的IP地址)或者您还有一个域名B,您想访问A域名时访问到B域名内容,这时您就可以通过URL转发来实现。 
url 转发可以转发到某一个目录下,甚至某一个文件上。而cname是不可以,这就是url转发和cname的主要区别所在。 

 

什么是frame(隐藏转发):

访问您的域名时,将会自动跳转到您所指定的另一个网络地址(URL),此时在浏 览器地址栏" title="地址栏">地址栏显示的是你原域名地址

 

什么是mail记录

它指向一个邮件服务器,用于电子邮件系统邮件时根据 收信人的地址后缀定位邮件服务器

 

什么是MX记录邮件路由记录  :

它指向一个邮件服务器,用于电子邮件系统邮件时根据 收信人的地址后缀定位邮件服务器
说明用户可以将该域名下的邮件服务器指向到自己的mail server 上,然后即可自行操作控制所有的邮箱设置。您只需在线填写您服务器主机名或主机IP地址,即可将您域名下的邮件全部转到您自己设定相应的邮件服务器 上。 就是将你的域名邮件服务器分开,将它设置到其它的IP去! 
比如同样是 ourwords.cn,如果你设置A记录是指向 123.12.123.123,而MX记录设置是指向222.22.222.222,那么你的DNS服务器接收到别人的邮件路由请求时就将会将它的请求 解释到222.22.222.222上去!而别人访问你的网页的时候仍然是访问123.12.123.123。 


什么是NS(Name Server)域名服务器记录

用来指定该域名由哪个DNS服务器进行解析。
如何查看域名的A记录、MX记 录、CNAME记录和NS记录 
那么如何才能查到域名的A记录,要查询域名的MX记录、CNAME记录或NS记录,可用 nslookup命令。nslookup是windows NT/2000/XP和unix、linux等操作系统自带的命令。(在Windows 98/Me里没有)。 
在Windows的DOS命令行窗口里,或unix/linux命令行下,输入nslookup。其中 “Default Server”和“Address”是当前上网所用的DNS服务器域名地址。“>”是nslookup的提示符。在提示符下输 入“?”和回车,可看到nslookup的帮助信息,输入“exit”和回车可退出nslookup。此时,在提示符下直接输入域名,可查到该域名的A记 录。例如: 
其中“Non-authoritative answer”表示查询结果是从DNS的cache返回的。 
输 入set type=mx,再输入域名,可查询MX记录。例如: 
输入set type=cname,再输入域名,可查询CNAME记 录。例如: 
输入set type=ns,再输入域名,可查询NS记录。例如: 
如果您申请了顶级域名或独立域名动态解析 服务,在您的域名注册商里把域名的NS记录设置域名服务商的DNS服务器后,可以用这个办法查询设置是否已经生效。 
上述的操作,都是从默认 的DNS服务器进行查询的,如果想指定查询所用的DNS服务器,可以在输入域名的时候,后面跟上一个域名服务器地址。这种查询方法对所有记录的查询都 适用。如果您在万网申请了顶级域名或独立域名动态解析服务,在未到您的域名注册商里设置域名的NS记录之前,可以用这个办法查询您的域名在万网是否能正 常解析。 


什么是动态域名解析:

指把一个固定的域名解析到一个具有动态IP的主机上。在家里或公司里上网的机器,使用动态域名服务后, 所有Internet用户就可以通过一个固定的域名访问这台计算机。网上常见公司如花生壳等即提供有动态域名服务

php实现的基本的数据结构和算法,什么二叉树、二叉搜索树、AVL树、B树、链表和常见排序、搜索算法

 

goo
gle的代码
搜索
里面发现一个使用
php
实现的基本的数据
结构和算法
,什么二叉树、二叉搜索
树、AVL树、B树、链表和常见
排序
搜索
算法
等等,而且全部是使用
面向对象来实现的,确是是很强。

源码地址
:http://www
.brpreiss.com/books/opus11/public
/Opus11-1.0.tar.gz

文档
地址
:http://www
.brpreiss.com/books/opus11/