5

こんにちは私は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つのループを記述します。そのため、上昇している間は下降せず、緊急ボタン以外のボタンを読み取ることはありません。これは大したことではないように思われるかもしれませんが、チャットサーバーのような複雑なステートマシンでは、微妙なバグを導入せずにステートマシンを更新することはほとんど不可能になる可能性があります。一方、協調スレッド(コルーチン)バージョンには、デバッグが容易な、はっきりと目に見えるフローがあります。

4

3 に答える 3

3

Swoole コルーチン ライブラリは、PHP 用の go like コルーチンを提供します。各コルーチンは、プロセスごとに 8K の RAM のみを追加します。これは、期待される基本機能 (yield や resume など) を備えたコルーチン API、コルーチン イテレーターなどの coro ユーティリティ、およびファイルシステム関数やネットワーク (ソケット クライアントとサーバー、redis クライアントとサーバー、MySQL) などの高レベルのコルーチン組み込みを提供します。クライアントなど)。

あなたの質問の2番目の要素は、コルーチンを長生きさせる機能です.セッションでcoroの状態を保存し、coroを終了/閉じることを許可しない限り、これはおそらく良い考えではありません. それ以外の場合、リクエストはコルーチンの間存続する必要があります。サービスが長寿命の PHP スクリプトによってホストされている場合、シナリオはより簡単になり、コルーチンは、終了が許可されるか、または強制的に終了されるまで単純に存続します。

Swoole は、Node.js および Go ベースのサービスと同等のパフォーマンスを発揮し、50 万以上の TCP 接続を定期的にホストする複数の運用サービスで使用されています。PHP はあまり知られていませんが、PHP は中国で開発されており、ほとんどのサポートとドキュメントが中国語を話す人に限定されているためです。

Swoole の優れた点の 1 つは、PHP クラスが、PHP なしですべての機能を使用できるように最初から設計された広範な C/C++ API をラップしていることです。同じソースを、*NIX システムと Windows の両方の PHP 拡張および/または標準ライブラリの両方として簡単にコンパイルできます。

于 2018-11-30T05:07:40.510 に答える
2

PHP はコルーチンをサポートしていません。

setcontext()もちろん、Unix プラットフォームを対象としていると仮定して、PHP 拡張機能を で作成します。

ここで、PHP 拡張機能の開始に関する StackOverflow の質問: Getting Started with PHP Extension-Development .

なぜsetcontext()ですか?setcontext()コルーチンに使えるというのはあまり知られていない事実です。別のコルーチンを呼び出すときにコンテキストを交換するだけです。

于 2012-10-17T16:54:35.720 に答える
0
于 2012-10-19T21:28:26.517 に答える