ホームページ  >  記事  >  php教程  >  PHPにおける非同期操作の実装に関する研究

PHPにおける非同期操作の実装に関する研究

WBOY
WBOYオリジナル
2016-06-21 08:50:26908ブラウズ

1. PHP にはなぜ非同期操作が必要ですか?

一般に、画像のサイズ変更、ビッグデータのインポート、EDM や SMS の一括送信など、時間のかかる操作を行う場合、PHP は Web ページの表示などの短期間のタスクに適しています。操作がタイムアウトになりました。無限のタイムアウトなどを設定できると言えます。また、PHP には fastcgi という動作モードがあることも知っておく必要があります。これは、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 部分に移動して、最初にテスト コードを作成します。

<span style="font-family: 'Comic Sans MS', cursive;"><span style="font-size: 14px;"><?php
require_once &#39;PHPAsyncClient.php&#39;;
date_default_timezone_set(&#39;Asia/Shanghai&#39;);

class AsyncTest {

    const
        LOG_FILE = &#39;/debug.log&#39;;

    static public function run() {
        if (PHPAsyncClient::in_callback(__FILE__)) {
            self::log(&#39;php Async callback&#39;);
            PHPAsyncClient::parse();
            return;
        }
        if (PHPAsyncClient::is_main(__FILE__)) {
            self::log(&#39;main run&#39;);
            $async_call = PHPAsyncClient::getInstance();
            $async_call->AsyncCall('AsyncTest', 'callback', array(
                'content' => 'Hello World!!!',
            ), array(
                'class' => 'AsyncTest',
                'method' => 'callback',
                'params' => array(
                    'content' => 'Hello Callback!',
                ),
            ), __FILE__);
            return;
        }
    }

    static public function callback($args) {
        self::log('AsyncTest callback run');
        self::log('AsyncTest callback args:'.print_r($args, true));
    }

    static public function log($content) {
        $fullname = dirname(__FILE__).self::LOG_FILE;
        $content = date('[Y-m-d H:i:s]').$content."\n";
        file_put_contents($fullname, $content, FILE_APPEND);
    }
}

AsyncTest::run();
?></span></span>

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

ダウンロード: php_async.zip

それでは、win では Gearman をインストールできない…という方も多いかもしれませんので、Java 版の Gearman サーバーも入れておきます。

ダウンロード: java-gearman-service-0.6.6.zip

5. 結論

サイのような大きなものを設定した後 (Gearman をインストールし、Py スクリプトを実行する必要があります)、基本的に PHP に非同期呼び出し関数を与えました。もちろん、状態維持ホースもあります。 . あなた自身がそれを認識する必要があります。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。