コルーチン実装失敗

ここ二日ほど某イベント用に PHP でコルーチンを実現するエクステンションを作ってました。
・・・が、どうも ZendEngine の VM と、コルーチンを呼び出す/コルーチンから復帰する際のコンテキスト切り替えの相性が悪いらしく、特定の条件でしかまともに動かないので泣く泣くボツに。


ちなみに

<?php
function generator($arg)
{
    list($i, $j, ) = $arg;
    while (true) {
        co_resume($i);
        $i += $j;
    }
}

$co1 = co_create('generator', array(0, 2));
$co2 = co_create('generator', array(100, -1));
for ($i = 0; $i < 100; $i++) {
    var_dump(co_call($co1));
    var_dump(co_call($co2));
}
exit;

このコードで

int(0)
int(100)
int(2)
int(99)
(中略)
int(196)
int(2)
int(198)
int(1)

このような出力ができるところまでは作り込めていました。
実現できるとアツいネタだっただけに残念です。


いまいちインパクトに欠けるけど、ストリームI/O、配列操作、C から PHP 関数の呼び出し、とエクステンション開発の際に役立ちそうなネタは一通りあるし、無難に YAML の方でいこうかなあ。
時間が許せば、もう一つ別のエクステンションでリソースの扱いと OO まで話したいところ。