WeEngine源码分析(1) – 余璜的技术博客 – 博客频道 – CSDN.NET

我以前一直自学linux,但是工作中一直没用过,进入诺西干了三年半,所有产品都是在linux上面运行和开发,终于有机会彻底接触linux了,以前对linux模糊的理解,在一个又一个项目中磨练,当入门Linux后发现,其实linux并不是很难,不过还是有点技巧,根据我的经验和知识总结下,供大家参考和学习.1.第一个误区是文件系统的认识,中国学计算机基本上都是从windows开始的,一到linux

来源: WeEngine源码分析(1) – 余璜的技术博客 – 博客频道 – CSDN.NET

这是关于WeEngine的第一篇文章。欲善其事,先利其器,这篇文章先不做源码分析,而是先把一些辅助的结构建立起来。

一,日志系统

  1. data/config.php
  2. $config[‘setting’][‘development’] = 1;

有了日志之后,调试将会事半功倍。打印日志的方法:

  1. source/modules/engine.php
  2. public static function logging($level = ‘info’, $message = ”)
  3. 其中level可以是任意字符串。推荐使用error,warn,info,trace几个字符表示不同级别。例如:
  4. WeUtility::logging(‘warn’, ‘Request Failed’);

日志输出样例:

  1. 2014-04-03 19:57:30 trace :
  2. ————
  3. Array:
  4. from : otP7TjgEgLrOKzp9TGuMx6x;
  5. to : gh_765067e402 ;
  6. time : 1396526250 ;
  7. type : CLICK ;
  8. event : CLICK ;
  9. tousername : gh_765067e402 ;
  10. fromusername : otP7TjgEgLrOKzp9TGuMx6x ;
  11. createtime : 1396526250 ;
  12. msgtype : event ;
  13. eventkey : huodongzhaoji ;
  14. 2014-04-03 19:57:30 params :
  15. ————
  16. Array:
  17. module : default ;
  18. rule : -1 ;
  19. 2014-04-03 19:57:30 response :
  20. ————
  21. Array:
  22. FromUserName : gh_765067e402 ;
  23. ToUserName : otP7TjgEgLrOKzp9TGuMx6x ;
  24. MsgType : news ;
  25. ArticleCount : 2 ;
  26. Articles : Array ;

调试时,可以用下面的命令持续观察日志最新输出:

  1. tailf data/logs/xxxxxxx.log

 

二,全局变量

  1. source/bootstarp.api.inc.php
  2. global $_W;

此乃WeEngine精华所在。下面分述各个字段。

  1. $_W[‘account’]
  1. $SQL = “SELECT * FROM ” . tablename(‘wechats’) . ” WHERE `hash`=:hash LIMIT 1″;
  2. $_W[‘account’] = pdo_fetch($SQL, array(‘:hash’ => $_GPC[‘hash’]));
  3. $_W[‘account’][‘default_message’] = iunserializer($_W[‘account’][‘default_message’]);
  4. $_W[‘account’][‘access_token’] = iunserializer($_W[‘account’][‘access_token’]);
  5. $_W[‘account’][‘payment’] = iunserializer($_W[‘account’][‘payment’]);

wechats表记录的是公众账号信息,如下图所示。WeEngine比较强大的地方之一是可以管理多个公众号。每个公众号都有一个唯一标示id:weid。下例中只存了一个公众号,weid编号为1.


从上面的代码中可知$_W[‘account’]中保存了公众号的所有信息。其中default_message、access_token、payment三个参数是以序列化的方式存入到wechats表中,所以读出的时候需要反序列化一下。
对于微信和易信分别使用了不同的序列化类,见source/class/weixin.account.class.php fetch_token():
  1. if (empty($this->account[‘key’]) || empty($this->account[‘secret’])) {
  2.     message(‘请填写公众号的appid及appsecret, (需要你的号码为微信服务号)!’, create_url(‘account/post’array(‘id’ => $this->account[‘weid’])), ‘error’);
  3. }
  4. $url = “https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->account[‘key’]}&secret={$this->account[‘secret’]}”;
  5. $content = ihttp_get($url);
  6. if(is_error($content)) {
  7.     message(‘获取微信公众号授权失败, 请稍后重试!错误详情: ‘ . $content[‘message’]);
  8. }
  9. $token = @json_decode($content[‘content’], true);
  10. if(empty($token) || !is_array($token) || empty($token[‘access_token’]) || empty($token[‘expires_in’])) {
  11.     message(‘获取微信公众号授权失败, 请稍后重试! 公众平台返回原始数据为: <br />’ . $content[‘meta’]);
  12. }
  13. $record = array();
  14. $record[‘token’] = $token[‘access_token’];
  15. $record[‘expire’] = TIMESTAMP + $token[‘expires_in’];
  16. $row = array();
  17. // 序列化token,并更新到数据库中
  18. $row[‘access_token’] = iserializer($record);
  19. pdo_update(‘wechats’$rowarray(‘weid’ => $this->account[‘weid’]));
  20. return $record[‘token’];
还有几个变量很重要,源码中会经常遇到,用到的时候再详细介绍。
  1. $_W[‘account’][‘modules’] = array();
  1. $_W[‘setting’] = (array)cache_load(“setting”);
  1. $_W[‘config’]

还有个特别常见的:$_W[‘fans’],详见source/bootstarp.mobile.inc.php。首先从cookie中读出 __msess变量,然后就可以计算出fans的唯一id了。浏览器关闭后这个cookie变量就会自动消失。即使取消了对微信号的关注,只要没有关闭过 微信,则一些需要权限的URL还是可以在一段时间内打开。

We7官方关于全局变量有更详细的描述,详见这里

参考链接

分享到: 更多 (0)