ホームページ  >  記事  >  PHPフレームワーク  >  Workerman を使用して分散コンピューティング システムを実装する方法

Workerman を使用して分散コンピューティング システムを実装する方法

WBOY
WBOYオリジナル
2023-11-08 14:19:511526ブラウズ

Workerman を使用して分散コンピューティング システムを実装する方法

分散コンピューティング システムとは、コンピューターのグループを単一のシステムとして扱い、共同してコンピューティング タスクを完了するコンピューティング モデルを指します。実際には、分散コンピューティング システムは、コンピュータの数を増やすことで計算速度を向上させることができ、同時に大量のデータの処理の問題を解決できます。 Workerman は、PHP 言語を使用して分散コンピューティング システムを実装できるフレームワークです。この記事では、Workerman を使用して簡単な分散コンピューティング システムを実装する方法とコード例を紹介します。

  1. Workerman のインストール

まず、Workerman をインストールする必要があります。 Composer を通じてインストールできます。具体的なコマンドは次のとおりです:

composer require workerman/workerman
  1. サーバー プログラムの作成

server.php という名前のサーバー プログラムを作成し、これを実行します。プログラムでは、クライアントは計算タスクをサーバーに送信でき、サーバーは計算のためにタスクを計算ノードに割り当て、最終結果をクライアントに返す責任があります。以下は、server.php のコード例です。

<?php
use WorkermanWorker;

require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('text://0.0.0.0:2346');

$worker->count = 4;

$worker->onMessage = function($connection, $data){
    $params = json_decode($data, true);

    $worker_num = $params['worker_num'];
    $task_data = $params['task_data'];

    $task_id = md5($task_data);

    $task_worker = new Task($task_id);
    $task_worker->send([
        'worker_num' => $worker_num,
        'task_data' => $task_data
    ]);
  
    $connection->send(json_encode([
        'task_id' => $task_id
    ]));
};

class Task{
    protected $task_id;
  
    protected $worker_num;

    protected $task_data;

    public function __construct($task_id){
        $this->task_id = $task_id;
    }

    public function send($data){
        $task_data = json_encode([
            'task_id' => $this->task_id,
            'data' => $data
        ]);

        $worker_num = $data['worker_num'];
        $socket_name = "tcp://127.0.0.1:".(2347 + $worker_num);

        $client = stream_socket_client($socket_name, $errno, $errstr);
  
        fwrite($client, $task_data);
        fclose($client);
    }
}

Worker::runAll();

上記のコードでは、サーバーのリスニング ポートを使用して、クライアントがタスクを送信するのを待機します。サーバーがクライアントによって送信されたタスクを受け取ると、サーバーは計算のためにそのタスクをコンピューティング ノードに割り当て、結果をクライアントに返します。

Worker クラスのインスタンスでは、クライアントのリクエストを処理するために 4 つのプロセスを構成しました。 onMessage イベント コールバックでは、まずクライアントから送信された JSON データから worker_num と task_data を取得し、次に新しい Task インスタンスを作成し、タスクを計算ノードに送信して、計算結果が返されるのを待ちます。

Taskクラスには、タスクID(task_id)、計算対象のノード番号(worker_num)、計算対象のデータ(task_data)を格納します。 send() メソッドは、指定されたコンピューティング ノードにタスクを送信するために使用されます。ここでは、stream_socket_client() 関数を使用して、指定されたコンピューティング ノードと通信するための TCP ソケット クライアントを実装します。

  1. 計算ノード プログラムの作成

次に、worker.php という名前の計算ノード プログラムを作成します。サーバーが計算タスクを割り当てた後、プログラムは計算を実行し、結果をサーバーに返します。以下は、worker.php のコード例です。

<?php
use WorkermanWorker;

require_once __DIR__ . '/vendor/autoload.php';

$worker_num = intval($argv[1]);

$worker = new Worker("tcp://0.0.0.0:". (2347 + $worker_num));

$worker->onMessage = function($connection, $data){
    $params = json_decode($data, true);
    $task_id = $params['task_id'];

    $task_data = $params['data'];

    $result = strlen($task_data);

    $connection->send(json_encode([
        'task_id' => $task_id,
        'result' => $result
    ]));
};

Worker::runAll();

上記のコードでは、TCP ソケットを使用してポートをリッスンし、サーバーがコンピューティング タスクを割り当てるのを待ちます。処理が必要な計算タスクがある場合、タスクデータから処理が必要なデータを取得し、計算を行い、結果をサーバーに送信します。

  1. クライアント プログラムの作成

最後に、計算タスクをサーバーに送信して計算結果を取得するために、client.php という名前のクライアント プログラムを作成する必要があります。以下は client.php のコード例です:

<?php
use WorkermanWorker;

require_once __DIR__ . '/vendor/autoload.php';

$client = stream_socket_client("tcp://127.0.0.1:2346", $errno, $errstr);

$data = [
    'worker_num' => 1,
    'task_data' => 'Workerman is a high-performance PHP socket framework'
];

$json_data = json_encode($data);

fwrite($client, $json_data);
$result = fread($client, 8192);

fclose($client);

$result_data = json_decode($result, true);

$task_id = $result_data['task_id'];

foreach(range(0,3) as $worker_num){
    $worker_client = stream_socket_client("tcp://127.0.0.1:". (2347 + $worker_num), $errno, $errstr);

    fwrite($worker_client, json_encode([
        'task_id' => $task_id,
        'worker_num' => $worker_num
    ]));

    $worker_result = fread($worker_client, 8192);

    $worker_result_data = json_decode($worker_result, true);

    if($worker_result_data['task_id'] == $task_id){
        echo "Result: " . $worker_result_data['result'] . PHP_EOL;
        break;
    }
}

上記のコードでは、まず計算ノードに接続するための TCP ソケット クライアントを作成します。ここでは fread() 関数を使用して、サーバーから計算タスクの戻り結果を取得します。次に、task_id をパラメータとしてすべての計算ノードに送信し、結果が返されるのを待ちます。タスクID (task_id) に基づいて、どの計算ノードが計算結果を返したかを識別できます。最後に計算結果を出力します。

概要

上記は、サーバー プログラム、コンピューティング ノード プログラム、クライアント プログラムの作成、特定のコード例の提供など、Workerman を使用して分散コンピューティング システムを実装する方法の詳細な手順です。この記事で提供されている例は、Workerman を使用して分散コンピューティング システムを実装する方法の基本的なアイデアを示しているだけであることに注意してください。実際のアプリケーションには、負荷分散、タスク割り当て戦略など、まだいくつかの問題があります。ただし、これらの問題はすべて、Workerman フレームワークを注意深く調べてコードを調整することで解決できます。

以上がWorkerman を使用して分散コンピューティング システムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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