Executando verificação de segurança...
1

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:

Carregando publicação patrocinada...
1
1

Obrigado pela sugestão! Conheço a biblioteca. A intenção desse projeto era para estudos de concorrencia em uma linguagem bloqueante, a ideia principal é não utilizar nenhuma lib externa, em PHP puro.

1

Sim, mas a minha recomendação seria ver como ela faz no código. pq é uma biblioteca escrita em PHP, então em algum momento vai encontrar as funções PHP que fazem esse trabalho.

a pcntl_fork é uma função do PHP puro

1