こんにちは私はphpファイルにコルーチンを実装する方法を探しています。アイデアは、私には潜在的に数時間または数日をもたらすことができる必要がある長いプロセスがあるということです。したがって、他のphpファイルは、コルーチンと同じファイル内の関数を呼び出して何かを更新し、そのような関数を呼び出す$coroutine.process()
と、コルーチンは最後のyieldから続行されます。これは、大型のステートマシンを使用する必要がないようにするためです。
コルーチンのphpファイルは、アイドル状態では実際には実行されないと思いますが、処理時間が与えられると、上から入力し、スイッチやgotoなどを使用して前のyieldから再起動します。次に、次の歩留まりに達すると、ファイルは現在の状態をどこかに保存して(セッションやデータベースなど)、終了します。
誰かがこれ、またはこれに似た比喩を聞いたことがありますか?どういうわけか、1つのコレクションの下で複数のコルーチンを集約および管理するためのボーナスポイント。おそらく、スレッドのような結合がサポートされているため、終了時にフローが1か所で継続されます(Goに少し似ています)。
更新:php 5.5.0では、ジェネレーターとコルーチンのサポートが追加されました。
https://github.com/php/php-src/blob/php-5.5.0/NEWS
https://wiki.php.net/rfc/generators
私はまだ試したことがないので、おそらく誰かが必要最低限の例を提案することができます。ステートマシンをコルーチンに変換しようとしています。したがって、たとえば、forループ内のスイッチコマンド(フローを追跡するのが難しく、状態が追加されるとエラーが発生しやすくなります)は、協調スレッドに変換されます。協調スレッドでは、各決定ポイントが、一時停止する整然とした線形フローで簡単に確認できます。状態はyieldキーワードで変化します。
この具体的な例は、エレベータコントローラを作成していると想像してください。エレベータの状態(STATE_RISING、STATE_LOWERING、STATE_WAITINGなど)に基づいてボタンの状態を読み取るかどうかを決定する代わりに、エレベータが各状態にあるときに実行されるサブループを含む1つのループを記述します。そのため、上昇している間は下降せず、緊急ボタン以外のボタンを読み取ることはありません。これは大したことではないように思われるかもしれませんが、チャットサーバーのような複雑なステートマシンでは、微妙なバグを導入せずにステートマシンを更新することはほとんど不可能になる可能性があります。一方、協調スレッド(コルーチン)バージョンには、デバッグが容易な、はっきりと目に見えるフローがあります。