Proceso Personalizado
En webman puedes personalizar escuchas o procesos como en workerman.
Nota
Los usuarios de Windows deben usarphp windows.php
para iniciar webman y poder iniciar procesos personalizados.
Servicio http personalizado
A veces puedes tener algún requerimiento especial y necesitas cambiar el código base del servicio http de webman, en este caso puedes usar procesos personalizados.
Por ejemplo, crea app\Server.php
<?php
namespace app;
use Webman\App;
class Server extends App
{
// Aquí reescribe el método en Webman\App
}
Agrega la siguiente configuración en config/process.php
use Workerman\Worker;
return [
// ... Se omiten otras configuraciones...
'my-http' => [
'handler' => app\Server::class,
'listen' => 'http://0.0.0.0:8686',
'count' => 8, // Número de procesos
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'requestClass' => \support\Request::class, // Configuración de la clase request
'logger' => \support\Log::channel('default'), // Instancia de logger
'appPath' => app_path(), // Ubicación del directorio app
'publicPath' => public_path() // Ubicación del directorio public
]
]
];
Sugerencia
Si deseas cerrar el proceso http que viene con webman, solo necesitas establecerlisten=>''
enconfig/server.php
.
Ejemplo de escucha websocket personalizada
Crea 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";
}
}
Nota: Todos los atributos onXXX son públicos.
Agrega la siguiente configuración en config/process.php
return [
// ... Se omiten otras configuraciones de procesos ...
// websocket_test es el nombre del proceso
'websocket_test' => [
// Aquí se especifica la clase del proceso, es decir, la clase Pusher definida arriba
'handler' => app\Pusher::class,
'listen' => 'websocket://0.0.0.0:8888',
'count' => 1,
],
];
Ejemplo de proceso no escuchador personalizado
Crea app/TaskTest.php
<?php
namespace app;
use Workerman\Timer;
use support\Db;
class TaskTest
{
public function onWorkerStart()
{
// Verifica cada 10 segundos si hay nuevos usuarios registrados en la base de datos
Timer::add(10, function(){
Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
});
}
}
Agrega la siguiente configuración en config/process.php
return [
// ... Se omiten otras configuraciones de procesos ...
'task' => [
'handler' => app\TaskTest::class
],
];
Nota: Si se omite listen, no se escuchará ningún puerto, si se omite count, el número de procesos por defecto es 1.
Descripción del archivo de configuración
Una definición completa de configuración de un proceso es la siguiente:
return [
// ...
// websocket_test es el nombre del proceso
'websocket_test' => [
// Aquí se especifica la clase del proceso
'handler' => app\Pusher::class,
// Protocolo de escucha, IP y puerto (opcional)
'listen' => 'websocket://0.0.0.0:8888',
// Número de procesos (opcional, por defecto 1)
'count' => 2,
// Usuario bajo el que se ejecuta el proceso (opcional, por defecto el usuario actual)
'user' => '',
// Grupo de usuarios bajo el que se ejecuta el proceso (opcional, por defecto el grupo actual)
'group' => '',
// Indica si el proceso soporta reload (opcional, por defecto true)
'reloadable' => true,
// Si se habilita reusePort
'reusePort' => true,
// transport (opcional, se establece en ssl cuando se necesita habilitar ssl, por defecto tcp)
'transport' => 'tcp',
// context (opcional, cuando el transport es ssl, se requiere pasar la ruta del certificado)
'context' => [],
// Parámetros del constructor de la clase del proceso, aquí están los parámetros del constructor de la clase process\Pusher::class (opcional)
'constructor' => [],
// Indica si el proceso está habilitado
'enable' => true
],
];
Resumen
El proceso personalizado de webman es en realidad un simple envoltorio de workerman, que separa la configuración de la lógica de negocio y utiliza los callbacks onXXX
de workerman mediante métodos de clase, el resto de los usos son completamente iguales a workerman.