golang context 很好用,就使用php实现了
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,用于请求级别的 顶级contextTodo()
返回一个空context,当不清楚要使用哪个 Context 或 函数还没实现 Context,你应该使用 Todo()WithValue()
返回 携带 parent 副本的ValueCtx并把key val关联,用于请求范围内的数据使用上下文值 。使用 WithValue() 会使用流程模糊,但是有时我们不得不用,需要我们谨慎使用 。
include_once __DIR__.'/../vendor/autoload.php';use function ZweiContextWithValue;use function ZweiContextBackground;$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 ZweiContextWithCancel;use function ZweiContextBackground;use function ZweiContextCanceled;use ZweiContextContext;use ZweiContextCancelCtx;$ctx = Background();/* @var CancelCtx $ctx1*/list($ctx1, $cancelFunc) = WithCancel($ctx);try {rpc1($ctx1);rpc2($ctx1);Business($ctx1);$cancelFunc();// 取消 CancelCtxecho "手动取消n";} catch (Exception $e) {$cancelFunc();echo "异常取消n";throw $e;}var_dump($ctx1->Err() === Canceled());
【PHP 实现Golang Context包】
推荐阅读
- 用 MySQL 实现分布式锁,你听过吗?
- 一篇文章教会你使用JS+CSS实现一个简单加载进度条的效果
- css实现三角符号
- AD域用户密码过期-用户如何实现AD域密码自助修改或重置?
- java分别使用递归和非递归实现二叉树中序遍历
- 裂变营销的3个层次,让你实现指数增长
- 手动实现一款轻量 高效的分布式RPC框架
- 为梦想努力拼搏作文?拼搏实现梦想作文
- 手把手教你用python实现自动登录
- 简单分析实现运维利器---web远程ssh终端录像回放