Um contêiner com vários processos. O SNIDEL facilita para todos os desenvolvedores de PHP trabalharem com processamento paralelo sem extensões .

Por favor, considere doar para o autor deste projeto, Akihito Nakano, para mostrar seu ❤️ e suporte.
Patrocinador @ackintosh em patrocinadores do GitHub
(pt)
Não são poucas pessoas, inicie sua transportadora de programação com PHP e continue. Processamento paralelo, eles não estão familiarizados com ele e podem ser um obstáculo para eles.
Ou então, as pessoas que se limitam a se desenvolver com um idioma que não é PHP (por exemplo, um idioma que possui recurso superior para processamento paralelo). (Sou eu no passado.)
Para fazer o processamento paralelo de maneira mais fácil e instintiva para eles usar, comecei a desenvolver o Snidel.
O Snidel pode ser uma das suas opções quando você está pensando em "como fazê -lo paralelo?". É uma honra para mim.
(JA)
Eu acho que existem alguns programadores que começaram a programar com PHP e criaram suas carreiras com PHP (eu sou). Para essas pessoas, o processamento paralelo pode não estar familiarizado com ele ou pode parecer um limiar alto.
Como alternativa, há pessoas que precisam prosseguir com o desenvolvimento em uma situação em que são restringidas ao uso de idiomas que não sejam PHP (por exemplo, idiomas com excelentes mecanismos para processamento paralelo) devido a várias circunstâncias (esse era o caso antes).
Começamos a desenvolver Snidel com o objetivo de tornar mais fácil e intuitivamente possível resolver problemas usando o processamento paralelo.
Espero que Snidel possa ser uma das suas opções se você disser: "Quero executar esse processo em paralelo, o que devo fazer?"
$ composer require ackintosh/snidel:~0.11.0

