xtlsoft/xcoroutine

PHP 协程。

v0.1.1-stable 2017-08-17 00:26 UTC

This package is auto-updated.

Last update: 2024-09-25 16:58:29 UTC


README

XCoroutine,PHP 协程。

安装

composer require xtlsoft/xcoroutine

介绍

  • 任务:任务实例。您可以向其中传入一个生成器,然后通过我们的封装对其进行操作。
  • 调度器:多任务执行封装。您可以向其中添加许多任务,然后执行。每个任务都有一个唯一的ID,一个任务进行部分计算调用yield后,让下一个任务进行计算,以此循环,实现多任务管理。
  • 系统调用:任务之间以及任务与调度器之间传递数据、互相操作的接口。
  • 动态对象:动态编程类,使您的类支持动态定义/销毁变量和方法。

使用

  1. yield 初识例子:
    <?php
        
        foreach(range(1,10) as $i){
            echo $i." ";
        }
        echo "<br>\n";
        
        function xrange($a,$b,$c=1){
            for($i = $a; $a <= $b; $i+=$c){
                yield $i;
            }
        }
        
        foreach(xrange(1,10) as $i){
            echo $i." ";
        }
        
    输出:
    1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
  2. 任务使用例子:
    <?php
        require "vendor/autoload.php";
        use Coroutine\Task;
        
        function TaskExample(){
            while(true){
                $text = (yield);
                echo "TaskRecv $text <br />\n";
            }
        }
        
        $Task = new Task(TaskExample());
        $Task->run();
        $Task->run("A Test Text 1");
        $Task->setSendValue("Another Test Text");
        $Task->run();
        
    输出:
    TaskRecv A Test Text 1 
    TaskRecv Another Test Text 
  3. 调度器使用例子#1:
    <?php
        require_once "vendor/autoload.php";
        use Coroutine\Scheduler;
        
        function TaskExample($num){
            for($i=0; $i<10; ++$i){
                echo "Task$num RUN $i <br>\n";
                yield;
            }
        }
        
        $scheduler = new Scheduler();
        $scheduler->newTask(TaskExample(1));
        $scheduler->newTask(TaskExample(2));
        $scheduler->newTask(TaskExample(3));
        
        $scheduler->run();
    例子#2
    <?php
        require_once "vendor/autoload.php";
        use Coroutine\Scheduler;
        
        function t1(){
            for($i=0; $i<10; ++$i){
                echo "t1 RUN $i <br>\n";
                yield;
            }
        }
        function t2(){
            for($i=0; $i<10; ++$i){
                echo "t2 RUN $i <br>\n";
                yield;
            }
        }
        
        $scheduler = new Scheduler();
        $scheduler->newTask(t1());
        $scheduler->newTask(t2());
        
        $scheduler->run();
  4. 系统调用使用例子:
    <?php
        require_once "vendor/autoload.php";
        use Coroutine\Scheduler;
        use Coroutine\SystemCall;
        
        function TaskExample($num){
            //获取TaskId
            $tid = (yield SystemCall::getTaskId());
            
            for($i=0; $i<10; ++$i){
                echo "Task$num $tid RUN $i <br>\n";
                if($i == 3){
                    yield SystemCall::killTask(1);
                }
                if($i == 5){
                    yield SystemCall::newTask(Task2());
                }
                yield;
            }
        }
        
        function Task2(){
            $tid = (yield SystemCall::getTaskId());
            for($i=0; $i<3; ++$i){
                echo "Another Task $tid RUN $i <br>\n";
            }
        }
        
        $scheduler = new Scheduler();
        $scheduler->newTask(TaskExample(1));
        $scheduler->newTask(TaskExample(2));
        $scheduler->newTask(TaskExample(3));
        
        $scheduler->run();
  5. 动态对象使用例子:
    <?php
        require("vendor/autoload.php");
        use Coroutine\DynamicObject;
        
        $obj = new DynamicObject;
        
        $obj->abcd = 123;
        
        $obj->myFunc = function($a) use ($obj){
            return ("\$a * abcd = ".($a * $obj->abcd)."<br />\n");
        };
        
        echo $obj->myFunc(2);
        
        unset($obj->abcd);
        
        echo $obj->myFunc(1);
        
        $obj->myFunc = function($a, $b){
            return ("\$a + \$b = ".($a+$b)."<br />\n");
        };
        
        $obj->myFunc(123,321);