사용자 정의 프로세스

Webman에서는 Workerman처럼 사용자 정의 리스너 또는 프로세스를 만들 수 있습니다.

주의
Windows 사용자는 사용자 정의 프로세스를 시작하려면 php windows.php를 사용하여 Webman을 시작해야 합니다.

사용자 정의 HTTP 서비스

때때로 특정 요구가 있을 수 있으며, 이 경우 Webman HTTP 서비스의 핵심 코드를 변경해야 합니다. 이때 사용자 정의 프로세스를 사용하여 이를 구현할 수 있습니다.

예를 들어 app\Server.php를 새로 만듭니다.

<?php

namespace app;

use Webman\App;

class Server extends App
{
    // 여기서 Webman\App의 메서드를 재정의합니다.
}

config/process.php에 다음 구성을 추가합니다.

use Workerman\Worker;

return [
    // ... 다른 구성 생략 ...

    'my-http' => [
        'handler' => app\Server::class,
        'listen' => 'http://0.0.0.0:8686',
        'count' => 8, // 프로세스 수
        'user' => '',
        'group' => '',
        'reusePort' => true,
        'constructor' => [
            'requestClass' => \support\Request::class, // request 클래스 설정
            'logger' => \support\Log::channel('default'), // 로그 인스턴스
            'appPath' => app_path(), // app 디렉토리 위치
            'publicPath' => public_path() // public 디렉토리 위치
        ]
    ]
];

提示
Webman에서 제공하는 HTTP 프로세스를 끄려면 config/server.php에서 listen=>''로 설정하면 됩니다.

사용자 정의 WebSocket 리스너 예제

app/Pusher.php를 새로 만듭니다.

<?php
namespace app;

use Workerman\Connection\TcpConnection;

class Pusher
{
    public function onConnect(TcpConnection $connection)
    {
        echo "onConnect\n";
    }

    public function onWebSocketConnect(TcpConnection $connection, $http_buffer)
    {
        echo "onWebSocketConnect\n";
    }

    public function onMessage(TcpConnection $connection, $data)
    {
        $connection->send($data);
    }

    public function onClose(TcpConnection $connection)
    {
        echo "onClose\n";
    }
}

주의: 모든 onXXX 속성은 public입니다.

config/process.php에 다음 구성을 추가합니다.

return [
    // ... 다른 프로세스 구성 생략 ...

    // websocket_test는 프로세스 이름입니다.
    'websocket_test' => [
        // 여기에서 프로세스 클래스를 지정합니다. 위에서 정의한 Pusher 클래스입니다.
        'handler' => app\Pusher::class,
        'listen'  => 'websocket://0.0.0.0:8888',
        'count'   => 1,
    ],
];

사용자 정의 비리스너 프로세스 예제

app/TaskTest.php를 새로 만듭니다.

<?php
namespace app;

use Workerman\Timer;
use support\Db;

class TaskTest
{

    public function onWorkerStart()
    {
        // 매 10초마다 데이터베이스에 새로운 사용자가 등록되었는지 확인합니다.
        Timer::add(10, function(){
            Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
        });
    }

}

config/process.php에 다음 구성을 추가합니다.

return [
    // ... 다른 프로세스 구성 생략 ...

    'task' => [
        'handler'  => app\TaskTest::class
    ],
];

주의: listen이 생략되면 어떤 포트도 리스닝하지 않으며, count가 생략되면 프로세스 수는 기본값 1입니다.

구성 파일 설명

하나의 프로세스에 대한 전체 구성 정의는 다음과 같습니다.

return [
    // ... 

    // websocket_test는 프로세스 이름입니다.
    'websocket_test' => [
        // 여기에서 프로세스 클래스를 지정합니다.
        'handler' => app\Pusher::class,
        // 리스닝하는 프로토콜 IP 및 포트 (선택 사항)
        'listen'  => 'websocket://0.0.0.0:8888',
        // 프로세스 수 (선택 사항, 기본값 1)
        'count'   => 2,
        // 프로세스 실행 사용자 (선택 사항, 기본값 현재 사용자)
        'user'    => '',
        // 프로세스 실행 사용자 그룹 (선택 사항, 기본값 현재 사용자 그룹)
        'group'   => '',
        // 현재 프로세스가 reload를 지원하는지 여부 (선택 사항, 기본값 true)
        'reloadable' => true,
        // reusePort를 사용할 것인지 여부
        'reusePort'  => true,
        // transport (선택 사항, ssl을 활성화해야 할 때 ssl로 설정, 기본값 tcp)
        'transport'  => 'tcp',
        // context (선택 사항, transport가 ssl일 때는 인증서 경로를 전달해야 함)
        'context'    => [], 
        // 프로세스 클래스 생성자 인수, 여기서는 process\Pusher::class 클래스의 생성자 인수 (선택 사항)
        'constructor' => [],
        // 현재 프로세스의 활성화 여부
        'enable' => true
    ],
];

요약

Webman의 사용자 정의 프로세스는 실제로 Workerman의 간단한 래퍼로, 구성과 비즈니스를 분리하고 Workerman의 onXXX 콜백을 클래스 메서드를 통해 구현하며, 다른 사용법은 Workerman과 완전히 동일합니다.