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

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

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

什么是异步编程?

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

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

Amphp

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

核心技术

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

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

应用场景

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

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

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

动机

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

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

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

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

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

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

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

安装

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

composer require amphp/amp

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

composer require revolt/event-loop

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

例如以下lwH28资讯网——每日最新资讯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个文件描述符。lwH28资讯网——每日最新资讯28at.com

使用

协程

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

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

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

协同程序的低级挂起和恢复由Revolt的SuspensionAPI处理。lwH28资讯网——每日最新资讯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()还可以用来启动独立的调用栈。lwH28资讯网——每日最新资讯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;


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

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

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

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

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

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO 11S新品发布会

    iQOO将在7月4日19:00举行新品发布会,推出杭州亚运会电竞赛事官方用机iQOO 11S。
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top