ホームページ  >  記事  >  バックエンド開発  >  PHP は非同期操作を実装します_PHP チュートリアル

PHP は非同期操作を実装します_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:38:451459ブラウズ

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 部分に移動し、最初にテストコードをアップロードします:

リーリー
  1. リーリー
  2. require_once 'PHPAsyncClient.php';  
  3. date_default_timezone_set('アジア/上海');  
  4.  
  5. クラス AsyncTest {
  6.  
  7.     定数
  8.         LOG_FILE = '/debug.log';  
  9.  
  10.     static public function run() {
  11.         if (PHPAsyncClient::in_callback(__FILE__)) {
  12.             self::log('php 非同期 コールバック');  
  13.             PHPAsyncClient::parse();  
  14.             戻る;  
  15.         }
  16.         if (PHPAsyncClient::is_main(__FILE__)) {
  17.             self::log('メイン実行');  
  18.             $async_call = PHPAsyncClient::getInstance();  
  19.             $async_call->AsyncCall('AsyncTest', 'コールバック',array(
  20.                 「コンテンツ」=> 「Hello World!!!」、
  21.             )、配列(
  22.                 'クラス' => 'AsyncTest'、
  23.                 「メソッド」 => 「コールバック」、
  24.                 'params' => 配列(
  25.                     「コンテンツ」=> 「こんにちは、コールバック!」、
  26.                 )、
  27.             )、 __ファイル__);  
  28.             戻る;  
  29.         }
  30.     }
  31.  
  32.     static public function callback($args) {
  33.         self::log('AsyncTest コールバック 実行');  
  34.         self::log('AsyncTest コールバック args:'.print_r($args, true));  
  35.     }
  36.  
  37.     static public function log($content) {
  38.         $fullname = dirname(__FILE__).self::LOG_FILE;  
  39.         $content = date('[Y-m-d H:i:s]').$content."n";  
  40.         file_put_contents($fullname, $content, FILE_APPEND);  
  41.     }
  42. }
  43.  
  44. AsyncTest::run(); 

3 つの静的メソッドについては、1 つはレギュレーションに使用されるログ メソッドで、残りはすべてこのレギュレーション方式に対する最初の印象です。

php_async.zip

その後、この会議には非常に多くの人が参加し、win 下で gearman がインストールされていないため、Java 版の gearman サーバーも解放されました。

java-gearman-service-0.6.6.zip

5.结论

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

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/735076.html技術記事 1. PHP にはなぜ非同期操作が必要なのでしょうか? 一般的に、PHP は、Web ページの表示などの短時間のタスクに適しています。画像のサイズ変更やビッグデータのインポートなど、時間のかかる操作であれば...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。