Настроенные процессы
В 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.