Stay hungry, Stay foolish

0%

runtime.php里的程序跑完后就加到了ThinkPHP.php里,ThinkPHP.php跑完后就加到了入口文件index.php里了。接下来印到眼前的是:

1
App::run();

App就是框架的Core目录下的App.class.php,由上一节可以知道,在编译~runtime.php文件时它就被加载并编译到缓存里了。这个App可以理解为应用启动器。它有哪些东西呢?

  • init、build、exec、run这几个方法构成了这个“程序”的执行流程

  • getGroup、getModule、getAction获取分组名、模块名、操作名

  • appError、appException 自定义的错误处理和异常处理

  • checkLanguage、checkTemplate 语言检查、模板检查

Read more »

build_runtime()在TP里的注释是“生成核心编译缓存”,位于框架的Common目录下的runtime.php文件中。这个文件包含了四个函数:

  • build_runtime
  • mkdirs 批量创建目录。
  • build_app_dir 创建项目目录结构:
Read more »

先从THINK_PATH.’/ThinkPHP.php’这个公共文件开始吧。预览一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//记录开始运行时间
$GLOBALS['_beginTime'] = microtime(TRUE);
if(!defined('APP_PATH')) define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']));
if(!defined('RUNTIME_PATH')) define('RUNTIME_PATH',APP_PATH.'/Runtime/');
if(defined('RUNTIME_ALLINONE') && is_file(RUNTIME_PATH.'~allinone.php')) {
// ALLINONE 模式直接载入allinone缓存
$result = require RUNTIME_PATH.'~allinone.php';
C($result);
// 自动设置为运行模式
define('RUNTIME_MODEL',true);
}else{
if(version_compare(PHP_VERSION,'5.0.0','<')) die('require PHP > 5.0 !');
// ThinkPHP系统目录定义
if(!defined('THINK_PATH')) define('THINK_PATH', dirname(__FILE__));
if(!defined('APP_NAME')) define('APP_NAME', basename(dirname($_SERVER['SCRIPT_FILENAME'])));
if(is_file(RUNTIME_PATH.'~runtime.php')) {
// 加载框架核心编译缓存
require RUNTIME_PATH.'~runtime.php';
}else{
// 加载编译函数文件
require THINK_PATH."/Common/runtime.php";
// 生成核心编译~runtime缓存
build_runtime();
}
}
// 记录加载文件时间
$GLOBALS['_loadTime'] = microtime(TRUE);
Read more »

用THINKPHP也有了段时间了(TP2,现在3.0版已经出了),自我感觉用的还算熟练,但是对于内部结构,代码的组织还不甚了了。抽空把它好好研究研究吧。

先来看引导程序index.php:

1
2
3
4
5
6
7
8
define('THINK_PATH','./ThinkPHP');

define('APP_NAME','App');
define('APP_PATH','./App');
define('STRIP_RUNTIME_SPACE',false);
require(THINK_PATH.'/ThinkPHP.php');

App::run();

TP的入口文件,可以更加简单的写作:

1
2
require(THINK_PATH.'/ThinkPHP.php');
App::run(); //这个感觉上像“小鸡,快跑!”
Read more »

程序如下:

1
2
3
4
5
6
$ctx = stream_context_create();
$pem = dirname(__FILE__) . '' . 'ck20120130.pem';
stream_context_set_option($ctx, 'ssl', 'local_cert', $pem);
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
$fp = stream_socket_client($serverUrl, $err, $errstr, 60,
STREAM_CLIENT_CONNECT, $ctx);

运行报如下错误:

1
2
3
Warning: stream_socket_client() [function.stream-socket-client]: SSL 运维 failed with code 1. OpenSSL Error messages: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto
Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl

最后检查了一下,发现是$pem地址的问题,改成dirname(_FILE_) . ‘/‘ . ‘ck20120130.pem’就没有问题了。

ROWNUM是记录行数。有时候我们需要在查询某条记录并得到这条记录在其查询结果中是第几条。这样说可以会让看官迷糊,以我接触到的业务来说一下吧:

我需要建一个排行榜,这是没有问题的,只要根据某一条条件进行排序,一个排行榜就出来了。但是这个排行榜还需要一个搜索功能,搜索出某一用户并显示他的排行。

分析一下这个问题:排行榜是实时变化着的,我不可以以某一字段来进行存储,而且数据库基于主-从结构,据说用临时表也不太现实。我就把希望寄托在了ROWNUM上了。Oracle,SQL Server里都有这个,遗憾的是Mysql里没有。但是我们有办法来实现的,不是吗?

1
2
3
set @rownum = 0;

select (@rownum := @rownum + 1) as rownum, name, scores from user order by scores;
Read more »

刚开始我对mysql的事务处理并不是多了解。就在搜索了一番,发现个通病:

大部分用来讲事务的例子都是用银行转账和购买图书,让人觉得事务除了处理这两种东西别无他用。

通过我自己的操作加理解如下:

事务就是一些SQL语句,它们是一个整体,要么全部执行,要么全不执行。

Read more »

这个有什么用?

  • 安全,让攻击者误认为是其它语言;

  • 美观,这个是我写接口的时候体会到的。根据返回的数据类型(json、xml)作为扩展名来处理不同的请求。

Read more »

想让用户通过get或post的方式给页面上动态添加视频模块,却让chrome给弄成空白了。

源程序用post提交,smarty显示页面,这里我用get写个简易的demo做个演示

demo:

1
2
$dyn = $_GET['conentent'];
echo $dyn;

在chrome中输入:

http://localhost/test/test.php?content=%3Cembed%20src=%22http://www.tudou.com/v/cBrn6BmNpXI/v.swf%22%20type=%22application/x-shockwave-flash%22%20allowscriptaccess=%22always%22%20allowfullscreen=%22true%22%20wmode=%22opaque%22%20width=%22470%22%20height=%22367%22%3E%3C/embed%3E

(conent内容是土豆上弄的一个embed标签)

chrome中显示空白:

src变成了about:blank, type的值也没有了。

Read more »