左脚地狱,右脚天堂,我在人间。我永远也不会知道,在下一刻,我是遇到一个人,还是错过一个人。

CodeIgniter的工作过程(1)

2010年5月12日

CodeIgniter是一个小巧优雅的php开源框架,遵循MVC模式,兼容php4、php5版本,目前CI的最新版本是1.5.3,本文旨在描述CI的从客户端请求到渲染结束的工作过程。

  • CodeIgniter的文件结构

CI的文件结构如下图所示:

cache用以存储缓存文件,codeigniter文件夹包含了CI的基类CI_Base,为了兼容php4和php5,CI_Base有两个版本,其中php4版本的CI_Base继承于CI_Loader。libraries里存放了大部分常用的类库,最主要的三个类:Model,View和Cotronller,自己写的任何mvc都要继承于已有的mvc类;helpers里是一些函数(方法)集合,用以辅助其他模块的方便工作。language是一个语言包,用以支持多语言。

application文件夹用以存储您的应用程序,CI已经在内部为您增加了一些子文件,包括models、views、controllers、config、errors、hooks和libraries。其中前三个文件夹是用以创建模型、视图和控制器的。您的大部分工作都应该是创建属于自己的MVC,并可在config里加入配置文件,libraries里加入一些对象和方法,用来辅助您的模型和控制器工作。而hooks也是对CI_Hooks的扩展,具体内容见下面的章节。

  • CodeIgniter的工作过程

当有一个http请求时,如http://www.mysite.com/blog/view,首先进入CI的引导文件index.php。接下来我们看看index.php里做了哪些事情。

index首先设置了应用程序的文件夹名称为application,系统的文件夹名称为system,然后做了一系列严格的判断并转换为unix风格的服务器绝对文件路径,具体说来定义了两个比较重要的常量,APPPATH,应用程序的文件夹路径,根据分析可知,该路径可以和system同级:htdocs/application/,也可以放到system文件夹里面,作为其子文件夹:htdocs/system/application/,但推荐采用第二种方式,这样显得比较整齐;BASEPATH,网站文档的基本文件路径,写出来大概是htdoc/system/;到最后,index引导文件引入了codeigniter/codeigniter.php里。接下来我们看看codeigniter里做了什么事情。

codeigniter.php一上来就引入了三个文件:Common.php,Compat.php和config/constants.php,其中Common里包含了一些函数,用于载入类库的load_class,记录日志的log_message,和引入错误页面的show_404是几个重要的函数;Compat主要解决了php4和php5中的函数不兼容问题,而constants则定义了一些读写文件权限的常量。

紧接着codeigniter载入了第一个类库,Benchmark,这个类库最简单的一个应用就是计算网页从开始到编译结束所花掉的时间,所以您在编译开始的地方打上一个标记,渲染结束后再打上一个标记,就可以算出其中花费的时间了。

接着载入了第二个类库,Hooks,这个类库和Benchmark一样都是在system\libraries下,这个类库的作用是在程序开始编译之前给您提供一个执行其他事情的机会,Hooks会您执行其他任务提供了大约8个机会,具体参见用户指南。在这里,它导入了第一个钩子。

然后分别载入了Config,URI,Router,Output等类库,接着,检查是否有cache_override的钩子,这个钩子可以允许您调度自己的函数来替代Output类的_display_cache方法,如果没有,直接调用Output的_display_cache,检查是否有缓存内容,如果有,则直接输出缓存,退出;如果没有,则接着往下执行。

此后,继续载入Input,Language,注意此前载入的类库都是一个引用;然后又一个重要的载入,那就是CI_Base对象的载入,首先会判断php的版本,如果是php4版本的,则会首先载入Loader,然后载入Base4,因为Base4中CI_Base继承于CI_Loader,而Base5中,CI_Base与CI_Loader没有继承关系。

下一步,也是真正关键的一步了,这一步开始载入了一个Controller类,这个是个实例,而不是引用;然后通过Router来解析http地址,获得控制器和方法的名字,接着看application\controllers里是否存在这样的控制器和方法,如果没有,则报错;如果有,则开始判断。

