03
Jan
January 3, 2016 分类: PHP/MySQL     作者: hoverlees     留言: 发表

由于微信平台对获取token有限制,而且每次获取的token不一样,需要对获取到的token,ticket之类的数据进行服务器全局保存,而且有7200秒的限制,如果token不同步或超时,会导致相关接口不可用.
对于java这类语言而言,维护全局变量是很简单的事,但是PHP做全局一直是个麻烦事,需要借助第三方的功能才能实现,如数据库,缓存,文件系统等,我这里提供一种文件系统全局保存ticket的方式,对单台服务器有效,如果要用在多台服务器上,可以实现成一个http接口给其他服务器获取token

下面是PHP代码

<?php
//weixin.php
//全局保存ticket和token,系统中的所有获取token的地方通过引用该文件
//注意:需要保证该php文件可以读写同目录下的lock,_weixin_tickets.php两个文件.
$cdir=dirname(__FILE__);
$file=$cdir.'/lock';
if(!file_exists($file)) touch($file);
$lock=fopen($file,'w');
flock($lock,LOCK_EX);

$tokenFile=$cdir.'/_weixin_tickets.php';
$ticketData=include($tokenFile);
//如果token超时,更新token
if(time()-$ticketData['time']>=7100){
    $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=myappid&secret=mysecret";
    $datas=json_decode(file_get_contents($url));

    $ticketData=array(
        'access_token'=>$datas->access_token,
        'time'=>time()
    );
    $token=$ticketData['access_token'];
    $rdata=file_get_contents("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$token}&type=jsapi");
    $datas=json_decode($rdata);
    $ticketData['ticket']=$datas->ticket;

    unlink($tokenFile);
    file_put_contents($tokenFile,"<?php\nreturn ".var_export($ticketData,true).";");
}

flock($lock,LOCK_UN);
fclose($lock);

return $ticketData;

如果需要多个服务器共享token,可以某一台服务器实现一个内部http接口,引用该文件,输出token等信息,如下示例

//内部api
<?php
$ticketData=include("/path/to/weixin.php");
echo json_encode($ticketData);
11
Jun
June 11, 2014 分类: PHP/MySQL     作者: hoverlees     留言: 发表

验证码的出现是为了防止电脑程序模拟人工操作,实现批量,快速的数据请求. 一般验证码按以下流程开发:
1. 表单页面请求验证码图片生成程序
2. 验证码生成程序随机生成一个验证码,保存到服务器session中,并将验证码按一定随机规则画到一张图片上,返回给页面
3. 如果用户看不清,请求换一张,跳到步骤1,如果用户看得清,输入验证码,提交表单,跳到步骤4
4. 表单处理程序判断用户输入的内容跟session中保存的验证码是否一致,如果一致,通过数据提交,如果不一致,回到步骤1,要求重新填写.

看似简单的几个步骤,实现时却要注意以下两个问题:
1.验证码自动识别问题
这个是最容易想到的问题,机器通过图像识别,仍然可以得到验证码内容.一般验证码识别通过将图片二值化,降噪后,再进行特征提取,根据特征来对应具体的字符,所以简单的验证码操作根本就难不到计算机,以至于现在好多的验证码加了很多扭曲和添加杂色杂线的工作,甚至用了汉字来增加难度.只有这样做才会有效果.
对于机器识别的防治,最好是走正统方式,建议不要自己随便想一种机制就拿来应用,有可能我们想到的办法别人一下子就找到了很简单的识别方式.记得以前我就遇到一个游戏的验证码,是点击图片中只出现过一次的物品的区域,其他物品都出现过多次,感觉好像很难破的样子,其实只要把图片中的颜色进行分组,出现次数最少的那一组所在的区域就是需要点击的区域…
防制机器识别,还有一种办法是多做几套识别码,关键时刻换着用.对于像12306这样的网站非常合适,比如一年内做个10套验证码,平时用第一套,春运的时候换着用其他9套,让刷票软件花好多心思做出来的识别程序最终毫无用处.

2.验证码刷新时间问题
这个是很容易忽视的问题,特别在做抢有限资源的功能的验证码时要注意.比如12306的抢票或淘宝的抢购功能的验证码.操作方式就是提前通过验证码的链接获得验证码图片,并把验证码准备好(例如打好后复制起来),当开抢时,不加载新的验证码图片,直接提交开抢之前准备好的验证码,如果程序没有注意到时间问题,就会认为该验证码有效,从而达到”快速输入验证码”的效果.
对于这种情况,生成验证码保存session的时候,可以多保存一个刷新时间,当用户提交验证时,判断如果这个验证码是在开抢之前生成的,则此次验证结果无效.

