php为什么需要异步编程?php异步编程的详解(附示例)
本篇文章给大家带来的内容是关于php为什么需要异步编程?php异步编程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
我对 php 异步的知识还比较混乱,写这篇是为了整理,可能有错。
传统的 php-fpm 一个进程执行一个请求,要达到多少并发,就要生成多少个进程。更糟糕的是每次请求都需要重新编译执行,导致并发一直上不来。因此出现了 Swoole 和 WorkerMan 两个国内流行的常驻内存框架[1]。这两个框架原理都是通过事件循环,让程序一直停留在内存,等待外部请求,达到高并发。
为什么需要异步
先来看一个例子
在工作目录下新建文件 slowServer.php
开启服务
开另一个终端,安装依赖
新建文件 worker.php
开启服务器
在浏览器开启两个标签,都打开网址 http://localhost:8082 。这时可以看到终端输出“1”,过了一会儿又输出“1”,原因是8081服务器在处理第一个请求的时候阻塞在了等待8081返回之中,等第一个请求结束后,才开始处理第二个请求。也就是说请求是一个一个执行的,要达到多少个并发,就要建立多少个进程,跟 php-fpm 一样。现在修改一下代码
现在打开服务,再在浏览器发起请求,发现第二个“1”在请求后就马上输出了,而这时第一个请求还没结束。这表明进程不再阻塞,并发量取决于 cpu 和 内存,而不是进程数。
为什么需要异步
通过上面的例子已经很明白了,reactphp 框架通过把 http 请求变成异步,让 onMessage 函数变成非阻塞,cpu 可以去处理下一个请求。即从 cpu 循环等待 8081 返回,变成了 epoll 等待。
异步的意义在于把 cpu 从 io 等待中解放出来,可以处理其他计算任务。 如果你想知道怎么用框架实现异步,看到这里就可以了。WorkerMan 配合 ReactPHP 或者自身的 AsyncTcpConnection 已经可以满足很多 io 请求异步化的需求。下面继续讨论这些框架是怎么做到异步的。
哪些地方应该被做成异步
通过上面的例子已经知道一旦执行到不需要 cpu,但是要等待 io 的时候,应该把 io 的过程做成异步。
实现事件循环
上面的例子是通过 reactphp 把 http 请求变成了异步,其实 WorkerMan 框架本身也是异步的,下面来看看 WorkerMan 是怎么使 onMessage 函数可以异步接受请求。先来新建下面这个文件 react.php
开始执行
在另一个终端执行
这时就会看到第一个终端输出'1'。
我之前写过一篇文章《php使用epoll》,是这篇文章的基础。那篇文章里事件回调是通过定时来实现,即
而这里,事件回调是通过检测 fd 是否有写入内容来实现,这个过程不需要 cpu 参与。当 fd 有内容写入时,会调函数 'react',这时开始使用 cpu。如果这时候进程执行另一个异步请求,比如用 reactphp 框架请求一个网页,那么程序会让出 cpu,此时如果有另一个请求进来,就可以回调执行另一个 'react' 函数。由此提高了并发量。
协程
生成器 Generater
这是生成器的 PHP 官方文档 http://php.net/manual/zh/lang...
生成器就是每次程序执行到 yield 的时候保存状态,然后返回 $i,是否继续执行 gen_one_to_three 里的循环,取决于主程序是否继续调用
什么是协程
上面的程序另一种写法是
由此可见,协程就是一种对函数的封装,使其变成一种可以被中断的函数,行为更像是子进程或子线程,而不是函数。协程的具体写法这里不细写,因为协程的写法十分复杂,可能需要再做一层封装才能好用。
协程与异步
既然协程可以被中断,那么只要在程序发起请求后发起事件循环,然后用 yield 返回,然后程序继续执行主程序部分,等事件返回后触发函数,执行 Generatot::next() 或 Generator::send() 来继续执行协程部分。封装好后就好像没有异步回调函数一样,和同步函数很像。
现在已经有 ampphp 和 swoole 两个框架封装了协程,有兴趣可以了解一下。
以上就是php为什么需要异步编程?php异步编程的详解(附示例)的详细内容,大型PHP项目实战直播加入link免费获取学习资料。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
过期的云策略可否继续沿用?
随着越来越多的企业加入到云计算竞赛队伍中,确定个性化云策略应该是部署中最关键的一步。从众多IT公司之间的合作关系中,显而易见地发现都在往混合云方向发展。但是即便公司希望利用混合云战略,他们首先要面临着无穷无尽的配置、网络、服务商等等选择。更何况许多企业根本没有资源或时间来评估哪些是最适合他们的需求。 采用公共,私有,混合和多云策略的驱动力都指向简化运营,敏捷性,响应网络和基础架构,以利用即将进行的技术创新。选择公共云之外的策略的大多数公司将其决策追溯到安全问题,导致混合云采用的爆炸式增长,使企业能够实现私有云和公共云连接的好处。根据Pierre Audoin Consultants的一项研究,平均而言,由接受调查的企业运营的典型多云环境使用58%的私有云资源和42%的公共云。该咨询公司表示,预计在两年内,公有云将适度增长(44%),私有云将占有56%的份额。 随着公司将公共互联网的使用作为其云战略的一部分,对服务商提供的安全公共连接的压力和需求也将随之增加。而且随着通过公用网络在全球范围内路由的核心业务流量持续爆炸,网络服务商也正在寻找优化网络的方法。随着通信量的快速变化,保持网络的可...
- 下一篇
在Joomla中创建自定义404页面
默认情况下,Joomla不提供可以轻松创建和管理的404页面。当你的访问者访问你网站上的一个失效的URL时,404是非常有用的。 我将演示如何创建自定义404页面。 我们将创建一篇文章,添加一个菜单链接,然后在模板文件夹的文件中添加一些代码。 步骤1:创建一篇文章 创建自定义404页面的第一步是创建新文章。 标题:创建一些特定于404错误的内容,因为它可能会显示在浏览器的标题栏中。别名:键入简单的别名,如404。类别:您可以使用未分类或创建另一个类别。文章文本:添加您的404图像或文本,或按您的意愿设计它。在本例中,我制作了自己的404图像。 步骤2:编辑机器人选项 在同一篇文章中,单击“发布”选项。查看右边的列并单击“Robots”字段。选择“No index , No follow”以防止在搜索引擎中索引此特定页面。点击“保存并关闭”。 步骤3:创建一个隐藏的菜单 菜单项类型:选择错误404页面文章。菜单标题:任何你想要的,如错误404页。别名:键入简单的别名,如404。单击“保存”。 步骤4:复制链接 从菜单中复制URL并将其存储在记事本中,因为您将在error.php文件中使用...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果