To Be Continue~

悠久技术 , ,

伟大的梦想很伟大

2009年10月17日

————————————佛曰不可说的分割线————————

有些事我没说但我有感觉
有些事我没说但我知道结果
有些事我没说但你有感觉
有些事我没说但你知道结果

有一天我会插上翅膀飞
有一天我会张开双眼看
有一天我会见到我的梦中有谁
有一天我会飞过世界的背

 蔡淳佳之有一天我会

——————天凉好个秋的分割线—————

6:30,闹钟响起,闹铃是陈小春的你好狠。关掉继续懒床10分钟。

6:40,起床,刷牙洗脸剃胡须梳头四合一,期间打开电视看朝闻天下的国际部分。

6:55,整理包裹,手机钥匙钱包三合一,电脑包一个。

7:00,看电视的天气预报部分,看到上海立马背包走人。

7:15,上车。路过麦田,工业区,两边辽阔的海,填海的平地。

7:55,下车。早餐。

8:30,开始上班。

11:50,午餐。

13:00,小睡。

13:30,开始上班。

17:30,下班,赶班车。

18:30,下车,堵车之后的下车。

20:00,吃完饭,步行若干距离,回家。师姐走的那个慢啊,几乎能以毫米为最大剂量单位了。

20:01~22:00,洗澡洗头洗袜子洗内衣四合一,人称洗之郎。看电视,写工作日志,整理代码若干。

22:30,打算睡觉,或者找个人打电话。

23:00,安眠,安静的睡眠。春梦无边。

—————————期待的回归的分割线—————

一直这样出差,注定是找不到女朋友的。你看,耽误了多少事啊。

首钢的班车走了北线,本来4点半就可以回来了,一直闹到晚上7点才赶回来。小柯小丽和小娣同学早就到了,作为活动的主办方却最后一个出场,有点不厚道了哈。这次聚会主要是给小柯补过生日,以及促成我们多久以来没有的聚会。打车去了小肥羊,人怒多。喝了点小酒,小娣同学买了奶酪蛋糕,吃的喝的都畅快淋漓。

第一杯,为小柯的生日干杯;第二杯,为团圆干杯;第三杯,为梦想干杯;第四杯,为世界和平干杯;第五杯,找不到人了……

相聚总是短暂的,发点感慨是难免的,生活是美好的,道路是曲折的,前途是光明的,我们是在一起的。

和小丽送走小柯和小娣同学,看天空,月朗星稀,云彩格外的轮廓分明。不多久,小娣到家了,发来短信:据我星象观察,你会幸福的。回短信:你的观察是狭隘的,据我星象观察,我们会很幸福的。

悠久心情 ,

如何解决PHP的session cookie错误

2009年8月22日

废话少说,如果你遇到这个错误,Cannot add header information - headers already sent in……  可参阅此文。

发生原因:

根据错误描述,很显然是由于在http的信息头发送出去后,设置了Cookie,这是不对的。因为Cookie在http发送时会写入到它的信息头部,既然发送出去了,当然就不能再设置Cookie了,所以session_start()调用失败。

但你可能说你在某种环境下却可以正常运行,又是为什么呢?这与你的php.ini设置有关。你可能对你的php.ini做了一下设置:

  1. 你关闭了php的错误或警告报告,即error_reporting (E_ALL ^ E_WARNING);这种情况下其实是有报警的,只是没有显示出来而已。
  2. 你打开了输出缓存的开关,即output_buffering = 1;当设置为true时,在脚本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中,等所有脚本都解析完成后再发送,所以你可以在此期间随意设置session,就不会出现问题了。

解决办法:

知道了原因,就比较容易解决了。你可以有以下的解决办法:

  1. seesion_start()一定要用在所有html内容输出之前,简单的说,就是要在<html></html>标签之前写上sessiong_start();
  2. 把php.ini的output_buffering设置为true;
  3. 如果无法修改php.ini,你可以通过php函数ob_start()来设置是否打开输出缓存开关。与此相关的函数几个函数有:

    ob_start():启用output buffering机制。 Output buffering支持多层次 — 例如,可以多次调用 ob_start() 函数。

    ob_end_flush():发送output buffer(输出缓冲)并禁用output buffering机制。

    ob_end_clean():清除output buffer但不发送,并禁用output buffering。

    ob_get_contents():将当前的output buffer返回成一个字符串。允许你处理脚本发出的任何输出。

