Пользовательские процессы
В 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, // Класс запроса
'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',
// Контекст (опционально, передать путь к сертификату при transport = ssl)
'context' => [],
// Параметры конструктора класса процесса (опционально)
'constructor' => [],
// Включён ли этот процесс
'enable' => true
],
];
Заключение
Пользовательские процессы в webman по сути представляют собой простую обёртку workerman. Они отделяют конфигурацию от бизнес-логики и реализуют колбэки onXXX workerman через методы класса. Все остальные аспекты использования совпадают с workerman.