1.1 Linux操作系统
Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。这让Linux吸收了无数程序员的精华,不断壮大。
Linux系统支持多用户,多进程。多用户保证了各个用户之间的不仅能够有自己的特殊权利,有个人的隐私,还能够与其他用户共同合作,共同完成某项任务。多进程的环境保证了各个任务之间能够安全独立地运行,现在linux系统以其稳定性,安全性,功能强大吸引了众多客户的青睐,包括开发人员用于开发工作和公司用作服务器使用。
1.2 Apache服务器
Apache服务器是Apache软件基金会下面的一个出名的开源http server,它致力于开发能够运行在现代流行操作系统(包括unix和windows)上的http服务器,目标是提供一个安全的,高效的,可扩展的服务器用以提供http服务,同时还保证跟当前的http标准同步。
当期web服务器的种类众多,其中流行的有Apache,Nginx,Lighttpd,还有微软一家的IIS,虽然Nginx和Lighttpd被众多的人所推崇,但是Apache依然以它的强大和稳定占据了很大的市场(其实我也是很推崇Nginx和Lighttpd的)。
1.2.1 基本原理
在Apache2.0之前,它主要以多进程的方式进行工作,多进程方式的好处是编程相对比较容易,因为几乎不用考虑线程安全问题,所以安全性能是比较好的。但是弊端也是很多的,单个进程占用的内存大,如果服务器需要同时并发处理多个http请求的话,那么将会占用系统大量的内存,这样一来,系统将不能提供高并发的服务。Apache2.0以来,在支持POSIX线程的unix系统上,现在Apache能在混合多进程,多线程模式下运行,使很多配置的可伸缩性得到改善。
Apache HTTP服务器被设计为一个强大、灵活的能够在多种平台上及不同的环境下工作的服务器。不同的平台和不同的环境经常产生不同的需求,或是会为了达到同样的最佳效果而采用不同的方法。Apache凭借它的模块设计很好的适应了大量不同的环境。这一设计使得网站管理员能够在编译时和运行时凭借载入不同的模块来决定服务器的不同附加功能。这种设计方式就是所谓的多道处理模块,是2.0以后引入的一个重要特性。没有使用该方法之前,在windows操作系统下是采用模拟POSIX层的方法,这种方法容易引起很多bug和性能低下。
1.2.2 某些MPM简介
l prefork:这个处理模块实现的是一个非线程化的,预进程化的web服务器,这种方式跟1.3版本差不多。它适用于非线程安全的库(比如php语言,它的很多库都不是线程安全的),因为web服务器是通过一个进程处理一个请求,所以如果一个请求发生问题,不会波及到其他请求,稳定性方面是比较好的。
l worker:这是一种支持多进程,多线程的处理模块。由于使用线程来处理请求,所以可以并发处理的请求数相对比较多,同时系统资源的开销小于基于进程的服务器。但是,它也使用了多进程,每个进程又有多个线程,以这种方式获得基于进程的服务器的稳定性。PHP的官方文档中提到不适合将这种方式应用到生产环境,因为基于线程的处理处理请求的方式会给本身不是线程安全的php库带来危险。如果实在想用,那么应该使用fast-cgi的方式。
l perchild:运行守护进程被赋予不同的用户id,配置文件中可以设置不同的用户和组,然后指定进程给这些用户和组服务,但这种方式还不甚完善,正在开发中。
l mpm_winnt:这个处理模块是windows平台下面的一个默认处理模块,也是唯一的一个。它使用单个控制进程创建一个子进程,然后这个子进程再创建多个线程来处理不同的请求。PHP官方文档中提到,windows平台下使用多线程的方式相对来说比较安全,因为太多数的windows平台下的php库都是线程安全的。
1.3 MySQL数据库
Mysql是世界上最出名的开源数据库,它的用户非常之多,包括google,facebook,淘宝,腾讯,新浪等等各个公司。
Mysql数据库支持多线程,在多cpu的机器上有较高的性能,使用c或者c++语言开发,能够在不同平台上进行编译,使用。相对其它商业数据库来说,它显得比较简洁,实用,但是也拥有数据库的五脏六腑。
Mysql数据库最大的一个特点是,它支持插件式的存储引擎,这样便于程序员对它编写相应的扩张,这一特点也更能达到开源的目的。当前支持mysql的存储引擎相当的丰富,其中比较出名的有myisam,innodB,memory,merge,ndb,blackhole等等。
1.3.2 重要存储引擎简介
l MyISAM是MySQL最早支持的存储引擎,在mysql5.5之前都将其作为默认存储引擎。它支持较高的插入,查询速度,支持表级锁定,但是不支持事务——即数据库里面的ACID理论。
l InnoDB支持事务,行级锁定,支持外键。事务的支持是通过先写日记的方式来实现的,如果机器出现故障或者其他原因导致数据丢失,错乱等,则通过日记的内容对数据进行回滚。MySQL5.5之后将其作为默认的存储引擎。
l BerkeleyDB支持事务和页级锁定。
l Memory是基于哈希的方式,将所有数据,索引都置于内存当中的存储引擎,由于没有慢速的磁盘IO操作,所以它有很高的查询,修改效率。但是由于将数据存储在内存当中,所以当MySQL重启时,数据将会被丢失。所以一般用作存储临时表。
l MRG_MYISAM用来将一致的MyISAM存储引擎的表进行快速的合并。
l Ndbcluster是集群存储引擎,用于构建具有高容错性的基于内存的表。可以将多台电脑联合起来使用,提供高性能,高可用的数据库,适用于大数据量的存储,比如数据仓库等。
l Sphinx是一个比较特殊的存储引擎,虽然说是存储引擎,但是它并没有存储数据,实际上它应该算是开源搜索引擎Sphinx在MySQL里面的一个嵌入式客户端。
PHP,即“PHP: Hypertext Preprocessor”,是一种被广泛使用的开放源代码多用途脚本语言,尤其适用于 web 开发并可以嵌入到 HTML 中去。其语法利用了 C,Java 和 Perl,非常容易学习。该语言的主要目标是让 web 开发人员可以很快写出动态生成的网页,但 PHP 的功能远不止如此。实际上,PHP可以用于服务器端脚本编程,命令行脚本,甚至编写桌面应用程序。
PHP程序的运行过程是这样的,首先进行解析,解析过程是将PHP进行词法分析,将程序划分成为一个个的token。然后进行编译,将token作为输入,产生可执行单元和类和函数表,这就是中间代码。最后是执行过程,将中间代码作为输入,执行器执行中间代码后便产生最终的结果。
现代cpu的处理速度是相当的惊人,最普通的电脑每秒执行的指令都能超过1亿次,所以像php这样的动态语言,虽然没有像静态语言那样先通过编译产生可执行文件,而是每次执行的时候都要解析,编译(其实使用一些扩展是可以去换存编译结果的,这样避免每次执行时的编译过程,可以节省不少时间),但是由于处理器的速度比较快,另外由于动态语言本身相对比较简单,上手快,所以在很多场合,动态语言都发挥着相当重要的作用。
Sphinx是一个开源的搜索服务器,它被设计成高性能的,可扩展的,简单实用的搜索引擎。
它的工作原理是这样的:以某个数据源(可以是数据库里面的数据,xml等)为基础,将这些数据源建立索引。我们都清楚,建立索引以后能够快速地定位到某条记录。Sphinx建立索引的速度是比较快的,而且它支持主索引和增量索引的方式。网上看到的数据,Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
主索引对应的数据源是所有的数据,增量索引对应的数据源可以根据需要将其设置为最近的一段时间的产生的数据。这样的话,增量索引对应的数据源比较少,可以将其设置为每隔几分钟就更新索引一次,另一方面,主索引对应的数据量相对比较大,可以将索引更新时间设置得相对长一些,或者将其设定在晚上,晚上的时候数据的访问量不大。
下面以MySQL为例,简单说明Sphinx是如何工作的。Sphinx将数据表里面的数据作为数据源,这些数据源可以使用sql语句从数据表里面灵活的选择出所需要的数据。然后可以通过Sphinx的工具indexer来对这些数据源建立索引,建立索引是根据某个分词表来进行的。Sphinx默认只支持英文的分词,但是可以容易对其进行扩展,进而支持其他语言,包括中文。目前国内已经有人将Sphinx和中文分词软件包LibMMseg组合在一起形成coreseek,其意图在于为应用提供高速、低空间占用、高结果相关度的中文全文搜索能力。建立完索引以后可以使用Sphinx的工具search对这些数据进行搜索测试,这时候由于已经建立了索引数据,所以搜索速度应该是比较快的。前面介绍MySQL的时候提到了Sphinx存储引擎,这个时候便可以使用这个东西了,将Sphinx的服务searcd打开,监听在某个端口上面。可以在MySQL中建立一个以Sphinx为存储引擎的数据表,此数据表连接到searchd服务,从而可以通过mysql语句,查询Sphinx里面的索引数据。
Ajax是asynchronous javascript and xml的缩写,它的工作原理是这样的,通过javascript函数创建一个xmlhttprequest对象(不同的浏览器创建方式不一样),这个对象可以以异步的方式向服务器发送http请求,然后将服务器返回的内容(这里的内容格式可以是xml,json,或者是纯文本数据)动态加载到页面,从而避免了网页的完全刷新,实现局部刷新或者是无刷新,给用户一种友好的上网体验。