Executando métodos de forma não bloqueante no PHP sem dependências.
Contexto
Bom, trabalho com uma linguagem chamada Caché Object Script há, aproximadamente, 2 anos. Ela é sucessora do antigo MUMPS, na verdade, ela é MUMPS porém com o paradigma da orientação a objetos. Enfim, essa linguagem é basicamente uma plataforma, existe todo um ecossistema que envolve a linguagem.
Uma das ferramentas desta linguagem é uma função chamada "job", o job é nada mais nada menos que um dispach de métodos, funções, rotinas para serem executadas em background, além disso, é possível acompanhar esses processos em background atráves de um portal que também faz parte do ecossistema da linguagem.
Motivação
Eu precisava de algo parecido para implementar uma espécie de agendador de tarefas no PHP, sem utilizar libs/deps externas, apenas PHP puro.
Então, pensei: Por que não tentar implementar um "job" do Caché no PHP?
Solução, por hora...
A solução foi subir workers em background e esse job dispacha a tarefa para o worker disponível. O worker, por sua vez, fica escutando se há tarefas à serem processadas, assim que ele recebe a tarefa, ele executa. Caso ocorra algum problema na execução da tarefa, é registrado um log.
Os workers são levantados de forma gradual, ou seja, se houver 2 workers ocupados e há uma tarefa aguardando a vez, outro worker será construído.
O limite de workers, por enquanto, são dez (10)
Exemplo
No exemplo abaixo, contém um simulação de uma tarefa demorada que será executada em background. O primeiro argumento do Job é uma referência da classe, o segundo argumento é o nome do método. Ou seja, na classe Request há um método chamado slow e ele será executado em background por um worker.
<?php
require_once __DIR__ . "/../vendor/autoload.php";
use Auguzsto\Job\Job;
use Auguzsto\Job\Tests\Request;
$job = new Job(Request::class, "slow");
$job->execute();
Voce pode ver mais exemplos no repositório do projeto:
https://github.com/auguzsto/job
Design:
