当前位置:首页 > 科技  > 软件

让我们认识一下PHP非阻塞并发框架Amp

来源: 责编: 时间:2024-05-27 17:24:55 223观看
导读什么是异步编程?当使用PHP编写的应用程序I/O任务时,程序会在执行某个任务之前,一定要等待之前的任务完成,这时CPU会有很多时间处于空闲状态,这不仅会降低应用程序性能,还会降低硬件利用率。比如,当程序需要从数据库中读取大

什么是异步编程?

当使用PHP编写的应用程序I/O任务时,程序会在执行某个任务之前,一定要等待之前的任务完成,这时CPU会有很多时间处于空闲状态,这不仅会降低应用程序性能,还会降低硬件利用率。比如,当程序需要从数据库中读取大量的数据时,由于需要等待I/O操作完成,程序的执行速度会非常缓慢。RrB28资讯网——每日最新资讯28at.com

因此,我们通过事件库,在程序执行的过程中,不需要等待某个任务完成才能执行下一个任务。这种编程模式可以极大地提高程序的效率和响应速度,尤其在处理复杂的I/O操作时表现得更为出色,而这就是异步编程。RrB28资讯网——每日最新资讯28at.com

Amphp

Amphp/Amp 是一个轻量级、高效的PHP异步库,为开发人员提供了一种处理I/O密集型任务和网络操作的新方式。它基于coroutine(协程)模型,让你能够编写出并发执行的任务,从而最大化服务器资源利用率,提高应用性能。RrB28资讯网——每日最新资讯28at.com

核心技术

Amp的核心是它的事件循环和coroutine(协程)支持。事件循环监听系统级别的事件,如文件描述符的状态变化或定时器触发,而coroutine则允许代码在不阻塞主线程的情况下进行暂停和恢复。这种设计使得开发者可以以同步代码的风格编写异步程序,降低了异步编程的学习曲线。RrB28资讯网——每日最新资讯28at.com

此外,Amp还提供了Promise/Try机制,这是一套处理异步操作成功与失败的工具。通过Promise对象,你可以轻松地链式处理异步操作,并优雅地处理错误。RrB28资讯网——每日最新资讯28at.com

应用场景

  • 网络I/O: Amp非常适合处理大量HTTP请求、TCP连接或其他网络通信,如:Websocket。它可以并行处理这些连接,显著提升Web服务的吞吐量。
  • 数据库交互: 异步数据库操作可以大大提高数据读取和写入的速度,尤其是在需要处理多个查询时。
  • 文件系统操作: 读写大文件或者遍历大量目录时,Amp可以通过异步操作避免阻塞主线程。
  • 后台任务: 对于耗时较长的后台任务,如数据处理、爬虫或批量更新,Amp可以实现更快的执行速度。

AMPHP是一个事件驱动的PHP库集合,设计时考虑了纤程和并发性。amphp/amp专门提供了future和cancellation作为异步编程的基本原语。我们现在使用Revolt,而不是使用amphp/amp发布事件循环实现。RrB28资讯网——每日最新资讯28at.com

PHP大量使用PHP 8.1附带的纤程来编写异步代码,就像同步、阻塞代码一样。与早期版本相比,不需要基于生成器的协程或回调。与线程类似,每个纤程都有自己的调用堆栈,但纤程由事件循环协同调度。使用Amp/async()并发运行。RrB28资讯网——每日最新资讯28at.com

动机

传统上,PHP遵循顺序执行模型。PHP引擎按顺序一行接一行地执行。然而,程序通常由多个独立的子程序组成,这些子程序可以同时执行。RrB28资讯网——每日最新资讯28at.com

如果查询数据库,则以阻塞方式发送查询并等待数据库服务器的响应。一旦你有了答案,你就可以开始做下一件事。我们可以发送下一个数据库查询,或者对一个API执行HTTP调用,而不是坐在那里什么也不做。让我们利用我们通常花在等待I/O上的时间!RrB28资讯网——每日最新资讯28at.com

Revolt允许这样的并发I/O操作。我们通过避免回调来保持低认知负荷。我们的API可以像任何其他库一样使用,除了它们也可以并发工作,因为我们在后台使用了非阻塞I/O。使用Amp/async()并发运行,并在需要时使用Future::await()等。RrB28资讯网——每日最新资讯28at.com

