php fiber 应用

参考

基于 PHP Fiber(纤程)的游戏开发分析-腾讯云开发者社区-腾讯云PHP 8.1 引入的 Fibers 为游戏开发带来新机遇,能管理渲染、物理计算等任务且不阻塞主线程。它支持并发,提升效率,简单易用,但也有局限,如单线程本质、上下文切换开销、调试复杂及生态系统不成熟。https://cloud.tencent.com/developer/article/2509749说明

  • 多个用户参与游戏
  • 每个人猜各自的最终数字
  • 每人做多猜五次

代码:

php 复制代码
function getroundnum() {
    $num = rand(0, 30);
    return $num;
}
class Persion {
    public function __construct(public string $name) {

    }
}
class GuessNum extends Persion {
    private int $resultnum;
    public bool $result;
    private int $num;
    private int $type;
    public function __construct(public string $name, public int $gap = 1) {
        $this->num = getroundnum();
        $this->resultnum = getroundnum();
        $this->result = false;
    }
    //type 1加数字 2减数字
    private function getnextnum() {
        if ($this->num === 0) {
            return $this->num;
        }
        $this->num = match ($this->type) {
            1 => $this->num + $this->gap,
            2 => $this->num - $this->gap,
        };
    }
    public function doguessonce() {
        var_dump("resultnum:" . $this->resultnum . " name:" . $this->name . " num:" . $this->num);
        $result = false;
        $this->type = 0;
        match (true) {
            $this->num == $this->resultnum => $result = true,
            $this->num > $this->resultnum => $this->type = 2, //减
            $this->num < $this->resultnum => $this->type = 1//加
        };
        $this->result = $result;
        if (!$result) {
            $this->getnextnum();
        }
    }
}
php 复制代码
$persion_list = [
    new GuessNum("test1", 1),
    new GuessNum("npc", 2),
];

$fibers = [];

foreach ($persion_list as $entity) {
    $fibers[] = new Fiber(function () use ($entity) {
        while (true) {
            $entity->doguessonce($entity);
            Fiber::suspend($entity);
        }
    });
}

// Start all fibers
$endresult = false;
foreach ($fibers as $fiber) {
    $value = $fiber->start();
    if ($value->result) {
        $endresult = true;
        var_dump("game end success name:" . $value->name);
        break;
    }
}
if (!$endresult) {
    for ($i = 0; $i < 5; $i++) {
        foreach ($fibers as $fiber) {
            $value = $fiber->resume();
            if ($value->result) {
                $endresult = true;
                var_dump("game end success name:" . $value->name);
                break;
            }
        }
        sleep(1);
        var_dump("once end");
    }
}
var_dump("game end ~");

输出

php 复制代码
string(30) "resultnum:12 name:test1 num:22"
string(27) "resultnum:7 name:npc num:17"
string(30) "resultnum:12 name:test1 num:21"
string(27) "resultnum:7 name:npc num:15"
string(8) "once end"
string(30) "resultnum:12 name:test1 num:20"
string(27) "resultnum:7 name:npc num:13"
string(8) "once end"
string(30) "resultnum:12 name:test1 num:19"
string(27) "resultnum:7 name:npc num:11"
string(8) "once end"
string(30) "resultnum:12 name:test1 num:18"
string(26) "resultnum:7 name:npc num:9"
string(8) "once end"
string(30) "resultnum:12 name:test1 num:17"
string(26) "resultnum:7 name:npc num:7"
string(25) "game end success name:npc"
string(8) "once end"
string(10) "game end ~"
相关推荐
Magnum Lehar27 分钟前
3d游戏引擎EngineTest的系统实现3
java·开发语言·游戏引擎
Mcworld85742 分钟前
java集合
java·开发语言·windows
成功人chen某43 分钟前
配置VScodePython环境Python was not found;
开发语言·python
James. 常德 student44 分钟前
网络安全知识点
安全·web安全·php
海绵宝宝贾克斯儿2 小时前
C++中如何实现一个单例模式?
开发语言·c++·单例模式
史迪仔01122 小时前
[python] Python单例模式:__new__与线程安全解析
开发语言·python·单例模式
isyangli_blog2 小时前
(1-4)Java Object类、Final、注解、设计模式、抽象类、接口、内部类
java·开发语言
三块钱07942 小时前
【原创】基于视觉大模型gemma-3-4b实现短视频自动识别内容并生成解说文案
开发语言·python·音视频
易只轻松熊2 小时前
C++(20): 文件输入输出库 —— <fstream>
开发语言·c++·算法
芯眼2 小时前
ALIENTEK精英STM32F103开发板 实验0测试程序详解
开发语言·c++·stm32·单片机·嵌入式硬件·社交电子