存档

‘悠久技术’ 分类的存档

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~

悠久技术 , ,

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? 阅读全文…

悠久技术 , , , ,

mySQL入门语句记录

2009年2月23日

1. 如何把excel数据导入到mySQL中?
首先把EXCEl表格另存为csv或txt格式,然后用mysqlimport导入,具体语法如下:
D:\MySQL\bin>mysqlimport -uroot -pyuzhigang -dr –fields-terminated-by=, –lines
-terminated-by=\r\n cameochina showinfo.csv
注意csv换行标识是\r\n,不然你会发现最后一列的数据有个奇怪的符号,或者干脆导入错误。关于-dr是何意思,可以访问此文

2.insert语句
INSERT INTO ShowInfo(id, name, No) VALUES (1,’product’,'210-21C’);

3.update语句
UPDATE ShowInfo SET id = 2 WHERE name = ‘product’;

4. LIMIT语句不能用于子查询中。

5.待总结。

悠久技术 , ,

【原创】CSS之Position完美详解

2009年2月19日

CSS的很多其他属性大多容易理解,比如字体,文本,背景等。有些CSS书籍也会对这些简单的属性进行大张旗鼓的介绍,而偏偏忽略了对一些难缠的属性讲解,有避重就轻的嫌疑。CSS中主要难以理解的属性包括盒型结构,以及定位。正如positioniseverything,本文将主要讲述关于position的理解,力求让您看完本文后对position有着最全面的认识。

position的四个属性值:

  1. relative
  2. absolute
  3. fixed
  4. static。

下面分别讲述这四个属性。

<div id=”parent”>
<div id=”sub1″>sub1</div>
<div id=”sub2″>sub2</div>
</div>

1. relative

relative属性相对比较简单,我们要搞清它是相对哪个对象来进行偏移的。答案是它本身的位置。在上面的代码中,sub1和sub2是同级关系,如果设定sub1一个relative属性,比如设置如下CSS代码:

#sub1
{
position: relative;
padding: 5px;
top: 5px;
left: 5px;
}

我们可以这样理解,如果不设置relative属性,sub1的位置按照正常的文档流,它应该处于某个位置。但当设置sub1为的position为relative后,将根据top,right,bottom,left的值按照它理应所在的位置进行偏移,relative的“相对的”意思也正体现于此。 阅读全文…

悠久技术 , ,

管道的另一端上无任何进程的解决方案

2009年1月12日

在连接SQL 2005时,有时会出现如下错误:
已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)

你可以依次按照以下步骤解决:
1  以windows身份登陆,进去后右键点击数据库,重启SQL的服务,如果不行,请进行下列步骤;
2 选中服务器(右键)->属性->安全性->服务器身份验证修改为”SQL SERVER和WINDOWS身份验证模式”
3 展开服务器上的”安全性”->登陆名->选中SA登陆帐号(右键)->状态->登陆修改为启用
4 打开SQL2005的配置工具,打开SQL SERVER 外围程序配置工具,选择“服务和连接的外围应用配置器”。
5 选择 远程连接->本地连接和远程连接->仅使用TCP/IP,点击“应用”。
6 重启服务。

按照以上步骤基本可以解决这个问题。

悠久技术 , ,

SET NOCOUNT与SET ANSI_NULLS的含义

2008年12月7日

当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)

当 SET NOCOUNT 为 OFF 时,返回计数。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name =NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值,使用 WHERE column_name<> NULL 的 SELECT 语句仍会返回零行。 

当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。

悠久技术 , ,

关于软件需求的一点看法

2008年9月4日

软件,乍看之下,似乎和代码的关系最大,但是如果认为代码写的好就万事大吉可就大错而特错了,尤其在写代码的水平差不多之后,其他方面的问题就凸显出来,尤其是前期需求的调研情况。往往进行软件整体架构的人,并不十分了解软件的具体需求,当然,具体的需求,除了业务人员本身,其他人也很难了解清楚。所以在调研的方法和需求分析的进一步确定成为一个软件系统架构前的十分重要的步骤。个人认为,如果调研可以分配软件编制人员和业务人员共同工作一段时间,这样得出的需求分析结果会更加具体和切合实际;另外的一种方式是进行普遍的调查和询问,召集业务方面的相关负责人了解需求情况。当然前一种方式比后一种方式要投入更多的物力和人力,短期看来会增加软件的成本。不过如果后期的软件开发能够因此而更加顺畅和减少变更,长期效益还是值得考虑的。但是前中调研方式要求一个软件公司在前期有足够的人力和物力的支撑,所以也是不被采用的重要原因吧。

编写代码的技术是一个不断提高的过程。从前的经验可以直接转化为下一个项目的基础,抬高起点。不过需求分析,对每个软件项目而言,是常做常新的,从前的经验积累反倒可能成为你误解下一个项目需求的诱因,所以,对待每一个新的项目需求,要不断给自己洗脑,摒弃对此不利的理解,一切从实际出发,考虑该项目的需求和整体逻辑问题。不断提醒自己,对每一个新的项目,你都是一个小学生,从小学生的身份出发要求自己,努力理解和学习。

悠久技术

Oracle SQL 性能优化技巧

2008年8月8日

本文全面而详细地介绍了关于Oracle SQL 性能优化的一些技巧。

1.选用适合的ORACLE优化器

ORACLE的优化器共有3种:A. RULE (基于规则) B. COST (基于成本) C. CHOOSE (选择性)。设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS。你当然也在SQL句级或是会话(session)级对其进行覆盖。

为了使用基于成本的优化器(CBO, Cost-Based Optimizer),你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。

如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。

在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。 阅读全文…

悠久技术 , , ,