多年来,在PHP中实现并发的技术有很多,例如PHP 5中的回调和生成器。这些方法都有“你的函数是什么颜色”的问题,我们通过PHP 8.1中的Fibers解决了这个问题。它们允许多个独立调用堆栈的并发性。RrB28资讯网——每日最新资讯28at.com

纤程由事件循环协同调度,这就是为什么它们也被称为协程。重要的是要理解,在任何给定的时间只有一个协程在运行,所有其他协程在此期间暂停。RrB28资讯网——每日最新资讯28at.com

你可以将协程比作一台使用单个CPU内核运行多个程序的计算机。每个程序都有一个执行时间段。然而,协程并不是抢占式的。他们没有固定的时间。他们必须主动给予事件循环的控制权。RrB28资讯网——每日最新资讯28at.com

任何阻塞I/O函数在等待I/O时阻塞整个进程。你会想要避开他们。如果你还没有阅读安装指南,可以看看Hello World示例,它演示了阻塞函数的效果。AMPHP提供的库避免了I/O阻塞。RrB28资讯网——每日最新资讯28at.com

安装

此包可以作为Composer依赖项安装。RrB28资讯网——每日最新资讯28at.com

composer require amphp/amp

如果您使用这个库,很可能希望使用Revolt来调度事件,您应该单独要求Revolt,即使它是作为依赖项自动安装的。RrB28资讯网——每日最新资讯28at.com

composer require revolt/event-loop

这些包为PHP中的异步/并发应用程序提供了基本的构建块。我们提供了很多建立在这些基础上的软件包。RrB28资讯网——每日最新资讯28at.com

例如以下RrB28资讯网——每日最新资讯28at.com

  • amphp/byte-stream提供流抽象
  • amphp/socket为UDP和TCP(包括TLS)提供套
  • amphp/parallel提供并行处理以利用多个CPU内核并卸载阻塞操作
  • amphp/http-client提供HTTP/1.1和HTTP/2客户端
  • amphp/http-server提供HTTP/1.1和HTTP/2应用服务器
  • amphp/mysql和amphp/postgres用于非阻塞数据库访问

要求

此软件包需要PHP 8.1或更高版本。无需扩展!仅当应用需要大量并发套接字连接时才需要扩展,通常此限制配置为最多1024个文件描述符。RrB28资讯网——每日最新资讯28at.com

使用

协程

协同程序是可中断的功能。在PHP中,它们可以使用纤程来实现。RrB28资讯网——每日最新资讯28at.com

以前版本的JavaScript使用生成器来实现类似的目的,但是纤程可以在调用堆栈中的任何地方中断,这使得以前的样板文件(如Amp/call())变得不必要。RrB28资讯网——每日最新资讯28at.com

在任何给定的时间,只有一个纤程在运行。当协程挂起时,协程的执行会暂时中断,允许其他任务运行。一旦计时器到期,流操作可能,或任何等待的Future完成,执行将恢复。RrB28资讯网——每日最新资讯28at.com

协同程序的低级挂起和恢复由Revolt的SuspensionAPI处理。RrB28资讯网——每日最新资讯28at.com

<?phprequire __DIR__ . '/vendor/autoload.php';use Revolt/EventLoop;$suspension = EventLoop::getSuspension();EventLoop::delay(5, function () use ($suspension): void {    print '++ Executing callback created by EventLoop::delay()' . PHP_EOL;    $suspension->resume(null);});print '++ Suspending to event loop...' . PHP_EOL;$suspension->suspend();print '++ Script end' . PHP_EOL;

在Revolt事件循环上注册的回调会自动作为协程运行,挂起它们是安全的。除了事件循环API,Amp/async()还可以用来启动独立的调用栈。RrB28资讯网——每日最新资讯28at.com

<?phpuse function Amp/delay;require __DIR__ . '/vendor/autoload.php';Amp/async(function () {    print '++ Executing callback passed to async()' . PHP_EOL;    delay(3);    print '++ Finished callback passed to async()' . PHP_EOL;});print '++ Suspending to event loop...' . PHP_EOL;delay(5);print '++ Script end' . PHP_EOL;


RrB28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-91034-0.html让我们认识一下PHP非阻塞并发框架Amp

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: C# 类(Class):构建面向对象程序的基础

下一篇: 北京试点医保外卖购 目前京东可下单 支付宝医保支付

标签:
  • 热门焦点
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
Top