您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > php

PHP8 - 纤程的使用

时间:2022-10-18 14:06:36  来源:今日头条  作者:思跃喵

概述

php8 (php8 >= 8.1.0 ) 中新增了纤程特性,官方文档地址如下:

https://www.php.NET/manual/zh/language.fibers.php

本文将讲解这个新特性的一些简单使用

基本概念

摘自官方文档

纤程(Fiber)表示一组有完整栈、可中断的功能。 纤程可以在调用堆栈中的任何位置被挂起,在纤程内暂停执行,直到稍后恢复。

纤程可以暂停整个执行堆栈,所以该函数的直接调用者不需要改变调用这个函数的方式。

你可以在调用堆栈的任意地方使用 Fiber::suspend() 中断执行(也就是说,Fiber::suspend() 的调用位置可以在一个深度嵌套的函数中,甚至可以不存在)。

与无栈的 Generator 不同, 每一个 Fiber 拥有自己的调用栈,并允许在一个深度嵌套的函数调用中将它们暂停。 声明了中断(interruption)点的函数(即调用 Fiber::suspend()) 不需要改变自己的返回类型,不像使用 yield 一样需要返回一个 Generator 实例。

纤程可以在任意函数调用中被暂停,包括那些在 PHP VM 中被调用的函数。 例如被用于 array_map() 的函数或者提供 Iterator 实例以被 foreach 调用的方法。

纤程一旦被暂停,可以使用 Fiber::resume() 传递任意值、或者使用 Fiber::throw() 向纤程抛出一个异常以恢复运行。这个值或者异常将会在 Fiber::suspend() 中被返回(抛出)。

基本使用

<?php
// 声明一个纤程
$fiber = new Fiber(function (): void {
    echo 'fiber is start now ' . PHP_EOL;
    // 使纤程暂停,并抛出值 ‘suspend value’,可以被外部接收
    $value = Fiber::suspend('suspend value '); // 接收到 first
    echo 'fiber is resume now ' . PHP_EOL;
    // 第二次暂停
    $value = Fiber::suspend("the second time"); // 接收到 second
    echo 'fiber is finish now ' . PHP_EOL;
});

// 纤程开始执行,并且拿到暂停时抛出的值
$res = $fiber->start(); // fiber is start now 

echo "fiber start:{$res} " . PHP_EOL; // fiber start:suspend value
echo "fiber status:{$fiber->isSuspended()} " . PHP_EOL; // fiber status:1 
echo "fiber status:{$fiber->isRunning()} " . PHP_EOL; // fiber status:
echo "fiber status:{$fiber->isStarted()} " . PHP_EOL; // fiber status:1 
echo "fiber status:{$fiber->isTerminated()} " . PHP_EOL; // fiber status:

// 恢复fiber运行
$res2 = $fiber->resume('first'); // fiber is resume now 
// 恢复运行时拿到的 $res2 是下一次暂停给出的值
echo "fiber resume:{$res2} " . PHP_EOL; // fiber resume:the second time

// 再次恢复 fiber 运行
$res3 = $fiber->resume('second'); // fiber is finish now 
// 此时 $fiber实际上已经结束,拿到的 $res3,是个NULL
var_dump($res3);  // NULL

// 此时已经结束,再次调用会爆出 PHP Fatal Error
$res4 = $fiber->resume(); // PHP Fatal error:  Uncaught FiberError: Cannot resume a fiber that is not suspended
// 因此一般可以进行一次判断
if($fiber->isSuspended()){
    $res = $fiber->resume();
}

问题

一、纤程如果没有执行结束,当脚本执行完毕时,会不会被释放?

理论上来说PHP仍然是单线程在执行,一旦脚本结束,纤程没有执行的部分依然会被释放

二、纤程是异步执行的吗?

我认为纤程仍然是个同步执行的过程,尤其是Fiber本身能力的执行,尤其是以上这个例子。

但是从官方文档中可知,纤程有独立的调用栈,允许在栈中任意地方中断;

只要封装的足够好,不难实现异步的能力,当然具体的实现还没有深入去思考

三、纤程在具体业务上有场景使用吗?

目前我还没有想到能够直接使用纤程的具体业务场景

能想到的都是比较抽象的场景,要经过多层封装之后当做工具库进行使用

从纤程的特性及能力来说,几乎就是一个加强版的生成器(Generator),理论上来说以前基于生成器所做的那些工具库(或者框架?),都能用纤程来进行更好的实现,拭目以待。

总结

从以上简单的调用和问题上来看

新特性纤程在业务上能够使用的场景并不多

可能更多是作为一些比较底层的能力封装支撑,例如异步执行库、事件循环库等

希望很快这个特性会出现在各种框架里面



