PHP基础

任何一种编程语言的基础知识看起来都稍微显得有一点枯燥,但确实是首当其冲需要学习和总结的,没有坚实的地基是盖不起万丈高楼的,成为高手的第一课就是学而思,反复练习。

1.设计模式 ( http://www.imooc.com/learn/236 )

2.php异常,错误处理 ( http://www.imooc.com/learn/380 )

PHP - 运行模式

1.cgi 协议模式(基本已经不再使用)

cgi模式 通用网关接口(Common Gateway Interface),它允许web服务器通过特定的协议与应用程序通信, 调用原理大概为:

用户请求->Web服务器接收请求->fork子进程 调用程序/执行程序->程序返回内容/程序调用结束->web服务器接收内容->返回给用户 由于每次用户请求,都得fork创建进程调用一次程序,然后销毁进程,所以性能较低。

2.fast-cgi 协议模式

fast-cgi是cgi模式的升级版,它像是一个常驻型的cgi,只要开启后,就可一直处理请求,不再需要结束进程, 调用原理大概为:

web服务器fast-cgi进程管理器初始化->预先fork n个进程
用户请求->web服务器接收请求->交给fast-cgi进程管理器->fast-cgi进程管理区接收,给其中一个空闲fast

注意,fast-cgi和cgi都是一种协议,开启的进程是单独实现该协议的进程。

3.web 模块模式

apache+php运行时,默认使用的是模块模式,它把php作为apache的模块随apache启动而启动,接收到用户请求时则直接通过调用mod_php模块进行处理。

HTTPServer这块基本可以看到有三种stack比较流行:

  • Apache+mod_php5
  • lighttp+spawn-fcgi
  • nginx+PHP-FPM

4.php-cli模式

php-cli模式属于命令行模式,对于很多刚开始学php就开始wamp,wnmp的开发者来说是最陌生的一种运行模式:

命令行模式和常规web模式明显不一样的是:

  • 没有超时时间
  • 默认关闭buffer缓冲
  • STDIN和STDOUT标准输入/输出/错误 的使用
  • echo var_dump,phpinfo等输出直接输出到控制台
  • 可使用的类/函数 不同
  • php.ini配置的不同

下面重点要说一下php-fpm和php-cli。

php-fpm

PHP-FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。

它的功能包括:

  • 支持平滑停止/启动的高级进程管理功能;
  • 可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置);
  • stdout 和 stderr 日志记录;
  • 在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;
  • 文件上传优化支持;
  • “慢日志” - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;
  • fastcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);
  • 动态/静态子进程产生;
  • 基本 SAPI 运行状态信息(类似Apache的 mod_status);
  • 基于 php.ini 的配置文件。

工作原理: php-fpm启动->生成n个fast-cgi协议处理进程->监听一个端口等待任务
用户请求->web服务器接收请求->请求转发给php-fpm->php-fpm交给一个空闲进程处理
->进程处理完成->php-fpm返回给web服务器->web服务器接收数据->返回给用户

模型、协议、网络

物理学家先计算出了黑洞的模型,后观察和整事了黑洞的存在,科学的进步源于数据模型的推动,我在这里得到了很大的对于编程的启发,茅塞顿开,打通了我的任督二脉,解开了很多心里的谜团。

数据模型推算出数据公式,更新数据算法,达成通信协议,硬件支持到语言支持,异步、多路复用I/O都属于如此这般产生发展的。

网络里所有的信息传递都离不开TCP/IP模型和协议族的确立,TCP/IP是网络传输的基石,负载均衡中提到的四层协议(传输层 - IP)和七层协议(应用层 - URL)计算和分发处理。

IP协议(网络层)

1.范围

IP的责任就是把数据从源传送到目的地。它不负责保证传送可靠性,流控制,包顺序和其它对于主机到主机协议来说很普通的服务。

2.接口

这个协议由主机到主机协议调用,而此协议负责调用本地网络协议将数据包传送以下一个网关或目的主机。例如TCP可以调用IP协议,在调用时传送目的地址和源地址作为参数,IP形成数据包并调用本地网络(协议)接口传送数据包。

3.操作

IP实现两个基本功能:寻址和分段。IP可以根据数据包包头中包括的目的地址将数据包传送到目的地址,在此过程中IP负责选择传送的道路,这种选择道路称为路由功能。如果有些网络内只能传送小数据包,IP可以将数据包重新组装并在报头域内注明。IP模块中包括这些基本功能,这些模块存在于网络中的每台主机和网关上,而且这些模块(特别在网关上)有路由选择和其它服务功能。对IP来说,数据包之间没有什么联系,对IP不好说什么连接或逻辑链路。