转载请注明出处:Zigzag@悠久博客

未分类

罄竹难书生意气风发

2009年4月29日

你曾在橄榄树下等待再等待
我却在遥远的地方徘徊再徘徊
人生本是一场迷茫的路
莫将我责怪
为把遗憾赎回来
我也去等待
每当月圆时
对着橄榄树独自膜拜
你永远不再来
我永远在等待
越等待
心中越爱
——————历史悠久的分割线——————

总是出差,但出差的地方也几乎固定不变。一个项目的周期一般都会超过2年,所以一个地方隔几个月就会再去一次,故地重游,陌生的熟悉了,熟悉的陌生了。那个总是要我写个3D彩票选号软件的酒店老板再也见不到了,厚厚的铁门锁住了半年前和他笑谈的声音;那条被我命名多哥的小狗不见了,或者它已经长大了,我不再认识它,它也不再认识我;只是那条通往厂区宽广的水泥路依然耀眼,不时有感性或性感的姑娘骑着电动车一路疾驶而过;我去了,又来了,如此罢了。

和师兄一起出差充满挑战,每天的时间安排得非常紧凑,比留守大本营要充实多了。有一夜,为了解决一个数采程序总是在半夜不能采数的问题,我和师兄从晚上10点守到将近1点。不痛苦,不疲惫。临行打了将近1500页的交付文档,算是最后的了结。

我很不能接受工作狂的做法,虽然有时为了某个目标不得不这样。和师兄出差的次数多了,也慢慢习惯了。年纪这么大了,还是这么容易被感化,蹊跷。

——————————悲由喜生的分割线———————
今天是开心的,终于结束了出差,再上2天班就可以闲暇起来。开心的原因有三:第一次主动打了问候电话;过五一发了点购物卡;晚上四人组一起去消费。但实际上,开心只是个心态,它们能立刻转换成伤心。比如第一次主动打了问候电话却没有接到;比如购物卡与别人比起来,是数以百计之于数以千计,数量级不一样;比如,这四人组的饭局,是我们离别的征兆,几日之后,各奔东西。

—————————肥而不腻的分割线—————
有些人,注定是会被思念和思念的;时间告诉我,是不是该打个电话或者发个短信。

Klutz曾经说,你还挺有用的。意思是说我能帮上忙,可是我并不是总是帮上忙,Soaring的问题我似乎从来都没解决过,这说明两点:一是她的问题不是一般人能解决的,二是我是个一般的人。爱莫能助,自残与自惭都是无用的。

我一直再等待,你一直不再来。

悠久心情

Zend Studio 5.5中文乱码解决办法

2009年4月13日

Zend Studio 5.5会出现中文乱码现象。如果你把以utf-8格式保存的文件用ZS打开,就会看到一堆乱七八糟的文字,惨不忍睹,改了保存依然乱七八糟。这是由于ZS默认编码不是utf-8引起的,可以用以下方式解决:

1、打开 C:\Documents and Settings\Administrator\ZDE\config_5.5\desktop_options.xml

2、查找 editing.encoding

3、修改里面为 <encoding name=”UTF-8″/>

4、保存,并将该文件属性设置为只读,否则zend每次启动都会将 desktop_options.xml 初始化

5、重启 zend

打开后可能让你非常失望,怎么还是乱码呢?没关系,把你已经打开的文档通通关掉,重新打开你的文档,就会发现一切OK了。

如果你在保存有中文页面的文件时出现“无法以utf-8的格式保存文档”的错误,很简单,我想你修改encoding时,用了utf-8,而不是UTF-8,注意是大写!改过来即可。

悠久技术 , ,

MySQL中文乱码的解决办法

2009年4月10日

