PHP における非同期操作の実装に関する研究 春に関する古詩 読書についての引用 読書についての手書きメモ

WBOY
リリース: 2016-07-29 08:50:21
オリジナル
912 人が閲覧しました

1. PHP にはなぜ非同期操作が必要なのでしょうか?

一般的にPHPは、Webページ表示などの短時間の作業に適しており、画像のリサイズやビッグデータのインポート、EDMやSMSの送信など、時間のかかる操作を一括で行う場合には楽に操作できます。タイムアウトが発生します。無限のタイムアウトなどを設定できると言えます。また、PHP には fastcgi という動作モードがあることも知っておく必要があります。PHP は無期限にタイムアウトしないため、fastcgi がタイムアウトしないという意味ではありません。 fastcgi がタイムアウトしないようにするには、運用担当者や保守担当者と話し合うことをお勧めします...

この時点で、非同期操作が機能します。これはノンブロッキング操作であるため、操作はすぐに戻ります。その後、バックグラウンドでゆっくりと作業します。タイムアウトするかどうかは関係ありません。現在のプロセス/スレッドでは作業していません。素晴らしいと思いませんか? しかし、実は落とし穴でもあります...

2. PHP は非同期操作を実装できますか?

答えは「はい」ですが、インターネット上のさまざまな純粋な PHP 実装は少し扱いに​​くいです。ソケット モード、一時停止プロセス モード、さらにはプロセスを直接フォークするものもあります。とても良いですね、あらゆる種類の神々が魔法の力を発揮します。運用担当者や保守担当者が見たら、間違いなく×××××されるでしょう。Webサーバーが殺されなければおかしいでしょう...

この非同期操作を実現する他の良い方法はありますか?はい、あとはプラグインを有効にする方法を考えるだけです。 PECL の主流のプラグイン ソリューションを確認してください。××MQ (メッセージ キュー) が多数あります。その中で、Gearman というプラグインが目に留まりました。詳しくは紹介しません。クリックして接続してください(紹介文を参照)。

3. Gearman を選ぶ理由

他に何もなければ、多くのクライアントがあり、多くの言語でクライアントをサポートしているため、ワーカーを作成するのにほとんどの言語を使用できます。個人的には、Shenma を使って好きなようにワーカーを書くことができる言語論争に非常に腹を立てています。データ永続性のサポート (つまり、キューがデータベース媒体に保存されるため、障害回復が容易です) とクラスターのサポート (実際、多くの ××MQ がこれらの機能を備えています) があります。 PECL には拡張機能があり、純粋な PHP で実装された拡張機能もあります。ともあれ、このギアマンは長生きしており、諸々の問題は基本的に解決されている。

4. 基本的な考え方

Gearman プラグインを使用すると、はるかに簡単になります。これは、gearman にタスクを送信し、実行されたタスクを送信して、ワーカーが PHP cli を呼び出して PHP コードを実行するのを待つことを意味します。

私は Python ワーカーを作成しました (なぜ Python を使用するのかは聞かないでください。1. Python を知っています。2. Linux にランタイムをインストールする必要はありません。) 独自のアイデアに基づいて PHP ワーカーを作成できます。 、でもまあ、私は PHP を実行しているワーカーをあまり信用していません。他の言語の場合は、Java、node.js、または他の言語を使用してワーカーを実装してみることができます。 Golang でワーカーを書くことに興味のある友人は、私に連絡してください。

phpasync_worker_py

申し訳ありませんが、コメントはありません。構成ファイルと py スクリプト。基本的な機能は、呼び出しパラメーターを分析して、PHP Cli を呼び出すことです。それだけです。 py スクリプトを実行するには、python gearman モジュールを自分でインストールしてください。

次に、PHP 部分に移動してテスト コードを開始します:

