收集了一段php记录访问者IP地址的代码,供大家学习参考。
具体请参照代码中的注释。
//文件名字
$filename = "ip.txt";
if (isset()($_SERVER['HTTP_CLIENT_IP']))
{
$clientip = $_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['HTTP_X_FORWARD_FOR']))
{
$clientip = $_SERVER['HTTP_X_FORWARD_FOR'];
}else
{
$clientip = $_SERVER['REMOTE_ADDR'];
}
//打开文件(文件不存在自动建立)
if (!$fp = fopen($filename, "a+"))
{
echo "不能打开文件$";
exit;
}
//写入的时候还判断是否已经有重复数据
while(!feof($fp))
{
$line = fgets($fp);
if($line == ($clientip."\n"))
{
exit; //有重复数据就退出;
}
}
// 写入文件
if(!fwrite($fp,$clientip."\n"))
{
echo "不能写入到文件$filename" ;
exit;
}
//已经完成写入文件
fclose($fp);
?>
有关PHP中的microtime相关知识的整理,有需要的朋友可以看看。
先来看一段代码:
class runTime {
var $StartTime = 0;
var $StopTime = 0;
var $TimeSpent = 0;
function start(){
$this->StartTime = microtime();
}
function stop(){
$this->StopTime = microtime();
}
function spent() {
if ($this->TimeSpent) {
return $this->TimeSpent;
} else {
$StartMicro = substr($this->StartTime,0,10);
$StartSecond = substr($this->StartTime,11,10);
$StopMicro = substr($this->StopTime,0,10);
$StopSecond = substr($this->StopTime,11,10);
$start = floatval($StartMicro) + $StartSecond;
$stop = floatval($StopMicro) + $StopSecond;
$this->TimeSpent = $stop - $start;
return round($this->TimeSpent,8);
}
} // end function
}
注解:
1、为什么说封装欠妥?
在使用过程中,我发现那几个类的属性,没必要作为var (public )形式出现,既然用了class,那么就遵照下面向对象的一些基本规则,这几个变量完全可以用private 访问控制。
2、microtime 用得不够好?
手册上关于microtime 的一些说明:
定义和用法
microtime() 函数返回当前 Unix 时间戳和微秒数。
如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。
在PHP5 以上版本,是可以接受参数true,这样就能直接返回浮点数,而且效率会比现在这样做高不少。
下面是网上找到的一段小代码,可以做参考:
<?php
function microtime_float3(){
return microtime(true);
}
function microtime_float2(){
if( PHP_VERSION > 5){
return microtime(true);
}else{
list($usec, $sec) = explode()(" ", microtime());
return ((float)$usec + (float)$sec);
}
}
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function runtime($t1){
return number_format((microtime_float() - $t1)*1000, 4).'ms';
}
$t1 = microtime_float();
for($i=0;$i<10000;$i++){
microtime_float();
}
echo "microtime_float=====";
echo runtime($t1).'<br>';
$t1 = microtime(true);
for($i=0;$i<10000;$i++){
microtime(true);
}
echo "microtime_true=====";
echo runtime($t1).'<br>';
$t1 = microtime(true);
for($i=0;$i<10000;$i++){
microtime_float2();
}
echo "microtime_float2=====";
echo runtime($t1).'<br>';
$t1 = microtime(true);
for($i=0;$i<10000;$i++){
microtime_float3();
}
echo "microtime_float3=====";
echo runtime($t1).'<br>';
?>
本机winxp运行结果:
microtime_float=====109.5631ms
microtime_true=====38.8160ms
microtime_float2=====52.7902ms
microtime_float3=====45.0699ms
Linux上运行结果:
microtime_float=====47.2510ms
microtime_true=====9.2051ms
microtime_float2=====16.3319ms
microtime_float3=====12.2800ms
以前在做一个产品时,用到IP地址信息,当时就下载一个IP纯真库,拿来解析。
现在完全可以更简单了,特别是对于我们做小网站的人来说。用现成的程序,省时省力。
function address_baidu($ip) {
$u = "";
$address = file_get_contents(" http://open.baidu.com/ipsearch/s?wd={$ip}&tn=baiduip");
preg_match('#来自:<b>(.+)</b>#Ui', $address, $m);
return strval($m[1]);
}
function GetRemoteIp($default='127.0.0.1')
{
$ip_string = $_SERVER['HTTP_CLIENT_IP'].','.$_SERVER['HTTP_X_FORWARDED_FOR'].','.$_SERVER['REMOTE_ADDR'];
if ( preg_match ("/\d+\.\d+\.\d+\.\d+/", $ip_string, $matches) )
{
return $matches[0];
}
return $default;
}
$ip = GetRemoteIp();
$addr = address_baidu($ip);
还有其他方法:
腾讯新浪通过IP地址获取当前地理位置(省份)的接口
腾讯的接口是 ,返回数组 http://fw.qq.com/ipaddress
返回值 var IPData = new Array("61.135.152.194","","北京市","");
新浪的接口 : http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42
可以简单使用:
<head>
<script type=text/javascript src=http://fw.qq.com/ipaddress charset="gb2312"></script>
<script type=text/javascript>
document.write(IPData.join(' '));
</script>
</head>
<body>
</body>
</html>