PHP协程初体验
By warezhou 2014.11.24
上次通过C扩展为PHP添加coroutine尝试失败之后,由于短期内啃下Zend可能性几乎为零,只能打语言原生能力的主意了。Google之后发现,PHP5.5引入了Generator和Coroutine新特性,于是才有了本文的诞生。
背景阅读
《当C/C++后台开发遇上Coroutine》
http://blog.youkuaiyun.com/cszhouwei/article/details/14230529
《一次失败的PHP扩展开发之旅》
http://blog.youkuaiyun.com/cszhouwei/article/details/41290673
预备知识
Generator
function my_range($start, $end, $step = 1) {
for ($i = $start; $i <= $end; $i += $step) {
yield $i;
}
}
foreach (my_range(1, 1000) as $num) {
echo $num, "\n";
}
/*
* 1
* 2
* ...
* 1000
*/
图 1 基于generator的range()实现
$range = my_range(1, 1000);
var_dump($range);
/*
* object(Generator)#1 (0) {
* }
*/
var_dump($range instanceof Iterator);
/*
* bool(true)
*/
图 2 my_range()的实现推测
由于接触PHP时日尚浅,并未深入语言实现细节,所以只能根据现象进行猜测,以下是我的一些个人理解:
- 包含yield关键字的函数比较特殊,返回值是一个Generator对象,此时函数内语句尚未真正执行

本文介绍了PHP的协程(Coroutine)特性,包括Generator的基本概念和实现Coroutine的方式。通过示例展示了如何使用send()接口实现双向通信,并提供了一个简单的AsyncServer实现,用于以同步方式书写异步代码。文章还提到了性能测试和未来展望,鼓励读者进一步优化和探索。
最低0.47元/天 解锁文章
143

被折叠的 条评论
为什么被折叠?