<ol>
<li><span><span><?php  </span></span></li><li><span>require_once</span><span> </span><span>'PHPAsyncClient.php'</span><span>;  </span></li><li><span>date_default_timezone_set(</span><span>'Asia/Shanghai'</span><span>);  </span></li><li><span> </span></li><li><span>class</span><span> AsyncTest {  </span></li><li><span> </span></li><li><span>    </span><span>const</span><span> </span></li><li><span>        LOG_FILE = </span><span>'/debug.log'</span><span>;  </span></li><li><span> </span></li><li><span>    </span><span>static</span><span> </span><span>public</span><span> </span><span>function</span><span> run() {  </span></li><li><span>        </span><span>if</span><span> (PHPAsyncClient::in_callback(</span><span>__FILE__</span><span>)) {  </span></li><li><span>            self::log(</span><span>'php Async callback'</span><span>);  </span></li><li><span>            PHPAsyncClient::parse();  </span></li><li><span>            </span><span>return</span><span>;  </span></li><li><span>        }  </span></li><li><span>        </span><span>if</span><span> (PHPAsyncClient::is_main(</span><span>__FILE__</span><span>)) {  </span></li><li><span>            self::log(</span><span>'main run'</span><span>);  </span></li><li><span>            </span><span>$async_call</span><span> = PHPAsyncClient::getInstance();  </span></li><li><span>            </span><span>$async_call</span><span>->AsyncCall(</span><span>'AsyncTest'</span><span>, </span><span>'callback'</span><span>, </span><span>array</span><span>(  </span></span></li>
<li>
<span>                </span><span>'content'</span><span> => </span><span>'Hello World!!!'</span><span>,  </span>
</li>
<li>
<span>            ), </span><span>array</span><span>(  </span>
</li>
<li>
<span>                </span><span>'class'</span><span> => </span><span>'AsyncTest'</span><span>,  </span>
</li>
<li>
<span>                </span><span>'method'</span><span> => </span><span>'callback'</span><span>,  </span>
</li>
<li>
<span>                </span><span>'params'</span><span> => </span><span>array</span><span>(  </span>
</li>
<li>
<span>                    </span><span>'content'</span><span> => </span><span>'Hello Callback!'</span><span>,  </span>
</li>
<li><span>                ),  </span></li>
<li>
<span>            ), </span><span>__FILE__</span><span>);  </span>
</li>
<li>
<span>            </span><span>return</span><span>;  </span>
</li>
<li><span>        }  </span></li>
<li><span>    }  </span></li>
<li><span> </span></li>
<li>
<span>    </span><span>static</span><span> </span><span>public</span><span> </span><span>function</span><span> callback(</span><span>$args</span><span>) {  </span>
</li>
<li>
<span>        self::log(</span><span>'AsyncTest callback run'</span><span>);  </span>
</li>
<li>
<span>        self::log(</span><span>'AsyncTest callback args:'</span><span>.print_r(</span><span>$args</span><span>, true));  </span>
</li>
<li><span>    }  </span></li>
<li><span> </span></li>
<li>
<span>    </span><span>static</span><span> </span><span>public</span><span> </span><span>function</span><span> log(</span><span>$content</span><span>) {  </span>
</li>
<li>
<span>        </span><span>$fullname</span><span> = dirname(</span><span>__FILE__</span><span>).self::LOG_FILE;  </span>
</li>
<li>
<span>        </span><span>$content</span><span> = </span><span>date</span><span>(</span><span>'[Y-m-d H:i:s]'</span><span>).</span><span>$content</span><span>.</span><span>"\n"</span><span>;  </span>
</li>
<li>
<span>        </span><span>file_put_contents</span><span>(</span><span>$fullname</span><span>, </span><span>$content</span><span>, FILE_APPEND);  </span>
</li>
<li><span>    }  </span></li>
<li><span>}  </span></li>
<li><span> </span></li>
<li><span>AsyncTest::run(); </span></li>
</ol>
ログイン後にコピー

静的メソッドは 3 つだけで、1 つはデバッグ用のログ メソッドで、その他はリテラルです。この例は、この呼び出しメソッドの予備的な印象です。次に、PHP のすべてのソース コードを直接アップロードします:

php_async.zip

それでは、Gearman は win 環境ではインストールできないと言う人が多いかもしれません...そこで、Java バージョンの Gearman サーバーも置きます。

java-gearman-service-0.6.6.zip

5. 結論

サイと同じくらい大きなものを設定した後 (Gearman をインストールして Py スクリプトを実行するため)、基本的には PHP を独自に作成しました。非同期呼び出し機能はもちろん、自分で実装する必要がある状態維持機能もあります。したがって、この解決策は実際には良くなく、複雑すぎることがわかりました。 Web コールバックを行うには、いくつかの Web サービス メソッドを使用する方がよいでしょう (問題は、Web コールバックもタイムアウトしてしまうことです...)。続報に注意してください。

元のリンク: http://my.oschina.net/wakanoc/blog/101789

上記では、PHP を含む非同期操作の実装に関する研究と、それに関連する側面について紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!