当然,验证码也有一种无法防止的问题,那就是人工打码.这个也是好多年前就在游戏行业出现的服务,软件通过将验证码传输到打码团队某个成员的电脑上,由打码人员输入验证码并回传,程序再自动将验证码输入,这种方式往住有一定的利益关系才能维持下来,所以开发人员也不用太过担心这个问题.

20
Sep
September 20, 2013 分类: DHTML, PHP/MySQL     作者: hoverlees     留言: 发表

Ajax有一个安全特性就是跨域访问的限制问题,虽然有很多解决的方法,但都没有使用代理的方式简单。

后来发现一个更简单的,就是给chrome浏览器添加 –allow-file-access-from-files –disable-web-security 启动参数,即可实现关闭安全检查的功能。

它的这个特性过份到访问同一个域下的不同端由都做了限制。有时候做测试开发很不方便。所以我就自己写了一个php的代理程序,由php接收ajax请求并转发到其他域的服务器,并将结果返回。

proxy.php代码如下:

<?php
error_reporting(0);

$destURL="http://otherdomain.com/to/path/script.jsp";

$queryString=$_SERVER['QUERY_STRING'];
if($_SERVER['REQUEST_METHOD']=='GET'){
    $url=$destURL.$queryString;
    echo file_get_contents($url);
}
else{
    $url=$destURL.$queryString;
    $context = array();
    $context['http'] = array(
        'method' => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => http_build_query($_POST)
    );
    echo file_get_contents($url, false, stream_context_create($context));
}
?>


查看详细内容 »

24
Oct
October 24, 2011 分类: ASM/C/C++, PHP/MySQL     作者: hoverlees     留言: 5

最近有打算给博客做个统计插件,看看都是哪儿来的朋友在看我的博客儿,需要一个详细的IP地址归属地数据库。网上找了个纯真的MySQL版的,30多万条数据占了20M左右的数据库空间,觉得有点浪费数据库空间,而且数据库查询时间太慢,特别是要一次性查多个结果时,更是不得了.最主要的是这种应用场合不适合做成数据库形式的。

所以就准备自己做数据库了,自己也有50000亿条数据的数据文件的设计经验。这才30多万条没什么问题。。。按自己的想法生成了文件,并写了PHP和C语言的访问API,心情好的时候再补写上Java啊,汇编啊什么的API也是挺好的。

数据库下载:GBK版 UTF8版

PHP API(函数):这个是函数形式的PHP代码,博客版面上是写描述,具体代码在这里:ips.php ip_area.php

<?php
/**
 * IP地址归属地查询 PHP函数版
 * @author Hoverlees http://www.hoverlees.com me[at]hoverlees.com
 * @comment 此功能同时包含C/C++,PHP类,PHP函数,等版本提供下载。
 * 数据库文件及相关代码下载地址:http://www.hoverlees.com/blog/?p=906
 */

/*对象状态常量*/
define('IPV4_AREA_ERROR_SUCCESS',0); //正常
define('IPV4_AREA_ERROR_OPENFILE',-1); //无法打开文件
define('IPV4_AREA_ERROR_FORMAT',-2); //数据库格式不对

/**
 * IPv4地址转整数函数,注意本函数不检查IP地址的合法性
 * @param $ip IPv4地址
 * @return 转换后的整数
 */
function ipv4_atol($ip){}
/**
 * 创建IP表对象
 * @param $filename 数据库文件名
 * @param $index_read_parts 索引划分的块数,如果为1,表示索引全部读入内存(占用大约4M内存空间),如果为2则只需要占用4/2=2M内存临时空间。此值越大,需要的内存缓冲越少,但磁盘的IO次数增加。如果需要循环查询多个IP,建议此值设为1.如果只查询一次可以根据内存要求自行设定。
 * @return 用于查询的数据库对象,使用完成后请调用ipv4_area_free释放占用的资源
 */
function ipv4_area_create($filename,$index_read_parts=1){}
/**
 * IP址所在地查询
 * @param $obj 数据库对象
 * @param $ip IP地址,可以为'XXX.XXX.XXX.XXX'格式
 * @return 归属地名称
*/
function ipv4_area_search($obj,$ip){}
/**
 * 释放IP数据库
 * @param $object 由函数ipv4_area_create返回的表对象
 */
function ipv4_area_free($object){}
?>

代码调用示例:


查看详细内容 »

标签: , , ,
25
Feb
February 25, 2011 分类: Flash, PHP/MySQL     作者: hoverlees     留言: 2

最近团购真的是太疯狂,太流行了,但从技术上讲,它却是那么的简单,不过还是有很多网站长愿意花重金去购买团购网站源代码,并自己运营起来,说明这个模式还是挺不错的。

