前言
第一部分: 半协程调度器
- 统一生成器接口
- 生成器迭代
- 生成器返回值
- 生成器委托
- 改写 return
- 抽象异步模型
- 引入异常处理
- 异常: 嵌套任务透传
- 异常: 传递流程
- 异常: 重新进行 CPS 变换
- 异常: 重新加入 Async
- Syscall 与 Context
- 调度器: 里程碑
- spawn
- callcc
- race 与 timeout
- all 与 parallel
- channel 与协程间通信
- 无缓存 channel
- 缓存 channel
- channel 演示
- FutureTask 与 fork
第二部分: Koa
- 穿越地心之旅
- 洋葱圈模型
- rightReduce与中间件compose
- Koa::Application
- Koa::Context
- Koa::Request
- Koa::Response
- Koa - HelloWorld
- Middleware Interface
- Middleware: 全局异常处理
- Middleware: Router
- Middleware: 请求超时
- 一个综合示例
附录
参考
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
穿越地心之旅
穿越地心之旅
(如果你了解洋葱圈模型,略过本小节)
首先让我们对洋葱圈模型有一个直观的认识:
物理学上,地球可划分为岩石圈、软流层、地幔、外核和内核5层。
化学上,地球被划分为地壳、上地幔、下地幔、外核和内核。地质学上对地球各层的划分
演示Koa的中间件之前,我们用函数来描述一场穿越地心之旅:
<?php
function crust($next)
{
echo "到达<地壳>\n";
$next();
echo "离开<地壳>\n";
}
function upperMantle($next)
{
echo "到达<上地幔>\n";
$next();
echo "离开<上地幔>\n";
}
function mantle($next)
{
echo "到达<下地幔>\n";
$next();
echo "离开<下地幔>\n";
}
function outerCore($next)
{
echo "到达<外核>\n";
$next();
echo "离开<外核>\n";
}
function innerCore($next)
{
echo "到达<内核>\n";
}
// 我们逆序组合组合, 返回入口
function makeTravel(...$layers)
{
$next = null;
$i = count($layers);
while ($i--) {
$layer = $layers[$i];
$next = function() use($layer, $next) {
// 这里next指向穿越下一次的函数,作为参数传递给上一层调用
$layer($next);
};
}
return $next;
}
// 我们途径 crust -> upperMantle -> mantle -> outerCore -> innerCore 到达地心
// 然后穿越另一半球 -> outerCore -> mantle -> upperMantle -> crust
$travel = makeTravel("crust", "upperMantle", "mantle", "outerCore", "innerCore");
$travel(); // output:
/*
到达<地壳>
到达<上地幔>
到达<下地幔>
到达<外核>
到达<内核>
离开<外核>
离开<下地幔>
离开<上地幔>
离开<地壳>
*/
<?php
function outerCore1($next)
{
echo "到达<外核>\n";
// 我们放弃内核,仅仅绕外壳一周,从另一侧返回地表
// $next();
echo "离开<外核>\n";
}
$travel = makeTravel("crust", "upperMantle", "mantle", "outerCore1", "innerCore");
$travel(); // output:
/*
到达<地壳>
到达<上地幔>
到达<下地幔>
到达<外核>
离开<外核>
离开<下地幔>
离开<上地幔>
离开<地壳>
*/
<?php
function innerCore1($next)
{
// 我们到达内核之前遭遇了岩浆,计划终止,等待救援
throw new \Exception("岩浆");
echo "到达<内核>\n";
}
$travel = makeTravel("crust", "upperMantle", "mantle", "outerCore", "innerCore1");
$travel(); // output:
/*
到达<地壳>
到达<上地幔>
到达<下地幔>
到达<外核>
Fatal error: Uncaught exception 'Exception' with message '岩浆'
*/
<?php
function mantle1($next)
{
echo "到达<下地幔>\n";
// 我们在下地幔的救援团队及时赶到 (try catch)
try {
$next();
} catch (\Exception $ex) {
echo "遇到", $ex->getMessage(), "\n";
}
// 我们仍旧没有去往内核,,绕道对端下地幔,返回地表
echo "离开<下地幔>\n";
}
$travel = makeTravel("crust", "upperMantle", "mantle1", "outerCore", "innerCore1");
$travel(); // output:
/*
到达<地壳>
到达<上地幔>
到达<下地幔>
到达<外核>
遇到岩浆
离开<下地幔>
离开<上地幔>
离开<地壳>
*/
<?php
function upperMantle1($next)
{
// 我们放弃对去程上地幔的暂留
// echo "到达<上地幔>\n";
$next();
// 只在返程时暂留
echo "离开<上地幔>\n";
}
function outerCore2($next)
{
// 我们决定只在去程考察外核
echo "到达<外核>\n";
$next();
// 因为温度过高,去程匆匆离开外壳
// echo "离开<外核>\n";
}
$travel = makeTravel("crust", "upperMantle1", "mantle1", "outerCore2", "innerCore1");
$travel(); // output:
/*
到达<地壳>
到达<上地幔>
到达<下地幔>
到达<外核>
遇到岩浆
离开<下地幔>
离开<上地幔>
离开<地壳>
*/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论