IP使用四个关键技术提供服务:服务类型,生存时间,选项和报头校验码。服务类型指希望得到的服务质量。服务类型是一个参数集,这些参数是Internet能够提供服务的代表。这种服务类型由网关使用,用于在特定的网络,或是用于下下一个要经过的网络,或是下一个要对这个数据包进行路由的网关上选择实际的传送参数。生存时间是数据包可以生存的时间上限。它由发送者设置,由经过路由的地方处理。如果未到达时生存时间为零,抛弃此数据包。对于控制函数来说选项是重要的,但对于通常的通信来说它没有存在的必要。选项包括时间戳,安全和特殊路由。报头校验码保证数据的正确传输。如果校验出错,抛弃整个数据包。

TCP协议(传输层)

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体 的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

三次握手

TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK ,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。 TCP三次握手的过程如下:

  • 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
  • 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
  • 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

连接成功

连接成功之后双方即可互相传输字节流,并随时可关闭连接,传输的数据有以下特性:

  • 传输的数据被tcp分割成了最适合发送的数据块 传递给ip协议,这个发送数据称为 报文段 或 段
  • tcp作为可靠性连接,每次发送数据段,会启动一个定时器,每次接收数据段,会发送一次确认,如果定时器没有及时收到确认,则会重发数据
  • TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
  • 两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。只要自己的接收缓存没有塞满,TCP 接收方将有多少就收多少。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。

四次挥手

建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这是由TCP的半关闭(half-close)造成的。具体过程如下所示。

  • 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
  • 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
  • 注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
  • 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
  • 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。 既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。

Http协议(应用层)

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。

技术架构

HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在。

多个中间层,比如代理,网关,或者隧道(tunnels)。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。

通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。

HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。

通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)(或者,更准确一些,URLs)来标识。

WebSocket协议

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

产生背景

在没有WebSocket协议之前,在网页中,实现一个聊天室只能使用ajax 不断轮询,请求服务器是否有数据产生,而这样的实现方法会出现一系列的问题:

  • 如果轮询时间间隔太短,会导致客户端和服务端在一个时间段内不断的进行http tcp的握手/挥手动作和http 请求头,响应头的传输,大量消耗服务器资源,如果用户量大的情况,会造成服务器的繁忙以至于宕机
  • 客户端每次只能通过发送http 请求获得服务器是否有数据返回,且数据的及时性无法保证

正因为在这种情况下,所以WebSocket出现了,它只需要一次http握手,就可以保持一个长连接,使得服务器可以主动发送消息给客户端,大大减少了轮询机制的消耗。

实现原理

在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” 。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:

  • Header: 互相沟通的Header是很小的-大概只有 2 Bytes
  • Server Push: 服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。

Nginx配置websocket服务,header头部声明Upgrade和Connection属性即可。

