CI框架同意你在不改动系统核心代码的基础上加入或者更改系统的核心功能(如重写缓存.输出等). 比如,在系统开启hook的条件下(config.php中$config['enable_hooks'] = TRUE;).通过加入特定的钩子,能够让系统在特定的时刻触发特定的脚本: $hook['post_system'] = array( 'class' => 'frameLog', 'function' => 'postLog', 'filename' => 'post_system.php…
从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就很诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源代码阅读笔记2 一切的入口 index…
上一篇博客(CI框架源代码阅读笔记4 引导文件CodeIgniter.php)中.我们已经看到:CI中核心流程的核心功能都是由不同的组件来完毕的.这些组件类似于一个一个单独的模块,不同的模块完毕不同的功能,各模块之间能够相互调用,共同构成了CI的核心骨架. 从本篇開始,将进一步去分析各组件的实现细节.深入CI核心的黑盒内部(研究之后.事实上就应该是白盒了,只对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 依照惯例.在開始之前.我们贴上CI中不全然的核心组件图: 因为BenchM…
上一节(CI框架源代码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程.这里再次贴出流程图.以备參考: 作为CI框架的入口文件.源代码阅读,自然由此開始. 在源代码阅读的过程中,我们并不会逐行进行解释.而仅仅解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development能够是不论什么你喜欢的环境名称(比方dev,再如test).相相应的,你要在以下的switch c…
CI框架允许你在不修改系统核心代码的基础上添加或者更改系统的核心功能(如重写缓存.输出等).例如,在系统开启hook的条件下(config.php中$config['enable_hooks'] = TRUE;),通过添加特定的钩子,可以让系统在特定的时刻触发特定的脚本: $hook['post_system'] = array( 'class' => 'frameLog', 'function' => 'postLog', 'filename' => 'post_system.php'…
原文见这里:http://www.cnblogs.com/ohmygirl/p/CIRead-7.html 一个灵活可控的应用程序中,必定会存在大量的可控參数(我们称为配置),比如在CI的主配置文件里(这里指Application/Config/Config.php文件),有例如以下多项配置: $config['base_url'] = 'http://test.xq.com'; $config['index_page'] = ''; $config['uri_protocol'] = 'AUT…
Mongodb源代码阅读笔记:Journal机制 Mongodb源代码阅读笔记:Journal机制 涉及的文件 一些说明 PREPLOGBUFFER WRITETOJOURNAL WRITETODATAFILES REMAPPRIVATEVIEW 涉及的文件 mongoDB中和持久性相关的文件只要有以下几个: dur.h: dur.cpp,dur_preplogbuffer.cpp,dur_writetodatafiles.cpp ,dur_commitjob.h: dur_commitjob.…
Spark源代码阅读笔记之DiskStore BlockManager底层通过BlockStore来对数据进行实际的存储.BlockStore是一个抽象类,有三种实现:DiskStore(磁盘级别的持久化).MemoryStore(内存级别的持久化)和TachyonStore(Tachyon内存分布式文件系统级别的持久化). DiskStore通过DiskBlockManager来实现Block和相应磁盘文件的映射关系,从而将Block存储到磁盘的文件里.DiskBlockManager依据YA…
这篇文章主要介绍了关于框架Thinkphp5 简单的实现行为 钩子 Hook,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 实现在一个方法开始和结束加入两个行为:api_init.api_end 框架的搭建和模块的建立这里就省略了,请不太熟练的同学自行学习. 下面直接进入步骤: 1,先创建一个行为类 \application\api\behavior\AopTest.php <?php namespace app\api\behavior; //行为类 class AopTest…
三.源代码阅读 3.元素包括containsKey(Object key) /** * Returns <tt>true</tt> if this map contains a mapping for the * specified key. * * @param key The key whose presence in this map is to be tested * @return <tt>true</tt> if this map contain…
这是win32下的结构 从ruby_setup开始阅读 Ruby对象内存结构 RVALUE是一个union,内含ruby所有结构体(RBasic RObject RClass RFloat RString RArray RRegexp RHash RData RTypedData RStruct RBignum RFile RNode RMatch RRational RComplex)以及用于gc的free结构.RVALUE是object space heap的最小单元.ruby及C扩展通常用…
我认为我已经养成了一个坏习惯.在使用一个框架过程中对它的内部原理非常感兴趣,有时候须要花不少精力才 明确,这也导致了学习的缓慢,但换来的是对框架的内部机理的熟悉,正如侯捷所说,源代码面前,了无秘密.这也是 本文产生的直接原因. 一.flask session原理 flask的session是通过client的cookie实现的.不同于diango的server端实现,flask通过itsdangerous这个苦 将session的内容序列化到浏览器的cookie,当浏览器再次请求时将反序列化co…
<?php /* [Discuz!] (C)2001-2007 Comsenz Inc. This is NOT a freeware, use is subject to license terms $Id: common.inc.php 10344 2007-08-27 02:36:30Z monkey $ */ /* 说明: Discuz!核心文件阅读: */ error_reporting(0); //对脚本的错误回显作了屏蔽,参数“0”的意思量关闭所有级别的错误报告. set_magi…
安装Xhprof参考:http://www.cnblogs.com/qq917937712/p/8889001.html 第一步:配置config.php $config['enable_hooks'] = TRUE; 第二步:配置钩子 ci钩子使用手册:http://codeigniter.org.cn/user_guide/general/hooks.html $hook['pre_controller'] = array( 'class' => 'Xhprof', 'function' =…
最近阅读了部分MySQL排序的代码,把心得记录一下. 参考代码 MySQL: 文件: filesort.cc 函数: filesort() 排序过程伪代码 function filesort(table_sort) { param.init_for_filesort(); //是否可以使用优先队列加速? if (check_if_pq_applicable()) { // check_if_pq_applicable 已经分配了合适的sort_buffer // 这里初始化sort_buffer…
欢迎訪问:个人博客 写该系列文章的目的是记录Guava源代码中个人感觉不错且值得借鉴的内容. 一.MoreObjects类 //MoreObjects.ToStringHelper类的toString()方法:对于字符串拼接的写法蛮不错的,此前本人一直用比較挫的方式:无论三七二一,先拼接然后再subString() @Override public String toString() { // create a copy to keep it consistent in case value c…
/* 77 * This function frees a continuos block of page tables, as needed 78 * by 'exit()'. As does copy_page_tables(), this handles only 4Mb blocks. 79 */ int free_page_tables(unsigned long from,unsigned long size)//size以B为单位而不是以页表为单位 { unsigned long…
/* 34 * Get physical address of first (actually last :-) free page, and mark it 35 * used. If no free pages left, return 0. 36 */ unsigned long get_free_page(void) { register unsigned long __res asm("ax"); __asm__("std ; repne ; scasw\n\t&q…
1. man exec就可以知到: The exec() family of functions replaces the current process image with a new process image exec是没有创建新进程的,而是把当前进程对应的应用换成新的应用.因此,它里头当前不会去fork了. 2. 这个进程就是执行exec的进程,举个例,如果PID=1000的进程A, 执行ecec B, 那就PID=1000的进程就会变为B,A的资源会被系统回收.对Exec函数来说,没…
78 static struct buffer_head * find_entry(struct m_inode * dir, 79 const char * name, int namelen, struct dir_entry ** res_dir) find_entry是linux文件系统中一个较为费解的函数.下面我们来分析一番. 它的第一个参数是 m_inode型,它指示了函数操作的所在根目录的inode节点.即相对路径的起始节点. name自然是想要查找的目录路径,namelen是该目…
当系统申请一个新的inode时.系统并不会对磁盘进行读写.它会在存储在内存的inode表(inode_table)中寻找一个空闲的位置. 如果找到了,直接返回该inode.否则要等待一个空闲的位置. 得到一个空闲的位置后,检查dirty位,如果dirty,那么需要写回磁盘. 但是注意,系统并不会直接对磁盘进行操作.而是申请一个高速缓冲块,对该高速缓冲块进行操作. ps:为了弥补cpu与磁盘之间巨大的速度差距.系统所有的对磁盘的读写操作都不会直接操作磁盘,而是操作高速缓冲区. 高速缓冲区再和磁盘进…
上一篇文章说到linux文件系统中分为超级块,inode块,block块.inode块给出文件的权限,修改时间,大小等信息. 但是实际上,文件的数据是存储在block块中的.而inode块中给出了存储文件数据的block的编号.每个inode和block都有编号.文件系统一开始就将inode与block规划好了 block块,inode块,超级块在物理上并无区别.大小一致. 在linux上新建一个目录的过程: 当我们在ext2文件系统上新建一个目录时,ext2会分配一个inode与至少一块blo…
linux文件系统:   操作系统的文件数据除了文件实际内容外,还有非常多的属性,如文件权限(rwx)与文件属性(所有者.群组.时间参数等).   文件系统通常将这两部分数据存放在不同的块.权限属性放到 inode 中,实际数据放到 data block 中. 还有一个超级块(super block)会记录文件系统的整体信息,包括 inode 与block 的数量.使用量等.     inode:记录文件属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码:   block…
高速缓冲区是文件系统访问块设备中数据的必经要道,为了访问文件系统等块设备上的数据,内核可以每次都访问块设备,进行读写操作. 为了提高系统性能,内核在内存中开辟一个高速数据缓冲区.在Linux内核中,高速缓冲区位于内核代码和主内存之间. 当需要从块设备中读取数据时,先到高速缓冲区中寻找,若找不到,就发出读块设备命令,块设备将数据写入高速缓冲区中. 高速缓冲区划分为块,每块的大小恰好和硬盘中的存储单元相同. Linux中,高速缓冲区的实际组织形式较为复杂. 首先看它的结构体: 56 struct b…
c语言中,众所周知,以0x开头的数是16进制数.例如 0x8FFF 然而较少使用的是八进制数.它以0开头.例如 01234…
DB 管理数据库的类 file_entry:dir page的元素,保存不同文件对应的page directory_page:dir page的专用结构体,里面有个初始长度为0的variable sized array用来保存file entry first_page:保存整个数据库的信息,包括整个数据库有多少page和dir page的结构体 整个数据库构造是这样的:整个数据库是一个超大文件,第0页是header page,包含整个数据库的全局信息:第1页是dir page,后面的page保存…
BufDesc frame 们的 descriptor(见BufHashTbl注释),包括 pageNo: 这个 frame 在文件里的id,page number prevframe: -1 表示此 frame 为空,如果是hash slot的第一个则为 slot number,否则就是前一个 frame的frame number 注意 frame number 是在 buffer pool 里的 id,page number 是在文件里的 id nextframe: 下一个 frame 的…
Heapfile 用来管理heap file里的dir page们 成员 _firstDirPageId:这个文件的第一个dir page _ftype:文件类型 _file_deleted:删除的时候用的falg _fileName:文件名 方法 HeapFile:接收名字,如果是null就开个临时的heapfile(离开的时候会被destructor干掉),否则打开已有文件or创建新文件 先假设文件已经被干掉,设置filedeleted与_fileName 如果name是null,起一个临时…
HFPage heap file的page的类 成员 slot_t:用来表示页里的slot,包括offset和length slot[]:倒着生长的slot array slotCnt:有多少已用slot,注意是倒着数的 freePtr:data[]中第一个free的byte的offset freeSpace:data[]里一共有多少free bytes type:里面数据的类型 prevPage,nextPage,curPage:各种page id 方法 init:初始化,设置好一堆变量 in…
MetadataCleaner执行定时任务周期性的清理元数据(metadata),有6种类型的元数据:MAP_OUTPUT_TRACKER.executor跟踪各个map任务输出的存储位置的数据,依据spark.cleaner.ttl.MAP_OUTPUT_TRACKER设置清理时间,默认值为-1,表示不清理.SPARK_CONTEXT.SparkContext中记录缓存到内存中的RDD的数据结构.依据spark.cleaner.ttl.SPARK_CONTEXT设置清理时间,默认值为-1,表示…