web开发入门

     以前无论在nokia还是tencent都是做移动客户端开发,那时候也都是用编译型的c++语言。但是来到baidu后做的却是后台开发,此时所用所要关注的都是以前不曾接触过的,主要是各种服务器脚本和数据库技术。当然:对这些技术的使用本身而言:网上N多文章,也很多相关的书。问题是:没有几本书可以把相互之间的关系解释清楚,比如:webserver和php脚本的关系;php底层实现;mysql底层实现等等。。这些都鲜有人去专门论述。而刚开始接触这些的时候因为对底层实现不了解,我一直对一些内部机制很是困惑,总觉得有些地方是连贯不起来的,这逼着我不得不去了解一些原理性的东西,看源码,看一些大牛的blog等等··· 接下来就把我的一些想法记录于博客,欢迎大家拍砖。

 

      这一篇就说一下:web-server和脚本还有数据库的关系吧:

      一般做web开发大家都习惯装一个wamp后者lamp。就是web-server,php和mysql的集合。问题是:为什么要装一个web-server?按照原先写c++的思维:我就有个c++的编译器,然后就可以写c++了啊,干吗还有装一个web-server?? 再者:web-server是什么东西?是服务器还是什么?

 

      自我理解:类似c++这样的编译型语言,在执行之前都是将源文件整个都编译好,其是一种编译后执行的过程;而解释性语言则是边编译边执行的。那这就意味着:运行一个php脚本(解释性语言)时,必须要有一个解释器在跑着。只有这样才能做到边解释边执行。

      问题是:这个解释器存在于哪里?我们是不是直接在服务器上装一个然后启动它呢?启动之后怎么处理呢?毕竟会有很多用户同时过来执行同一个php脚本。解释器一个时刻只能解释一个php脚本,那其余请求脚本只能排队,这显然是不能接受的。好吧:为了解决这个问题,我们给解释器增加点功能,让其有个进程(线程)管理功能。从而每个脚本请求都单独建一个进程(线程)来处理,这样就ok了。问题是:php解释器仅仅是解释器,并没有增加这个功能。而服务器上又是可能运行多种类型的脚本的,我们不可能没换一种就为一种脚本再装一个线程(进程)管理功能的应用程序。 于是本着抽取简化的原则:人们设计了webserver。

     首先:web-server是一个软件。他一个功能就是:他负责加载脚本解释器并运行,并负责管理各个请求的线程(进程)。

 

 

     具体一点:

     ①:web-server是模块化构建的,比如:php解释器是其中的一个模块,web-server负责加载并执行它。当有php请求到来时:它会调用这个php解释器模块去解释执行请求对应的脚本。

     ②:一旦一个php请求到来之后:web-server会为这个请求创建一个进程(线程)《说明:是进程还是线程取决于版本还有各种因素》。从而被请求的这个php脚本就是运行在这个进程(线程)中的。运行完了则web-server会回收这个进程,要么销毁要么放到进程缓冲池中。

 

 

      所以总结来说:脚本是运行在web-server中的,前者依赖于后者!!

 

 

 

      那数据库呢?因为我们可能在脚本中请求了数据库,这时候不可避免要和数据库打交道。当在web-server一个进程中运行了php脚本时:发现其要请求数据库,这个时候其首先要连接数据库,这就产生一个对数据库的连接。而mysql本身也是一种服务,它并不依赖于web-server,可以说它是和web-server平级的东西。它有个模块负责监听对它发起的各种连接。于是当php运行对它发起一个连接的时候:mysql监听到了这个连接,一旦监听到了则它会专门为这个连接建立一个线程来进行处理!处理完这个连接中的所有请求之后才会回收这个线程。

 

--------------------------------------------------------------------------------------------------------------------------

 

      总体来说:

     ①:脚本是依赖于web-server存在的,没一个脚本请求的处理线程都是web-server来创建的。

     ②:web-server和mysql是同级别的概念,都是一种服务。 而php脚本则是依赖于web-server存在的,都无法创建自己的线程。

     ③:对mysql,要区分开 连接 和 线程 这两个概念,也要区分开:连接 和 查表 这两个概念。其实这些一说出来都很明白不同,但是不去细想的话总是磕磕绊绊。

 

 

----------------------------------------------------------------------------------------------------------------------------

 

     那再说一下一个php请求,web-server是给它分配一个进程呢?还是一个线程呢?这个其实取决于版本以及你的选择。老版本x系统下只有进程,没有线程,所以那时候:都是用的进程。但是后来的新版本都是支持线程的,此时是不是就分配的线程呢?呵呵~这又牵扯一个问题:php是线程不安全的,如何解决下一篇文章再介绍吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值