这几天做一个项目,发现php读取Mysql数据时,会出现中文乱码的错误,全部显示为问号。即使把数据表的字符集改成utf-8,依然不能解决。后来在网上查了一下,得到问题的解决方案了。可以看下此链接,讲解的比较繁琐,我在这里归纳一下。

MySQL的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。这几个层次中前三个是继承关系的,即当把服务器设置成某种字符集而数据库和数据表都没有设置字符集时,后面的两个层次自动默认为服务器端的字符集。

在Mysql中,server端默认的字符集为latin1,这与Mysql的历史有关,如果有兴趣可以在网上查一下。所以如果当你在建表和数据库时不设置字符集,将会自动默认为latin1,当你数据表中出现中文时,显然是不支持的,就会出现乱码的问题。

我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

SET NAMES ‘utf8′;

它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

再试试看,正常了吧?

我的解决办法
在 查询语句前加
Mysql_query(”set names utf8″);

悠久技术 , ,

CSS技巧总结

2009年3月30日

作为前端开发人员,在日常的页面制作时,不可避免的会碰上这样那样的问题,我挑选了其中的一些进行总结归档,希望对大家会有所帮助:

1、如何定义高度很小的容器?

在IE6下无法定义小高度的容器,是因为有一个默认的行高。
列举2种解决方案:overflow:hidden | line-height:0

2、图片下方出现几像素的空白间隙?

这个也有多种解决方案,如将img定义为display:block,或定义父容器为font-size:0,个人更推荐使用vertical-align的方式,它的值可以是text-top | text-bottom | middle等

3、IE6双倍margin的BUG? 阅读全文…

悠久技术 , , , ,

湖南出差札记

2009年3月25日

以为自己辣不怕,或者怕不辣,来了湖南才晓得这里的辣有多么的辣,无辣不成宴,辣的我天翻地覆,日月无光的。昔日吃楼下宾馆的自助,总喜欢挑辣的吃,那样才够味儿。结果吃得肠道不适,一趟趟地上厕所。今天下午甲方请吃饭,一桌子的菜啊,不辣的没有,除了果盘。喝了一大杯的茅台,和两大杯的优酸乳,和两大杯的啤酒,怕自己晕了乱说话,结果还真的晕了,值得庆幸的是,把持住了自己,没乱说话,不然真是怕在陌生人面前丢人丢尽了。

晚上喝得晕晕乎乎,去开了EMS的总结会议。会议一致讨论了能源系统该做的和不该做的,以便在明天的讨论中理清职责。高部长的发言,让我对能源,特别是计划那块有了新的认识,不虚此会。

有兄弟打电话说清明去青岛旅游,可以作为他之亲属,免费,结果手机没带,这个名额就成了别人的咯,遗憾但也很高兴。你永远不知道未来会有什么事情可能发生。

一致认为湖南人的皮肤一定很好,有例为证。昨日吃罢饭,夕阳很美我很帅,决定出去买点水果,发现路边来往的姑娘果然肤如凝脂,大约还是天生的,与气候有关。

晕了,胡言乱语了一阵子。

全文完。

——————————————————————————————————
父亲说,当你把你人生中最脆弱的一次感动保持的完好无损的时候,那就是你最珍惜自己的时候。
母亲说,如果你能被美好的事物所感动,并能够创造出美好的事物去感动别人,那么你是幸福的。
我说,你们真有文化。

悠久生活 ,

要不是那时你爱着我

2009年3月23日

来院里将近三年,基本不知太阳是怎么升起来的,晃晃悠悠地过日子,从不担心青春是怎么没的,以为是公共厕所的卫生纸,用完了还有,用完了还有。双休日加班,基本如同哈雷彗星撞地球,有可能,但还没发生过。而这几天却绷紧了神经,但并不是写了各种各样的文档,而是把一个文档写了一遍又一遍。这花费了双休日大半的时间和心情,感到了前所未有的倦意和紧张。真正难完成的事情不是因为有很多很多要做的,而是只有一个事情,你却不知道如何去做好。