upstream swoole-push {# 将负载均衡模式设置为IP hash,作用:不同的客户端每次请求都会与同一节点进行交互。ip_hash;server 127.0.0.1:18101;
}server {listen 80;server_name swoole-msg;location / {# websocket的headerproxy_http_version 1.1;# 升级http1.1到websocket协议proxy_set_header Upgrade websocket;proxy_set_header Connection "Upgrade";# 将客户端host及ip信息转发到对应节点proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;# 客户端与服务端180s之内无交互,将自动断开连接。#proxy_read_timeout 180s ;# 代理访问真实服务器proxy_pass http://swoole-push;}
}

Swoole

Swoole属于php中的一个超级扩展,它会接管PHP的进程,管理和分配worker,但他依赖 PHP-Cli模式。Swoole和Yaf有相似的地方,它们都是以守护进程的模式达到提高处理性能。

Swoole内置了TCP/UDP/异步/协程/链接池等高效开发手段和方法,当然对于新模式也有新的挑战,比如swoole不能使用die,会致使worker滑落,协程使用后要注意使用回调的过程。

php中的tcp

php可通过socket函数,swoole扩展,stream流函数进行创建tcp协议的socket,绑定网卡端口,进行tcp服务端/客户端操作 在php中,我们并不需要了解tcp的握手/挥手,我们只需要知道ip:port能连接/创建 一个tcp服务端/客户端就行了。

使用php的socket,我们可以直接发送字符串,接收的也是字符串,其他一切都是语言,操作系统所需要做的事,
我们只需要处理好字符串的完整性,例如我们使用php做tcp服务端。

  • 客户端连接成功后,发送了一个"easyswoole是一个非常好的swoole框架"的字符串。
  • 而服务端每次只接收9个字节,那第一次获取只会接收到"easyswool"的残缺字符串,需要继续获取数据。

高性能

所谓高性能,就是编写的代码(程序)更高效的使用了CPU和内存,所有的高性能解决的都是这个根本问题。

在解决高性能的过程中逐步接触了Swoole中的协程+异步+链接池的做法去尽可能的达到快速响应,高吞吐率的系统。

链接池属于一个基础概念,Mysql、Redis提升性能常见的一种优化方法。

redis invoke模式,当进程结束后立即释放资源,回归线程池。

$imUserJson = \EasySwoole\RedisPool\RedisPool::invoke(function (\EasySwoole\Redis\Redis $redis) use ( $to_uid ) {$bool = $redis->get(Category::$imUserRelationName.$to_uid);return $bool;
},self::REDIS_CONN_NAME );

mysql invoke模式

use EasySwoole\ORM\DbManager;$im_chatid = DbManager::getInstance()->invoke(function ($client) use ( $data,$tableName ) {$model = ImChatModel::invoke($client,$data);$im_chatid = $model->tableName($tableName)->save();return $im_chatid;
},self::MYSQL_CONN_NAME );

Task 异步 :

use EasySwoole\EasySwoole\Task\TaskManager;TaskManager::getInstance()->async(function (){//...
});

Mysql/Redis

这个有时间在补上,推荐大家看Mysql45讲和Redis的设计与实现(书)

存储 、微服务

有时间…再写…

PHPer的进阶-Swoole网络和未来相关推荐

  1. 比特币现金支持者为网络的未来六个月做准备

    比特币现金支持者为网络的未来六个月做准备,比特币现金(BCH)网络成立已有六个月,分散化的货币基础设施不断增长.在过去的一周里,围绕生物安全信息交换所及其生态系统出现了许多新消息. 比特币现金网六个月 ...

  2. VXLAN:数据中心网络的未来

    概要 随着云计算和虚拟化技术的快速发展,数据中心网络正面临着越来越大的挑战.传统的网络架构在适应大规模数据中心的需求方面存在一些限制,如扩展性.隔离性和灵活性等方面.为了克服这些限制,并为数据中心网络 ...

  3. java进阶之---------网络编程

    java进阶之网络编程,学这个之前我们在这里简单讨论一下什么是计算机网络: 计算机网络是将不同的地理位置但是具有独立功能的计算机及其外部设备,通过通信线路连接起来,实现资源共享 这里我们就将实现这个功 ...

  4. Java语言进阶:网络编程入门

    Java语言进阶:网络编程 网络编程入门 C/S C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. 特点: 客户端和服务器是分开的,需要下载客户 ...

  5. SWOOLE进阶-06网络IO模型-阻塞模型

    前言 接着咱们前面swoole系列第五篇文章,系统在处理一些事情的时候,有的选择进程处理,有的选择线程处理,至于怎么选择是根据平台和编程语言来决定的.接下来我们需要理解什么是网络IO模型? strea ...

  6. Java进阶之网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  7. 十一.再函数进阶+requests网络爬虫

    1.函数进阶 调用函数 def fun1(): print('Hello') #这是一个没有返回值的函数 def fun2(): return 'Hello' #函数的返回值是'Hello' prin ...

  8. 网络营销未来的发展趋势

    1.互联网的发展与应用的特点 网络营销以网络为基础,伴随着网络技术和信息通讯技术的发展而发展.当前的世界已进入一个网络信息社会,信息通讯技术的发展,已经使互联网络成为一个全球性的辐射面更广.交互性更强 ...

  9. 浅谈无线网络在未来工厂中应用的可能性

    工业设施中网络连接存在的问题 统计数据表明,由于升级更换设备所需的成本和人们"设备没坏旧无需更新"的观念等多种原因,很多普通工厂仍然在车间内使用传统旧设备和工艺流程,这使得工厂在现 ...

最新文章

  1. vue--卡片层叠 组件 开发小记
  2. Linux环境编程 哈希链表结构 hlist 介绍与用例
  3. 一个高效且友好的TensorFlow图神经网络(GNN)框架:tf_geometric
  4. Log4j的isdebugEnabled的作用
  5. while用法_when 和 while 的用法区别
  6. memcmp与strcmp区别
  7. 深度学习自学(十四):人脸检测-出现cudaGetDeviceCount failed
  8. Mac系统设置系统搜索范围的方法
  9. JAVA和JVM运行原理揭秘
  10. php 判断客户端类型,基于php实现判断客户端类型
  11. opencv配置环境吐血经验
  12. python scrapy之模拟浏览器的随机更换
  13. 浅谈网络中数字签名技术
  14. MySQL的一级索引和二级索引介绍
  15. CDN加速的作用以及APP被渗透入侵的解决方案
  16. C语言编程>第三周 ⑧ 打印出杨辉三角形(要求打印出10行)
  17. 嵌入式工程师月薪最高排行榜
  18. 5万字 TypeScript入门系列(第四期)(建议收藏)
  19. php网页可视化调试工具,php-xdebug调试工具
  20. 好牛逼的技术——Android运行时Crash自动恢复框架:Recovery

热门文章

  1. 语言学计算机语言应用,语言学及应用语言学
  2. OpenJudge 1.7.13
  3. 暑假matlab最后一次训练(编程题)碎纸片的拼接复原(前2题)
  4. 树莓派(Raspberry Pi)如何修改成中文
  5. Python assert函数
  6. 计算机技术与课程整合,第十章:信息技术与课程整合
  7. 【机器学习个人笔记】part3——用sklearn实现多元线性回归
  8. JavaFX学习笔记(最全,最详细)
  9. JavaFX快速开发
  10. 运筹学实验_单纯形法