ホームページ  >  記事  >  PHPフレームワーク  >  Workerman が非同期タスクを実装する方法 (コード付き)

Workerman が非同期タスクを実装する方法 (コード付き)

angryTom
angryTom転載
2019-11-23 17:21:084255ブラウズ

次のコラム workerman の使い方チュートリアル では、workerman を使って非同期タスクを実装する方法を紹介します。

Workerman が非同期タスクを実装する方法 (コード付き)

1. 問題

問題が発生しました。PHP はシングルスレッドなので、マルチスレッドを実現できません。糸通しです。次に、複数のリンクが 1 つのスレッド、つまり 1 つの接続プロセスを使用し、それを処理するプロセスを開く

##2 というシナリオを使用する必要があります。 #workerman はどうでしょうか 非同期タスクを実装します。 Workerman は、問題の解決とドキュメントへの回答を手伝ってくれます。質問:

主要なビジネスが長時間ブロックされるのを避けるために、大量のビジネスを非同期で処理する方法。たとえば、1,000 人のユーザーに電子メールを送信したいと考えています。このプロセスは非常に遅いため、数秒間ブロックされる可能性があります。このプロセス中はメイン プロセスがブロックされるため、後続のリクエストに影響します。このような重いタスクをどのようにしてユーザーに引き継ぐことができますか?非同期処理のための他のプロセス。

回答:

このマシン、他のサーバー、さらにはサーバー クラスター上にいくつかのタスク プロセスを事前に確立して、負荷の高いビジネスを処理することができます。タスク プロセスの数は、たとえば 10 個に増やすことができます。当事者は、AsyncTcpConnection を使用して、非同期処理のためにこれらのタスク プロセスにデータを非同期に送信し、処理結果を非同期で取得します。

タスク プロセス サーバー

use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// task worker,使用Text协议
$task_worker = new Worker('Text://0.0.0.0:12345');
// task进程数可以根据需要多开一些
$task_worker->count = 100;
$task_worker->name = 'TaskWorker';
//只有php7才支持task->reusePort,可以让每个task进程均衡的接收任务
//$task->reusePort = true;
$task_worker->onMessage = function($connection, $task_data)
{
     // 假设发来的是json数据
     $task_data = json_decode($task_data, true);
     // 根据task_data处理相应的任务逻辑.... 得到结果,这里省略....
     $task_result = ......
     // 发送结果
     $connection->send(json_encode($task_result));
};
Worker::runAll();

ワーカーマンを呼び出す

use Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/Workerman/Autoloader.php';
// websocket服务
$worker = new Worker('websocket://0.0.0.0:8080');
$worker->onMessage = function($ws_connection, $message)
{
    // 与远程task服务建立异步连接,ip为远程task服务的ip,如果是本机就是127.0.0.1,如果是集群就是lvs的ip
    $task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345');
    // 任务及参数数据
    $task_data = array(
        'function' => 'send_mail',
        'args'       => array('from'=>'xxx', 'to'=>'xxx', 'contents'=>'xxx'),
    );
    // 发送数据
    $task_connection->send(json_encode($task_data));
    // 异步获得结果
    $task_connection->onMessage = function($task_connection, $task_result)use($ws_connection)
    {
         // 结果
         var_dump($task_result);
         // 获得结果后记得关闭异步连接
         $task_connection->close();
         // 通知对应的websocket客户端任务完成
         $ws_connection->send('task complete');
    };
    // 执行异步连接
    $task_connection->connect();
}
Worker::runAll();

このようにして、重いタスクはローカルマシンまたは他のサーバーのプロセスに引き継がれ、タスク完了後に結果が非同期で受信されます。ビジネスプロセスがブロックされることはありません。 Workerman 関連の技術記事の詳細については、

Workerman チュートリアル

列にアクセスして学習してください。

以上がWorkerman が非同期タスクを実装する方法 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。