Tags:PHP8   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
PHP8 - 纤程的使用
概述php8 (php8 >= 8.1.0 ) 中新增了纤程特性,官方文档地址如下:https://www.php.net/manual/zh/language.fibers.php本文将讲解这个新特性的一些简单使用基本概念摘自官方文...【详细内容】
2022-10-18  Search: PHP8  点击:(460)  评论:(0)  加入收藏
CentOS7下安装PHP8.0
准备安装包(PHP: Hypertext Preprocessor)下载安装包以及组件wget https://www.php.net/distributions/php-8.0.0.tar.bz2wget https://github.com/phpredis/phpredis/archive...【详细内容】
2021-11-09  Search: PHP8  点击:(2215)  评论:(0)  加入收藏
CentOS7下编译安装PHP8.0.7
一、环境说明本文中使用本地VM虚机部署测试。OS:CentOS Linux release 7.8.2003 (Core)虚机配置:2核CPU、4G内存①系统为CentOS 7.8 x64最小化安装,部署前已完成系统初始化、...【详细内容】
2021-06-25  Search: PHP8  点击:(540)  评论:(0)  加入收藏
PHP药丸?PHP8于2020年底正式发布
自1994年PHP诞生以来,PHP语言经历了许多改进,即使很多人唱衰PHP药丸,但它的发展还是依旧在持续增长,今年已经是第25周年也还是没完,且上了杜蕾斯的封面!PHP去年发布了7.4版本,性能...【详细内容】
2020-07-21  Search: PHP8  点击:(390)  评论:(0)  加入收藏
▌简易百科推荐
PHP 8.3 新特性解读
作者 | Deepak Vohra译者 | 明知山策划 | 丁晓昀本文是 PHP 8.x 系列文章的一部分。你可以通过订阅 RSS 来接收有关本系列文章的更新通知。PHP 仍然是互联网上使用最广泛的...【详细内容】
2024-03-12    InfoQ  Tags:PHP 8.3   点击:(26)  评论:(0)  加入收藏
如何使用PHP SSH2模块执行远程Linux命令
PHP SSH2扩展是用于在PHP程序中使用SSH(安全壳协议)的一种扩展。它允许建立加密连接和执行远程命令、上传和下载文件等操作,十分方便实用。下面我将为大家详细介绍一下该扩展的...【详细内容】
2024-01-26  开源技术小栈  微信公众号  Tags:PHP   点击:(104)  评论:(0)  加入收藏
如何使用PHP抓取百度首页排名?方法与步骤详解
PHP是一种广泛应用于网站开发的脚本语言,具备简单、灵活、高效的特点,因此在SEO优化中也得到了广泛的应用。本文将深入解析如何使用PHP抓取百度首页排名,并介绍一些相关的内容...【详细内容】
2024-01-12  ·小钟无艳遇  今日头条  Tags:php   点击:(82)  评论:(0)  加入收藏
2023 年,PHP 停滞不前
热心开发者分析了一波 GitHub 的数据后发现,编程语言为 PHP 的 PR 数量逐年下降。GitHut 是通过 GitHub 数据专门分析编程语言的项目。它基于各种编程语言在 GitHub 中的使用...【详细内容】
2023-12-17  OSC开源社区    Tags:PHP   点击:(17)  评论:(0)  加入收藏
全方位深度剖析PHP7底层源码
PHP7是一门流行的Web编程语言,以其易学易用和广泛的应用场景而备受欢迎。本文将为您深入讲解PHP7的特性和优势,包括性能提升、语法改进和新特性等方面,帮助您了解和掌握这门灵...【详细内容】
2023-12-06  笔画春秋润    Tags:PHP7   点击:(185)  评论:(0)  加入收藏
PHP 8.3 正式发布!
作者 | Tim Anderson编译 | 如烟出品 | 51CTO技术栈(微信号:blog51cto)PHP 8.3 正式发布,最主要的变化是添加“类常量显式类型”、“只读属性深拷贝”,“以及对随机性功能的补充...【详细内容】
2023-11-27    51CTO  Tags:PHP   点击:(169)  评论:(0)  加入收藏
原来真的可以在 Next.js 中写 PHP 代码?
Next.js 14 近期发布,其中一个重大的功能点是 Server Actions 成为稳定版,因其超前和熟悉的开发方式,在社交网络上引起了一阵讨论,应该是下面这张图的内容了。图片有人说这是又...【详细内容】
2023-11-07  编程界  微信公众号  Tags:PHP   点击:(297)  评论:(0)  加入收藏
PHP编程语言,这个老古董,还有人用吗?
近年来,随着大数据、云计算和人工智能等新兴技术的崛起,许多传统的编程语言悄然退出了舞台。而PHP(PHP Hypertext Preprocessor)作为最古老的编程语言之一,是否也在逐渐沦为过去...【详细内容】
2023-11-02  程序员职场故事    Tags:PHP编程   点击:(235)  评论:(0)  加入收藏
PHP如何获取前几天日期时间
在PHP中,我们经常需要获取当前日期的前几天日期时间,以便进行一些特定的计算或数据处理。本文将介绍如何使用PHP获取前几天的日期时间,并提供具体的实现示例和代码。文章地址ht...【详细内容】
2023-08-10  学无止境    Tags:PHP   点击:(377)  评论:(0)  加入收藏
PHP+Python轻松抓取网络图片资源
你是否曾经遇到过需要从网络上获取大量图片的需求?你是否曾经为手动下载图片而感到疲惫?那么,本文将为你介绍一种高效、易用的方法&mdash;&mdash;利用PHP和Python编写爬虫程序,...【详细内容】
2023-05-09  俊俊的生活日记    Tags:PHP   点击:(337)  评论:(0)  加入收藏
站内最新
站内热门
站内头条