Biblioteca PHP asincrónica basada en Swoole para la conversión de documentos mediante Unoserver. Proporciona un sistema de balance de carga y monitoreo de salud para manejar múltiples instancias de Unoserver de manera eficiente.
- Procesamiento asincrónico con Swoole
- Balance de carga entre múltiples instancias de Unoserver
- Monitoreo de salud de servidores
- Manejo de reconexiones y reintentos automáticos
- Soporte para modo stream y archivo
- Alto rendimiento y tolerancia a fallos
- PHP 8.1 o superior
- Extensión Swoole
- Unoserver
- LibreOffice
ServerHealthMonitor
: Monitorea la salud de las instancias de UnoserverUnoserverLoadBalancer
: Maneja la distribución de carga entre servidoresUnoserverXmlRpcClient
: Cliente XML-RPC para comunicación con Unoserver
Para usar el servicio debes instalar Unoserver. Una vez instalado, puedes iniciar múltiples instancias de Unoserver en diferentes puertos para manejar cargas concurrentes.
# Ejemplo iniciando 3 instancias
unoserver --port 2003 &
unoserver --port 2004 &
unoserver --port 2005 &
Con systemd, puedes crear un servicio para cada instancia de Unoserver:
# Usando systemd para múltiples instancias
for port in {2003..2005}; do
cat > /etc/systemd/system/unoserver-$port.service <<EOF
[Unit]
Description=Unoserver instance $port
[Service]
ExecStart=/usr/bin/unoserver --port $port
Restart=always
EOF
systemctl enable unoserver-$port
systemctl start unoserver-$port
done
composer require xvii/satelles-odf-adiutor
use Swoole\Coroutine;
use Tabula17\Satelles\Odf\Adiutor\Unoserver\ServerHealthMonitor;
use Tabula17\Satelles\Odf\Adiutor\Unoserver\UnoserverLoadBalancer;
// Configuración de servidores
$servers = [
['host' => '127.0.0.1', 'port' => 2003],
['host' => '127.0.0.1', 'port' => 2004],
['host' => '127.0.0.1', 'port' => 2005]
];
// Inicializar monitor de salud
$healthMonitor = new ServerHealthMonitor(
servers: $servers,
checkInterval: 30,
failureThreshold: 3,
retryTimeout: 60
);
// Configurar balanceador de carga
$converter = new UnoserverLoadBalancer(
servers: $servers,
healthMonitor: $healthMonitor,
concurrency: 20,
timeout: 15
);
// Iniciar servicios
Coroutine\run(function () use ($converter, $healthMonitor) {
$healthMonitor->startMonitoring();
$converter->start();
// Conversión asíncrona
$generator = $converter->convertAsync(
filePath: '/ruta/archivo.odt',
outputFormat: 'pdf',
outPath: '/ruta/salida.pdf',
mode: 'stream'
);
foreach ($generator as $data) {
// Procesar datos convertidos
}
});
En el directorio examples
se encuentra el script test.php
que muestra un ejemplo completo de uso de la librería.
Para ejecutarlo, asegúrate de tener Unoserver corriendo en los puertos 2003 al 2005 y ejecuta:
php examples/test.php
Si alguna instancia de Unoserver no está disponible, el sistema intentará reconectarse automáticamente y distribuirá la carga entre las instancias saludables.
$generator = $converter->convertAsync(
filePath: 'documento.odt',
outputFormat: 'pdf',
mode: 'stream'
);
$generator = $converter->convertAsync(
filePath: 'documento.odt',
outputFormat: 'pdf',
outPath: 'salida.pdf',
mode: 'file'
);
El sistema monitorea automáticamente la salud de los servidores Unoserver:
- Verifica la disponibilidad cada N segundos
- Marca servidores como no saludables después de X fallos
- Reintenta conexiones después de un período de timeout
- Distribuye carga solo entre servidores saludables
Las contribuciones son bienvenidas. Por favor:
- Fork el repositorio
- Crea una rama para tu feature
- Commit tus cambios
- Push a la rama
- Crea un Pull Request
Este proyecto está bajo la Licencia MIT.