Sep 27

获取客户端真实IP 不指定

felix021 @ 2011-9-27 11:29 [IT » 网络] 评论(1) , 引用(0) , 阅读(10288) | Via 本站原创
WEB开发有各种复杂性,典型的是HTTP的无状态连接,加密什么的,最近碰到的另一个头疼的事情就是如何获取客户端的真实IP。

其实以前在开发WOJ-Land的时候就遇到这个问题了:如果用户使用了HTTP代理来访问的话,通过REMOTE_ADDR只能获取到HTTP代理的IP,当时只是简单地再判断是否有X-FORWARDED-FOR这个HTTP头(对应PHP的$_SERVER['HTTP_X_FORWARDED_FOR'])来获取客户端的IP。虽然基本达到要求,但是还有各种问题。

一个比较常见的问题就是,如果用户通过多层HTTP代理来访问,那么每个代理都会把自己的IP加到X-FORWARDED-FOR这个头里面(用逗号隔开),真实的浏览器端IP应该是列表的第一个IP。

另外,有些CDN或者其他类似代理的服务,会提供其他的HTTP头,比如 Cdn_Src_Ip,Proxy-Client-IP,WL-Proxy-Client-IP, Client-IP等等。

一个比较合适的做法大概应该是这样:
$arr_ip_header = array(
    "HTTP_CDN_SRC_IP",
    "HTTP_PROXY_CLIENT_IP",
    "HTTP_WL_PROXY_CLIENT_IP",
    "HTTP_CLIENT_IP",
    "HTTP_X_FORWARDED_FOR",
    "REMOTE_ADDR",
);

$client_ip = "";
foreach ($arr_ip_header as $key) {
    if (!empty($_SERVER[$key]) && strtolower($_SERVER[$key]) != "unknown") {
        $client_ip = $_SERVER[$key];
        break;
    }
}
if (false !== strpos($client_ip, ",")) {
    $client_ip = preg_replace("/,.*/", "", $client_ip);
}

p.s. 以上代码未经实际运行,可能存在语法问题。
Sep 21

Win8初体验 不指定

felix021 @ 2011-9-21 00:37 [IT » 操作系统] 评论(2) , 引用(0) , 阅读(13735) | Via 本站原创
昨天闲着蛋疼,白天把机器挂着下了个Win8开发者预览版,然后从公司远程到家里,UltraISO挂载,点击Setup,点了几个按钮,最后点了个Install,以为会让我选择安装在哪个分区然后再拷贝文件,没想到直接重启把Win7覆盖了,晚上回家一看,丫的已经安装好了,只差我创建帐号再点几个个人配置了。

进入系统以后发现不太习惯。默认进入的是Metro界面,按Windows键或者点击上面的Desktop区域返回桌面;传统的开始菜单貌似完全消失了,按Windows键只是在Metro和传统界面之间切换。Win7的应用都能安装(包括Chrome、QQ、迅雷、Flash插件),但是QQ的聊天窗口不能响应点击事件。此外就是不够稳定,会出现重启/注销卡死的情况,只能长按电源键。Metro界面提供了一些简单的APP,包括五子棋、Piano、Paint等等(其实Piano做的还不错)。可惜没有触摸设备,用鼠标点还是不太给力。

还好上周把Win7 Ghost了一份,截了图就换回Win7了,下面就贴些图吧:

点击在新窗口中浏览此图片
Sep 20

阅读杂记(HA,PHP) 不指定

felix021 @ 2011-9-20 12:44 [IT » 网络] 评论(0) , 引用(0) , 阅读(5553) | Via 本站原创
通过Coolshell.cn的这篇文章看了一些东西,简单记下来,方便以后查询。

Tagged: 从简单的15台LAMP服务器发展到现在的1000台服务器,首先采用PHP、单数据库,以实现快速迭代开发;加入memcached大幅缓解数据库压力;使用多台数据库服务器(主从?)扩展处理能力;引入Lucene(Java),提供搜索服务(这个PHP没法做);数据库压力还是太大,采用Oracle的Sharded Database横向扩展处理能力,同时因为大量的数据库请求,php的短连接不合适,加入了一个中间层。于是整个架构中的各种大压力环节可以简单地使用增加机器的方式来横向扩展,让开发人员可以专注于功能(feature)的开发,而不是焦头烂额地处理各种问题。CTO貌似曾经被Java1.0坑过,有点反感,但是在使用Lucene以后发现,引入Java,使得开发很多类型的功能变得可能(尤其是这些事情对于php不合适,"impractical"),比如利用大量常驻内存的数据来构造关系网、个性化搜索建议等。

Flipkart: (不知道为什么在Load Balancer一节专门提到Apache Thrift) 使用HAProxy和四层设备来进行负载均衡。HAProxy提供RoundRobin和基于IP的两种算法实现负载均衡,支持在4层或者7层进行转发(甚至可以用来搞MySQL),支持高并发,并且能够进行服务器健康检测,总的来说是各方面都比较均衡的解决方案。使用Varnish来实现HTTP缓存,据说效率比Squid要高好几倍,主要是因为将swap的事情交给操作系统来完成。最外面还加了一层nginx,它对js等静态小文件的效率效率非常的高,而且也支持多种负载均衡的协议(不明白为什么要搞好几层负载均衡)。在负载均衡环节,同一个session(一个用户的连续多次请求)不一定落在一个机器上,但是保证落在一组机器,而不是任意一台机器上(三种方案各有优劣,均衡考虑,但是实现复杂性也增加了)。使用heartbeat来保证单点服务的高可用性。使用php-fpm。fk-w3-agent: 运行于每一台web机器上的小型的java daemon,实现php本身不适合完成的异步log、连接池、多线程等、(准)实时配置更新和部署、运行时数据统计。"There are only two hard things in computer science: cache invalidation and naming things."

Beyond PHP: php没能做到的,很多杂碎和坑,可以看看。
Sep 13
用了一段时间的微信,有一些语音消息,想导出来到电脑上,但是全都是aud扩展名的,没有找到可以用的播放器(QuickTime和Foobar2000都搞不定),格式转换也不行(aud2wav, audacity),估计这个"aud"是另一种"aud",给微信团队发了消息,木有得到回复,只好自己动手。

真的是动手噢……前一阵买的Edifier M178配有一根公对公的音频线,正好可以用来做LineIn。可是LineIn接口在后面,所以干脆插到前置的Mic口上面(其实我很好奇LineIn和Mic口是不是真的有区别),然后打开GoldWave把声音一段一段录下来。好在这种东西没啥音质可言,能录下来就行。

owali.
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]