师兄的兢兢业业令人钦佩,独自揽下了大部分的工作,我们虽然耗在其中,却不知道标准到底是什么,一遍又一遍的修正,依然不能让他满意。相比于师兄的废寝忘食,自残当然不必,自惭形秽还是非常有必要的。如果一个事情没有标准标志它的完美,做出来一定会让人感到棘手。

从首钢出差三周,早上起来的太早,晚上睡得太晚,支持不住了。上周小胜打电话说有时间周末出去叫春和踏春,我看时间不够,每周都安排的都很紧张。

————————酒醉饭饱的分界线——————————————

终于纠集齐了四个人,一起出去吃了顿饭,聊的太high,一转头才发现只剩下俺们这一桌还在扯淡,饭店都快打烊了。昨天和翠翠去逛花卉世界,有大师在场,让我见到了不少美丽的花花和美丽的花花姑娘,也知道了很多花儿的名字。顺便买了两盆花,送给两个姑娘,一人一盆,希望在我出差的日子能让它们花繁叶茂。同学们,我们相处的日子不多了矣。

明日继续出差,南下到湖南,想必那里一定春暖花开的更厉害一些,今日姑且作罢。

————————呼应标题的分界线——————————————

上周出差回来,半夜三更还没睡,起来准备上个厕所,忽闻厕所里飘出一句爱情用语:

——要不是那时你爱着我,……

一师弟正打电话发飙,我被华丽丽地雷倒了。

全文完。

未分类

知书达理想主义

2009年3月23日

以前告诉自己说,要多去书店看看书,一方面能保证自己在最短的时间内攫取点知识,另一方面也好知道最近在流行什么新技术。出差了两周,每个周末的时间都很紧张似的,想做的事情都没机会去做。一个月去一次的书店的承诺都不能保证,怎么去信守对别人的承诺。于是早上犹豫了一阵子,终于做出了去书店看看的决定。

去书店,第一时间当然去看程序设计方面的书。第三极书城的IT书籍以前在第八层,占了相当大的一部分空间。但不知为何,今天去的时候已经把第八层堵住了,在七楼腾出一点小空间放程序设计的书,来回总共5排,很是小气。想囊括程序语言的各个方面,我看还是有些困难的。这里看网页设计方面的人大约多一点,这部分人关注的可能是艺术方面大于编码方面,Java和.Net的书各占半壁江山,翻阅的人不是很多,C和C++的也有相当一部分阅读,从此可以看出各种语言的普遍度了。

我想找程序架构方面的书,让我很失望,没找到,倒是看到一本关于php的很不错的书,八折,我不买,网上买要便宜许多。从第三极出来,去中国书城对面的叫做什么电子书店的书店,里面几乎全部是程序设计方面的书,以前我也比较喜欢逛那里。去了以后,大失所望,关于java的书遍布几个书架,其中还不包括那些讲架构的书,而.Net只占了一个小小的空间,对比是非常强烈的。我找到了一本讲ORM的书,但是java版的,很遗憾,那些语法虽然有相通之处,但还是会觉得别扭的。这里的asp.Net的书倒是不少,可惜我已经买了足够多的此类的书,还没认真地读完一遍,暂且就不用买了吧。

以前在西安的时候,我也老爱去长路上的那个书店,突然忘记了名字。但那时候不是去看程序设计书,而是看小说和散文类,看看又有多少傻人写了给傻人看的书,翻腾的不亦乐乎。那时的我不关注技术,最可能的原因是还没理清人生是怎么一回事,这种涉及到吃饭的纯技术问题当然不会很早就看那么重。

丰台区也没什么书店,物美对面有个很小的新华书店,种类倒是很多,只是进货太少,不能满足需要的。偶尔在茶余饭后去看看最近出来的小说,感觉也还不错。去北大地车站的路上也有一个,我只进去过一次,里面卖的都是中小学辅导教材,那叫一个琳琅满目,看花了眼。

路过一个高大的建筑物,外面装饰着华美的瓷砖,上书诗书礼仪等文化标语,显得非常的文化,以为丰台区终于有个大书店了,以后可以去逛逛。车一转,看到它的标牌:儒宴。原来是个吃饭的地方,真够损的。

悠久心情 , ,