PHP协程初体验
By warezhou 2014.11.24
上次通过C扩展为PHP添加coroutine尝试失败之后,由于短期内啃下Zend可能性几乎为零,只能打语言原生能力的主意了。Google之后发现,PHP5.5引入了Generator和Coroutine新特性,于是才有了本文的诞生。
背景阅读
《当C/C++后台开发遇上Coroutine》
http://blog.csdn.net/cszhouwei/article/details/14230529
《一次失败的PHP扩展开发之旅》
http://blog.csdn.net/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对象,此时函数内语句尚未真正执行
- Generator对象是Iterator接口实例,可以通过rewind()、current()、next()、valid()系列接