zend-expressive-swoole icon indicating copy to clipboard operation
zend-expressive-swoole copied to clipboard

App specific listeners for swoole events

Open marc-mabe opened this issue 6 years ago • 1 comments
trafficstars

  • [x] I was not able to find an open or closed issue matching what I'm seeing.
  • [x] This is not a question. (Questions should be asked on chat (Signup here) or our forums.)

Use swoole tick timer on the worker process to be able to use it as the event loop for guzzle.

PS: By default guzzle uses PHP shutdown handler but this does not work in a swoole environment. To be able to use async Guzzle callbacks within an swoole worker you have to run the task queue of Guzzle manually. This can simply be done using the SwooleServer::tick function of the worker process.

Code to reproduce the issue

// This does not work as "SwooleServer::on()" supports only one listener
// and there is already a listener in SwooleRequestHandlerRunner
$masterServer = $container->get(SwooleHttpServer::class);
$masterServer->on('workerstart', function (SwooleHttpServer $workerServer) {
    $queue = \GuzzleHttp\Promise\queue();
    $workerServer->tick(100, function () use ($queue) {
        $queue->run();
    });
});

// I had to extend SwooleRequestHandlerRunner
// and copy-past SwooleRequestHandlerRunnerFactory
// to use an own event manager to add application specific listeners to these events
$em = $container->get(EventManagerInterface::class);
$em->attach(WorkerStartEvent::class, function (WorkerStartEvent $event) {
    $queue = \GuzzleHttp\Promise\queue();
    $workerServer = $event->getServer();
    $workerServer->tick(1000, function () use ($queue) {
        $queue->run();
    });
});

Expected results

There should already be a way in zend-expressive-swoole to add application specific listeners to such events

Actual results

It's not possible without extending SwooleRequestHandlerRunner and copy-pasting SwooleRequestHandlerRunnerFactory.

marc-mabe avatar Jul 12 '19 13:07 marc-mabe

This repository has been closed and moved to mezzio/mezzio-swoole; a new issue has been opened at https://github.com/mezzio/mezzio-swoole/issues/1.

weierophinney avatar Dec 31 '19 21:12 weierophinney