>  기사  >  PHP 프레임워크  >  Workerman을 사용하여 분산 컴퓨팅 시스템을 구현하는 방법

Workerman을 사용하여 분산 컴퓨팅 시스템을 구현하는 방법

WBOY
WBOY원래의
2023-11-08 14:19:511535검색

Workerman을 사용하여 분산 컴퓨팅 시스템을 구현하는 방법

분산 컴퓨팅 시스템은 컴퓨터 그룹을 단일 시스템으로 처리하여 컴퓨팅 작업을 공동으로 완료하는 컴퓨팅 모델을 의미합니다. 실제로 분산 컴퓨팅 시스템은 컴퓨터 수를 늘려 컴퓨팅 속도를 높이는 동시에 대용량 데이터 처리 문제를 해결할 수 있다. Workerman은 PHP 언어를 사용하여 분산 컴퓨팅 시스템을 구현할 수 있는 프레임워크입니다. 이 기사에서는 Workerman을 사용하여 간단한 분산 컴퓨팅 시스템을 구현하는 방법을 소개하고 코드 예제를 제공합니다.

  1. Workerman 설치

먼저 Workerman을 설치해야 합니다. Composer를 통해 설치할 수 있습니다.

composer require workerman/workerman
  1. 서버 프로그램 만들기

이 프로그램을 실행하면 클라이언트가 컴퓨팅 작업을 서버 측에 제출할 수 있습니다. 계산을 위해 컴퓨팅 노드에 작업을 할당하고 최종 결과를 클라이언트에 반환하는 일을 담당합니다. 다음은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.