Настроенные процессы

В webman вы можете настраивать слушателей или процессы, как и в workerman.

Внимание
Пользователям Windows необходимо запускать webman с помощью php windows.php, чтобы запустить настроенные процессы.

Настроенная http служба

Иногда у вас могут быть особые требования, которые требуют изменения исходного кода http службы webman; в этом случае можно использовать настраиваемые процессы.

Например, создайте файл 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
        ]
    ]
];

Подсказка
Если вы хотите отключить встроенный http процесс webman, просто установите listen=>'' в config/server.php.

Пример настраиваемого 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'   => '',
        // поддерживает ли данный процесс перезагрузку (необязательно, по умолчанию true)
        'reloadable' => true,
        // поддержка reusePort
        'reusePort'  => true,
        // транспорт (необязательно, при необходимости включить ssl установить в ssl, по умолчанию tcp)
        'transport'  => 'tcp',
        // контекст (необязательно, когда транспорт ssl, необходимо передать путь к сертификату)
        'context'    => [], 
        // параметры конструктора класса процесса, здесь параметры конструктора класса process\Pusher::class (необязательно)
        'constructor' => [],
        // активирован ли текущий процесс
        'enable' => true
    ],
];

Резюме

Настроенные процессы в webman по сути являются простой оболочкой для workerman; они отделяют конфигурацию от бизнеса и реализуют обратные вызовы onXXX workerman через методы классов; остальные применения полностью совпадают с workerman.