朋友的论坛需要,那我也义不容辞的做了个,架构是这样的,前台使用flash,嵌入到论坛中,然后使用独立的后台程序管理用户的订购,我当然用的也是PHP。

这样的架构是尽量减少论坛修改,把团购模块独立出来的最好办法,只需要在论坛中修改很少量的代码,就可以把团购功能集成进去,而后台的代码,因为以前给这个网站做了世界地图啊,老虎机游戏什么的,后台都有个PHP框架了,所以也简单多了。

界面也是我用fireworks自己画的,虽然也参考了别人的网站,打折牌那一块说我是照抄都不过份,呵呵。但是没办法啊,实在是想不到比打折牌看起来更有意思的界面了,下面是这个flash,这儿把按钮功能去掉了,完整的应用等新功能上线后再把链接加上来。


查看详细内容 »

标签: , ,
19
Dec
December 19, 2010 分类: Flash, PHP/MySQL     作者: hoverlees     留言: 发表

又挤时间做小游戏了,这个游戏创意谈不上,来自一个日本的小游戏,叫什么什么tower来着,被人翻译成是男人就上100层。那游戏中男人使劲时发出的声音,和掉下去后惨叫的声音让人印象很深,哈哈。不过我在他们的创意上加了些小玩意儿,比如说疯狂的石头啦,可以飞啦什么的。高度单位是米。游戏有服务器程序提供支持,可以提交分数,前10名和后10后会直接显示到游戏中,让玩家知道自已到达哪个层次了。如下图所示。

不多说了,flash传上来了。


查看详细内容 »

标签: , , ,
20
Nov
November 20, 2010 分类: DHTML, PHP/MySQL     作者: hoverlees     留言: 3

现在看来内容也差不多了,准备把博客脱离我的cent os,发布到互联网上去了。这个主题还是感觉不是很满意,自己已经尽力了,虽然看起来还是不大搭配。目前测试的浏览器有IE6,IE8,Opera,Firefox,效果都达到预期。下周到公司去看看其它的浏览器效果。在我的印象中,我的css写法好像不大适应google流览器。

网页做成wordpress主题倒还很简单,wordpress的框架还是挺不错的。个人觉得模板这儿没自己写的PHP框架好,至少我写的MVC框架,标签是订制的,而不是让美工去嵌入PHP代码,呵呵,自恋一下,其实这个是习惯问题而已。

标签:
17
Nov
November 17, 2010 分类: DHTML, PHP/MySQL     作者: hoverlees     留言: 发表

我的目的就是要实现跟iGoogle一样的概念,可以由用户订制自己的展示界面,用户想看什么就订制什么模块,谁用谁赞。

为节约开发效率(主要是省自己的事儿~),前台的窗口拖动方面的功能是基于iNettus的,而iNettus又是基于jQuery的。不过为了实现自己的附加功能,我还是改了iNettus的类,以便可以与PHP交互。

窗口的创建和删除都是要通知服务器的,因为需要服务器来保存用户的订制信息,另外还有订制模块的一些列交互,大多数交互都是通过ajax实现的,正好又是jQuery的功能,省了。


查看详细内容 »

17
Nov
November 17, 2010 分类: ASM/C/C++, PHP/MySQL     作者: hoverlees     留言: 8

中文分词,是程序对中文语义的分析的第一步,把一个句子按语法语义分成多个词语,便可方便进行下一步的处理。中文分词在中文搜索引擎方面广泛应用,还可以应用在聊天机器人、信息自动搜集等很多方面。

记得我的毕业设计就是中文搜索引擎,当时自己只用PHP实现了正向最大匹配分词法,效率不是很高,而且分出来的词也不是很精确(不过最简单,哈哈)。但对于一个毕业设计来说,这样已经足够了。但要对一个实际应用来说,分词肯定要越精准越好。中科院的ICTCLAS中文分词库,应该是最好的选择。

这个组件是因为PHP需要用到ictclas分词功能,但官方只提供dll版本,那就有两种方式,一种是封装成php模块,另一种就是封装成com组件了。既然是运行在windows上的,就决定装成com了。

组件提供3函数,init,split,exit.具体看例子一下子就知道了。


查看详细内容 »

标签: , ,
21
Sep
September 21, 2010 分类: Flash, PHP/MySQL     作者: hoverlees     留言: 发表

这个是前一个帖子里大家来找茬游戏的编辑器,要成为它的用户,前提是你会使用ps ,fw,gimp等软件之一。阿拉也不强求谁都来使用它啦,呵呵 ,估计只有我这么一个用户。呵呵。

游戏的链接在这里


查看详细内容 »

快速链接
推荐标签
最新图片
较新文章
随机推荐
友情链接