memcached的分布式应用
html、dhtml、xhtml的区别
xml怎样转化为html格式
面向对象深入、再深入
index为什么能加快检索速度
1、apache的工作原理
网络服务器由于要同时为多个客户提供服务,就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有三种方式来选择,多进程方式、多线程方式及异步方式。
apache2可以是多进程与多线程混合的工作方式。影响它性能的核心模块主要是MPM(Multi-ProcessingModules,多道处理模块)。
可以选择prefork和worker模式。
其中,prefork是单纯的多进程工作方式,当apache启动时,生成startserver个进程,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。每个进程处理多个请求后退出,维持最小空闲进程数,当服务器处理的请求比较复杂、要求高稳定性的时候,可以选择该工作模式,因为多个进程之间不干扰。
而worker是多进程与多线程混合的方式。系统启动时,生成startserver个进程,每个进程又包含Threadsperchild个线程,每个线程独立的处理请求。这样能够增大系统的并发负载量。
以上参考:http://blog.tianya.cn/blogger/post_show.asp?BlogID=40003&PostID=4585547
一个请求到来的,依次经过metadata模块、内容生成模块、logging模块,而content generator 模块又会通过pipelined的方式调用input filters和output filters进行处理,这些filters比如:Server side includes (SSI), XML and XSLT processing, gzip compression, and Encryption (SSL)。
内容生成模块通过addhandler或sethandler,在httpd.conf中指定。
metadata 模块比如:
以上参考:http://www.apachetutor.org/dev/request
2、apache的编译方式:DSO与静态编译
DSO(Dynamic Shared Objects,动态共享目标),它提供了在运行时加载模块的方式。
apache分4层,从上到下依次为:第三方库、可选的附加功能模块(如mod_rewrite)、基本功能库(http_core、mod_so等)、os相关的库。其中,第三层和第四层都可以灵活选择。于是就有了DSO和静态编译的方式。
前者,在apache启动时,加载动态库,可以通过配置文件来选择需要哪些模块,但是启动速度会受到影响。后者,在编译时,将动态库编译进apache。
3、HTTP/1.1 为什么能提高性能?
在HTTP/1.0中,每次请求得到响应之后,都会断开浏览器与服务器端的连接。这样,如果一个页面有多个请求,就会有多个连接。而1.1中,引入了持久连接,因为TCP允许来自IP层的多个请求打包为一个发送,并把响应也打包发送,这样就减少了连接数目。同时,由于连接请求少了,也减少了为了建立请求而发送的数据包,减少了网络负载。
4、PHP引擎的工作原理
首先,分析php代码的执行顺序:
1. Scanning(Lexing) , 将 PHP 代码转换为语言片段 (Tokens)
2. Parsing, 将 Tokens 转换成简单而有意义的表达式
3. Compilation, 将表达式编译成 Opocdes
4. Execution, 顺次执行 Opcodes ,每次一条,从而实现 PHP 脚本的功能。
附记 : 现在有的 Cache 比如 APC, 可以使得 PHP 缓存住 Opcodes ,这样,每次有请求来临的时候,就不需要重复执行前面 3 步,从而能大幅的提高 PHP 的执行速度。
以上参考: http://www.laruence.com/2008/06/18/221.html
即 php代码 -> token -> opcodes ,缓存php代码效果较好的方式,应该是缓存opcodes。
提高php性能的方法:
1、使用优化引擎,去除不必要的代码
2、使用缓冲技术,缓存opcodes
3、对输出内容进行压缩
以上参考:http://developer.51cto.com/art/200904/120151.htm
PHP总共有三个模块:内核、Zend引擎、以及扩展层; PHP内核用来处理请求、文件流、错误处理等相关操作; Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们 需要mysql扩展来连接MySQL数据库;当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。
MINIT的意思是“模块初始化”,RINIT方法,即“请求初始化”。它们分别对应PHP全局变量、函数等的两种生命周期:一个apache进程(线程)内都有效,以及仅在一次请求内有效。它们对应的有MSHUTDOWN和RSHUTDOWN。
以上参考:http://abhinavsingh.com/blog/2008/11/how-does-php-echos-a-hello-world-behind-the-scene/
5、缓存
缓存分为服务器和客户端缓存。服务器端缓存可以利用memcached缓存数据,php加速器缓存编译好的opcodes,还有类似varnish的http缓存服务器。而客户端缓存主要是根据http协议,减少客户端对服务器端的重复请求。
客户端缓存方式:
a、expires/cache-control: 给静态资源(HTML文件,图片文件等)的Repsone加上Expires/Cache-Control Header,这样下次浏览器需要这个资源的时候,就会检查本地缓存的文件是否过期,如果不过期就不请求了
b、 HTTP的Response中还会有另外一个Header叫Last-Modified ,浏览器访问一个URI得 到这样的Resposne之后,就知道这个资源最后一次的修改时间,下次需要再次获得这个资源的时候,会发一个Request给Server,不过这个 Request中有一条“If-Unmodified-Since: Thu, 06 Apr 2006 21:17:12 GMT”,如果在Server端在这个日期之后对这个资源进行了修改,就会照常返回这个资源给Client端,但是如果没有修改,就会返回一个304 (Not Modified) Response而不返回资源,告诉Client端:“这个资源从上次给你之来从来没改过,你放心用你Cache中的好了。” 一个304 Response比一个静态资源通常小多了,这样就节省了网络带宽
当用户在IE或者 Firefox里面按F5或者点击Refresh按钮的时候(不是在URL栏里重新输入一遍URL然后回车),就算对于有Expires的URI,一样也 会发一个HTTP请求出去,所以,Last-Modified还是要用的,而且要和Expires一起用。
c、Etags方式:服务器的response中,对资源打一个标记,下次浏览器请求的时候,会带上这个tag,如果服务器端的tag=客户端的tag,则返回304,客户端可以直接使用本地缓存。
6、join的区别
join默认是outer join的。
内连接 只连接匹配的行
左外连接 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
7、数据库索引(index)
在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象。
A )索引可以避免全表扫描。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页。
B ) 对于非聚集索引,有些查询甚至可以不访问数据页。
C ) 聚集索引可以避免数据插入操作集中于表的最后一个数据页。
D ) 一些情况下,索引还可用于避免排序操作。
当然,众所周知,虽然索引可以提高查询速度,但是它们也会导致数据库系统更新数据的性能下降,因为大部分数据更新需要同时更新索引。
以上参考:http://www.cnblogs.com/KissKnife/archive/2009/03/30/1425534.html
B-tree是为磁盘或者其他直接存取辅助存储设备而设计的一种平衡查找树,能降低磁盘I/O操作次数。它可以有许多个儿女,即分支因子可能较大,含n个节点的B-tree的高度是O(lgn)。
8、表单提交:get和post方式的区别
get方式:参数和值存储在http头里;可以被cache;可以被记录在log里;某些旧浏览器有长度限制
post方式:参数和值存在在http数据里;不可以被cache;不可以被记录在log里
最安全的方式还是使用https。