Também é possível processamento paralelo por meio de funções de construção (por exemplo, exec ):
initialize_data_required_for_the_slow_jobs ();
exec ( ' php slow_job1.php & ' );
exec ( ' php slow_job2.php & ' );Para os desenvolvedores que sentem "dor" com o exposto, o Snidel pode proporcionar uma boa experiência e otimizar sua programação PHP.
Vamos passar pelo uso para mostrar como o Snidel derrete o processamento paralelo em sua programação. A experiência usando Snidel deve resolver sua dor. Vamos começar!
<?php
use Ackintosh Snidel ;
$ f = function ( $ s ) {
sleep ( 3 );
echo ' echo: ' . $ s ;
return ' return: ' . $ s ;
};
$ s = time ();
$ snidel = new Snidel ();
$ snidel -> process ( $ f , [ ' foo ' ]);
$ snidel -> process ( $ f , [ ' bar ' ]);
$ snidel -> process ( $ f , [ ' baz ' ]);
// `Snidel::results()` returns `Generator`
foreach ( $ snidel -> results () as $ r ) {
// string(9) "echo: foo"
var_dump ( $ r -> getOutput ());
// string(11) "return: foo"
var_dump ( $ r -> getReturn ());
}
// If you don't need the results, let's use `Snidel::wait()` instead of `Snidel::results()`
// $snidel->wait();
echo ( time () - $ s ) . ' sec elapsed ' . PHP_EOL ;
// 3sec elapsed.Todos os parâmetros são opcionais.
new Snidel ([
' concurrency ' => 3 ,
// Please refer to `Logging`
' logger ' => $ monolog ,
// Please refer to `Using custom queue`
' driver ' => $ driver ,
// a polling duration(in seconds) of queueing
' pollingDuration ' => 1 ,
]);call_user_func_array // multiple arguments
$ snidel -> process ( $ f , [ ' arg1 ' , ' arg2 ' ]);
// global function
$ snidel -> process ( ' myfunction ' );
// instance method
$ snidel -> process ([ $ instance , ' method ' ]); $ f = function ( $ arg ) {
return $ arg ;
};
$ snidel -> process ( $ f , ' arg-A_tag1 ' , ' tag1 ' );
$ snidel -> process ( $ f , ' arg-B_tag1 ' , ' tag1 ' );
$ snidel -> process ( $ f , ' arg_tag2 ' , ' tag2 ' );
foreach ( $ snidel -> results as $ r ) {
// `Task::getTag()` returns the tag passed as 3rd parameter of `Snidel::process()`
switch ( $ r -> getTask ()-> getTag ()) {
case ' tag1 ' :
$ r -> getReturn (); // arg-A_tag1 | arg-B_tag1
break ;
case ' tag2 ' :
$ r -> getReturn (); // arg_tag2
break ;
default :
$ r -> getReturn ();
break ;
}
}O SNIDEL suporta log com logger que implementa a interface PSR-3: Logger.
// e.g. MonoLog
use Monolog Formatter LineFormatter ;
use Monolog Handler StreamHandler ;
use Monolog Logger ;
$ monolog = new Logger ( ' sample ' );
$ stream = new StreamHandler ( ' php://stdout ' , Logger:: DEBUG );
$ stream -> setFormatter ( new LineFormatter ( " %datetime% > %level_name% > %message% %context% n" ));
$ monolog -> pushHandler ( $ stream );
$ snidel = new Snidel ([ ' logger ' => $ monolog ]);
$ snidel -> process ( $ f );
// 2017-03-22 13:13:43 > DEBUG > forked worker. pid: 60018 {"role":"master","pid":60017}
// 2017-03-22 13:13:43 > DEBUG > forked worker. pid: 60019 {"role":"master","pid":60017}
// 2017-03-22 13:13:43 > DEBUG > has forked. pid: 60018 {"role":"worker","pid":60018}
// 2017-03-22 13:13:43 > DEBUG > has forked. pid: 60019 {"role":"worker","pid":60019}
// 2017-03-22 13:13:44 > DEBUG > ----> started the function. {"role":"worker","pid":60018}
// 2017-03-22 13:13:44 > DEBUG > ----> started the function. {"role":"worker","pid":60019}
// ... $ snidel -> process ( function ( $ arg1 , $ arg2 ) {
exit ( 1 );
}, [ ' foo ' , ' bar ' ]);
$ snidel -> get ();
var_dump ( $ snidel -> getError ());
// class AckintoshSnidelError#4244 (1) {
// ...
// }
foreach ( $ snidel -> getError () as $ pid => $ e ) {
var_dump ( $ pid , $ e );
}
// int(51813)
// array(5) {
// 'status' => int(256)
// 'message' => string(50) "an error has occurred in child process.
// 'callable' => string(9) "*Closure*"
// 'args' =>
// array(2) {
// [0] => string(3) "foo"
// [1] => string(3) "bar"
// }
// 'return' => NULL
// }
// } Snidel depende de Bernard como uma camada de abstração da fila. Bernard é uma biblioteca PHP com vários zagueiros para criar trabalhos de fundo para processamento posterior.
Por padrão, o Snidel constrói o motorista Flatfile, mas, do ponto de vista da condição de corrida, recomendamos o uso de uma fila mais confiável na produção.
$ connection = Aws Sqs SqsClient:: factory ([
' key ' => ' your-aws-access-key ' ,
' secret ' => ' your-aws-secret-key ' ,
' region ' => ' the-aws-region-you-choose '
]);
$ driver = new Bernard Driver SqsDriver ( $ connection );
new Snidel ([
' driver ' => $ driver ,
]);Para detalhes sobre o motorista, veja aqui.
Aqui estão artigos que introduzem Snidel. Obrigado!
| Snidel | Php |
|---|---|
| 0,1 ~ 0,8 | > = 5.3 |
| 0,9 ~ | > = 5.6 |
| 0,13 | > = 7.1 |
Sugerimos que você experimente o Docker, pois o Snidel requer algumas extensões de PHP mostradas nos requisitos.
curl -Ss https://getcomposer.org/installer | php
docker build -t snidel .
docker run --rm -v ${PWD} :/snidel snidel php composer.phar install
docker run --rm -v ${PWD} :/snidel snidel vendor/bin/phpunit Snidel © Ackintosh, lançado sob a licença do MIT.
Autor e mantido por ackintosh
Github @ackintosh / twitter @nakano_akihito / blog (JA)
Entradas do blog do autor sobre Snidel (JA):
Obrigado ao JetBrains por nos apoiar com uma licença gratuita de código aberto.