ここ二日ほど某イベント用に 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 まで話したいところ。