分类目录归档:PHP

关于ip2long和MySQL的Bigint

今天小于在看有熊吐槽列表的时候发现了一个问题,有一些ip显示的是127.255.255.255这个值,显然,这个是一个保留地址,不是正确的用户IP,于是查找了一下原因。

问题出在PHP的ip2long方法在32位系统和64位系统上的表现不一致,在64位系统上ip2long对一部分IP计算后返回的整数大小超出了MySQL原先IP字段int(11)的上限2147483647,MySQL在对待溢出的整数值时采取了存入int(11)上限值的方式,于是那些超出范围的ip就被存成了2147483647。这时候用long2ip方法从MySQL中取回2147483647,计算得到的ip就是127.255.255.255这个错误的IP。

解决的方法有好几种,我现在选取了用Bigint字段代替Int(11)的方式来处理,暂时没有发现问题。

累了,也要坚持着。有熊就要来了。

不知不觉,又加班过了十一点,末班的地铁二号线已经木有了。刚刚弄完一个功能,样式需要明天找东伟调整。

肩膀开始酸了,意味着最近我太疲劳了,渴望能够休假,身体实在要吃不消了。

再加把劲,有熊上线后,能放松一下吧,也许。

只能打车回去了,大家,晚安。

curl伪造reffer抓取图片资源的方法

为了给同事批量抓一些素材,写了段程序,自动抓100多个页面的5000多张图,对方站点防盗链开启了,只能用图片所在页面地址做reffer才能抓图,于是用curl伪造reffer。函数贴出来,备忘,函数本身可以模仿Baidu蜘蛛,由同事乐乐友情提供,我稍稍修改了一下,感谢一下乐乐同学。

function baiduSpider($url,$reffer){
        $ch = curl_init();
        $user_agent = “Baiduspider+(+http://www.baidu.com/search/spider.htm)”;//这里模拟的是百度蜘蛛     
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_REFERER, $reffer);//这里写一个来源地址,可以写要抓的页面的首页     
        curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
        $temp=curl_exec($ch);
        return $temp;      
}

解决客户端IE默认设置下无法下载https协议传输的文件的问题

如下代码,ie无法下载

header(‘Content-type: application/’ . $fileType);

header(‘Content-Disposition: attachment; filename=”‘ . $fileName . ‘”‘);

readfile(SOFT_DIR . $fileName);

加了一些header后就可以了

如下:

header(‘Content-type: application/’ . $fileType);

header(‘Content-Disposition: attachment; filename=”‘ . $fileName . ‘”‘);

header(‘Expires: 0’);

header(‘Pragma: public’);
header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0’);

header(‘Cache-Control: public’);

readfile(SOFT_DIR . $fileName);

原因是默认的IE7通过HTTPS下载时,其cache缓存是不给权限的。所以,必须先要对cache进行配置和给其权限。

另外,也可以通过修改客户端的配置来达到目的.

学到一个函数clearstatcache()

用PHP在做图片缩略的时候,原图被我缩略后以相同的路径,相同的文件名存放缩略图。在缩略前,我读取了原图的文件大小,缩略后我用filesize()函数获取缩略后的文件大小总是不对,读出来总是缩略前原图的大小,当时猜想可能被系统缓存了,后来Google之才知道,PHP文件操作的时候,如果在一个脚本中会对同路径的同名文件进行操作,PHP会缓存文件的相关信息,以提升速度。在对同一个文件做更改,删除等操作后如果需要获取此文件信息,就必须调用clearstatcache()来清除系统文件信息缓存。摘抄一下PHP函数文档:

说明
void clearstatcache ( void )
当使用 stat(),lstat() 或者任何列在受影响函数表(见下面)中的函数时,PHP 将缓存这些函数的返回信息以提供更快的性能。然而在某些情况下,你可能想清除被缓存的信息。例如如果在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险时,你需要清除文件状态缓存。这种情况下,可以用 clearstatcache() 函数来清除被 PHP 缓存的该文件信息。

必须注意的是,对于不存在的文件,PHP 并不会缓存其信息。所以如果调用 file_exists() 来检查不存在的文件,在该文件没有被创建之前,它都会返回 FALSE。如果该文件被创建了,就算以后被删除,它都会返回 TRUE

Note: 本函数缓存特定文件名的信息,因此只在对同一个文件名进行多次操作并且需要该文件信息不被缓存时才需要调用 clearstatcache()。

受影响的函数包括 stat(),lstat(),file_exists(),is_writable(),is_readable(),is_executable(),is_file(),is_dir(),

is_link(),filectime(),fileatime(),filemtime(),fileinode(),filegroup(),fileowner(),filesize(),

filetype() 和 fileperms()。

新项目又来咯……妖子们,期待吧

回到座位上,看着新邮件的提示,点开,trac系统自动发送的,雷哥切完页面了,我要开工啦。

加上不董君9页的需求文档,国庆前一天的Deadline。看来之前我预计的真没错,十一前是闲不下来了,杯具呀。

上了CDN后,服务器那边表现还算不错,服务器集群不出问题我就轻松多了,确实有段时间没有正儿八经写网站的程序了,恢复恢复手感,嘿嘿。

妖气加油,妖子赛高!

PS:昨天还是做了个挺有用的东西,Cacti的插件demo,用来通过监控机远程在集群的其他机器上执行命令的WebShell,只写了雏形,忙完这个项目就好好完善一下,X君对这个插件demo还是抱有很大期望的,当然,我自己也是。发个开发版截图,请无视一个从来不会用PS的人–我自己用CS5改的那个logo以及Shell上方输出的调试信息…..