xtlsoft / xcoroutine
PHP 协程。
v0.1.1-stable
2017-08-17 00:26 UTC
Requires
- php: >=5.5
This package is auto-updated.
Last update: 2024-09-25 16:58:29 UTC
README
XCoroutine,PHP 协程。
安装
composer require xtlsoft/xcoroutine
介绍
- 任务:任务实例。您可以向其中传入一个生成器,然后通过我们的封装对其进行操作。
- 调度器:多任务执行封装。您可以向其中添加许多任务,然后执行。每个任务都有一个唯一的ID,一个任务进行部分计算调用yield后,让下一个任务进行计算,以此循环,实现多任务管理。
- 系统调用:任务之间以及任务与调度器之间传递数据、互相操作的接口。
- 动态对象:动态编程类,使您的类支持动态定义/销毁变量和方法。
使用
- 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
- 任务使用例子:
<?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
- 调度器使用例子#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();
- 系统调用使用例子:
<?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();
- 动态对象使用例子:
<?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);