Stay hungry, Stay foolish

0%

exec方法

1
2
$tagOn   =  C('APP_PLUGIN_ON');
if($tagOn) tag('app_run');

扩展标签是否开启,如果开启的话,在此加一个app_run的标签扩展。

1
2
3
//创建Action控制器实例
$group = defined('GROUP_NAME') ? GROUP_NAME.C('APP_GROUP_DEPR') : '';
$module = A($group.MODULE_NAME);
阅读全文 »

曾经和一朋友聊框架的时候,总结道:

框架其实就是MVC结构、URL路由、数据库驱动、模板引擎的结合。

想来想去也确实没什么东西。由此可见URL在框架里的地位,但是说它重要,它又不是那么重要,为什么呢?

第一,它没有多少,第二,它的作用也就是美化URL。仅此而已。

阅读全文 »

build()方法

build方法用来生成项目的编译文件(app.php)或者ALLINONE模式下的allinone.php文件。

1
2
3
C(include THINK_PATH.'/Common/convention.php');
if(is_file(CONFIG_PATH.'config.php'))
C(include CONFIG_PATH.'config.php');

首先加载框架的配置文件和项目配置文件。项目配置文件可以为空,为空的话不加载。

阅读全文 »

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 语言检查、模板检查

阅读全文 »

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

  • build_runtime
  • mkdirs 批量创建目录。
  • build_app_dir 创建项目目录结构:
阅读全文 »

先从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);
阅读全文 »

用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(); //这个感觉上像“小鸡,快跑!”
阅读全文 »

程序如下:

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;
阅读全文 »