ホームページ  >  記事  >  バックエンド開発  >  PHP における非同期操作の研究_PHP チュートリアル

PHP における非同期操作の研究_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:13:35694ブラウズ

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

コードをコピーします コードは次のとおりです:

require_once 'PHPAsyncClient.php';
date_default_timezone_set('アジア/上海');

クラス AsyncTest {

const
LOG_FILE = '/debug.log';

static public function run() {
if (PHPAsyncClient::in_callback(__FILE__)) {
self::log('php Async callback');
PHPAsyncClient::parse();
return;
}
if (PHPAsyncClient ::is_main(__FILE__)) {
self::log('main run');
$async_call = PHPAsyncClient::getInstance();
$async_call->AsyncCall('AsyncTest', 'callback', array(
'content' => 'Hello World!!!',
), array(
'class' => 'AsyncTest',
'method' => 'コールバック',
'params' =>
'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();

は 3 つの静的メソッドであり、1 つは調整に使用されるログ メソッドであり、残りはすべてこのような調整方法に最初の印象を与えます。

php_async.zip

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

java-gearman-service-0.6.6.zip

5.结论

以上の構成犀牛一样大家を経て(必要に応じてGearmanを装備し、必要に応じてPyを作成します)、私は基本的にPHP拥有异步调用機能を使用します、当然、そこには一つの状態があります自己去实现また、一部の Web サービスを使用して Web コールバック ミーティングの好ポイントを無視し (問題は Web コールバック セッションが超過することです…)、この会議は継続されることを防ぎます。上面代网無法下載,脚本之家特打包下ダウンロード

原文链接:http://my.oschina.net/wakanoc/blog/101789



http://www.bkjia.com/PHPjc/326466.html

www.bkjia.com

http://www.bkjia.com/PHPjc/326466.html技術記事 1.PHP には操作が必要ですか? 一般に、PHP に適した用途は、Web ページの表示などに比べて時間のかかる作業であり、画像のサイズ変更、データの入力などの操作に該当する場合は、...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。