github地址 :https://github.com/qq1060656096/php-go-context
context利用闭坑指南
1. 将一个Context参数作为第一个参数通报给传入和传出要求之间调用路径上的每个函数2. 对应做事器要求该当创建一个 context 3. 不应该在构造体 、数组、map、工具中存储context,相反应该将 context 显示的通报给每个须要它的函数4. 它们之间的调用连必须传播高下文,利用 WithCancel() WithDeadline() WithTimeout() WithValue()5. 当一个 context 取消时,从它派生出的所有 context 也会被取消。6. 同一个Context可以通报给在不同的goroutine中运行的函数;高下文对付多个goroutine同时利用是安全的。7. 不要通报 nil Context,即是函数许可。如果你不知道利用哪个 context,请利用 Todo()8. 对付所有堵塞或者永劫的操作都是该当可以取消的。9. 利用 WithValue() 会利用流程模糊,但是有时我们不得不用,须要我们谨慎利用。10. 开拓业务时,老代码函数不必遵守,Context参数作为老函数的第一个参数。11. 开拓业务时,如果有新旧代码,请保持新代码必须传 context12. 开拓业务时,如果有新旧代码,请保持老代码没有通报 context 做兼容,如设置默认值
Background()
返回一个空context,它不会被取消,只作为根 context,用于要求级别的 顶级context
返回一个空context,当不清楚要利用哪个 Context 或 函数还没实现 Context,你该当利用 Todo()

返回 携带 parent 副本的ValueCtx并把key val关联,用于要求范围内的数据利用高下文值。 利用 WithValue() 会利用流程模糊,但是有时我们不得不用,须要我们谨慎利用。
include_once __DIR__.'/../vendor/autoload.php';use function Zwei\Context\WithValue;use function Zwei\Context\Background;$ctx1 = WithValue(Background(), "key1", "valueV1");$ctx2 = WithValue($ctx1, "key1", "valueV2");var_dump($ctx1->Value("key1"));//输出:valueV1var_dump($ctx2->Value("key1"));//输出:valueV2
WithCancel()
返回带有父级副本 CancelCtx,当返回的 cancel函数被调用时,当前 context 和 子context Done 返回 true。 CancelCtx开释与此高下有关的资源,因此代码该当在高下文中运行操作完成或者非常后调用。
<?php# 示例文件路径 Examples/WithCancel.phpinclude_once __DIR__.'/../vendor/autoload.php';use function Zwei\Context\WithCancel;use function Zwei\Context\Background;use function Zwei\Context\Canceled;use Zwei\Context\Context;use Zwei\Context\CancelCtx;$ctx = Background();/ @var CancelCtx $ctx1/list($ctx1, $cancelFunc) = WithCancel($ctx);try { rpc1($ctx1); rpc2($ctx1); Business($ctx1); $cancelFunc();// 取消 CancelCtx echo "手动取消\n";} catch (Exception $e) { $cancelFunc(); echo "非常取消\n"; throw $e;}var_dump($ctx1->Err() === Canceled());