首页 存档 技术 查看内容

当SWOOLE遇上SERVER 前言 Server之初 Swoole Server做了什么? 彪悍的Swoole工具箱

2018-3-30 13:00 |来自: 互联网 333 0

摘要: 前言 Swoole Server应该是Swoole工具中最重要也是最核心的一个了,但没有网络服务程序开发基础的童鞋刚接触的时候往往会一头雾水,这里我们返本归元,先聊聊Server在干什么,然后我们再看看Swoole Server是怎样跑起 ...

前言

Swoole Server应该是Swoole工具中最重要也是最核心的一个了,但没有网络服务程序开发基础的童鞋刚接触的时候往往会一头雾水,这里我们返本归元,先聊聊Server在干什么,然后我们再看看Swoole Server是怎样跑起来的~


Server之初

通常,我们会把网络系统根据架构分为B/S架构和C/S架构,而这里笔者想聊的就是这里提到的S,也就是服务(Server)在干什么?

风靡各大高校宿舍的Dota和LOL,主体上可以算是典型的C/S架构的网络系统/软件/应用/程序/What ever

我们先从比较常见的基于PHP的Web网站开始聊起。

这里举例采用的是最基础的Linux Apache PHP的开发环境。

当我们打开http://127.0.0.1:80并看到Apache的欢迎界面时,我们知道,我们已经成功的完成了一个简单的B/S结构的程序。

虽然这里输出的不是Hello World!虽然目前为止一句PHP也没写。

那么,这个时候,这里我们说B/S中的Server具体指代的是什么呢?以下两个选项哪个是你的想法?

  1. 运行并保存着我们网站的服务器主机。

  2. Apache正在运行的进程。

其实从笔者的角度而言,上述两个选项都是对的,因为Server这个词本身的含义就很丰富,根据特定的语境,它既可以指服务器,也可以指服务程序。

本文中提到的Server如无特别说明,都是指提供服务的应用程序,在当前的场景中,就是Apache。

我们来简单扒一下,在打开这个网页的过程中,Apache作为一个Server,最少要做到哪些工作?

最基础的工作,更深入的问题我们可以一点点讨论。

首先,Apache需要先运行起来,如果Apache没有运行,显然没法向浏览器提供服务(例如,输出Apache的欢迎页面)

传统的Web网站场景中,Server是被动地提供服务的,也就是客户端不请求,Server就不会提供服务,就像一般民事诉讼中的不告不理原则。

再者,浏览器需要有一个可靠的方法找到我们刚刚运行起来的Apache(就像寄快递,要有收件方的地址)

想象一下市民中心的办证大厅,各种各样的窗口,不同的窗口可以办理不同的证件,市民提交的材料就是“输入”,服务台提供的证件就是“输出”,找到正确的窗口,是享受服务的前题。

例如我们在浏览器输入 www.baidu.com ,我们知道会打开百度的首页。

关于域名与DNS的问题,本文就不做探讨了,不了解的童鞋可以简单理解为域名会被解析为IP即可。

当Apache做到了上述两项工作时,我们可以简单认为它具备了作为一个Server的基础。

用物流管理的话说,就是在“正确的时间、正确的地点、正确的货物”。


监听:正确的地点

那么,Apache是怎么做到这两点的呢?相信怎么运行Apache这个问题不必笔者嗦,我们主要开始看看第二个问题。

关于服务要稳定常驻运行的问题,可参见拙作《守护进程二三事与Supervisor》

我们怎么去定义这个“正确的地点”呢?最常见的方案,就是TCP/IP协议中的IP协议。

严谨地说,TCP协议是传输层协议;IP是网络层协议。因为两者常常搭配出现,就像LAMP一样,有了TCP/IP协议这个说法。

IP协议帮助客户端在浩瀚的网络中找到正确的主机,例如上文中的 127.0.0.1 主机。

127.0.0.1 是IP协议中定义的一个特殊地址,表示本机,概念上有点像PHP中的$this。

如果我们的主机在局域网中被分配的IP是192.168.1.233,则其他主机也可以通过192.168.1.233这个地址找到我们的主机

IP是“IP协议”给每一台联网设备规定一个地址,便于互相通信和发现。

但一个主机如果只能运行一个服务,就太浪费了,因此如果说IP是用来区分不同的联网设备的,Port在这就是用来区分同一个设备的不同服务的。

最基本的LAMP环境中,SSH需要一个端口(默认22),Apache需要一个端口(默认80),MySql需要一个端口(默认3306)。

一般情况下,端口的编号取值范围是 [1, 65535],一般1000以下的端口都会被一些常用服务默认调用,所以尽可能不要使用。

就像大公司电话系统中的主机与分机一样,IP是主机,全世界通用(没有区号这些东西啦),Port就是分机,仅在自己的主机内通用。

写到这里,前文我们提到的 127.0.0.1:80 的含义就更清晰了,前面的 127.0.0.1 是IP地址,后边的80是端口。而因为80是HTTP服务的默认端口,所以访问一般的常见网站时我们并不需要写成 www.baidu.com:80 。

所以如果是自建HTTP服务的话,默认情况下还是最好提供80端口作为服务端口。

我们把某个服务通过某个端口对外提供服务的行为称为“监听”,形象的说,前文的Apache监听着本机的80端口,如果有客户通过这个端口发来请求,操作系统就会把请求交给Apache,Apache就可以根据请求的具体内容进行处理,并给出响应(例如,欢迎使用Apache!)。

常用“Listen”或者“Bind”这两个动词。

最后,我们可以整理出简单LAMP环境中,基于HTTP协议的Web服务的交互逻辑:

  1. 客户端(浏览器)将请求提交给指定IP的主机。

  2. 操作系统根据请求中的PORT,转交给监听了这个PORT的Apache。

  3. Apache根据配置找到合适的目录,并获取目录中的PHP脚本。

  4. 调用Zend对该PHP脚本进行解析,并获得输出结果。

  5. 将输出结果返回给客户端(浏览器).

而一般情况下,PHP脚本的工作就在第四步中处理具体业务,至于怎么与浏览器保持通信,PHPer一般是不关心的,直到,Swoole重新定义了PHP。

其实还有别的方案,但,俺们的主题是Swoole(写了快一百行才提到Swoole的笔者表示说这句话的时候有点心虚…)


Swoole Server做了什么?

前文我们以Apache作为例子,简单梳理了一下Server在做什么的问题,再回来看Swoole Server,就好理解了,Swoole允许通过PHP构造一个新的Server,提供跟Apache类似的功能,监听请求,作出响应。

其实也回答了群里很常见的一个问题,为什么我运行Swoole Server的时候会跟Apache\Nginx冲突?

因为这里用PHP写的不再只是网页的业务逻辑,同时也包括Server的部分。

那么,我们现在开始第一个简单的Swoole TCP Server的Demo。

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部