Un contenedor de múltiples procesos. Snidel facilita que todos los desarrolladores de PHP trabajen con procesamiento paralelo sin ninguna extensiones .

Considere donar al autor de este proyecto, Akihito Nakano, para mostrar su ❤️ y apoyo.
Patrocinador @ackintosh en Github Patrocinadores
(es)
No pocas personas, comience su operador de programación con PHP y continúe. Procesamiento paralelo, no están familiarizados con él, y pueden ser un obstáculo para ellos.
O bien, las personas que se limitaron a desarrollarse con un lenguaje que no es PHP (por ejemplo, un idioma que tiene una característica superior para el procesamiento paralelo). (Soy yo en el pasado).
Para hacer el procesamiento paralelo de manera más fácil e instintiva para usar, comencé a desarrollar snidel.
Snidel puede ser una de sus opciones cuando está considerando "cómo hacerlo paralelo?". Es un honor para mí.
(Ja)
Creo que hay algunos programadores que han comenzado a programar con PHP y han acumulado sus carreras con PHP (yo). Para tales personas, el procesamiento paralelo puede no estar familiarizado o puede parecer que es un umbral alto.
Alternativamente, hay personas que tienen que proceder con el desarrollo en una situación en la que se les restringe el uso de idiomas distintos de PHP (por ejemplo, idiomas con excelentes mecanismos para el procesamiento paralelo) debido a varias circunstancias (este fue el caso antes).
Hemos comenzado a desarrollar snidel con el objetivo de facilitar e intuitivamente posible resolver problemas utilizando el procesamiento paralelo.
Espero que Snidel pueda ser una de sus opciones si dice: "Quiero ejecutar este proceso en paralelo, ¿qué debo hacer?"
$ composer require ackintosh/snidel:~0.11.0

También es posible procesamiento paralelo a través de funciones de construcción (por ejemplo, exec ):
initialize_data_required_for_the_slow_jobs ();
exec ( ' php slow_job1.php & ' );
exec ( ' php slow_job2.php & ' );Para los desarrolladores que sienten "dolor" con lo anterior, Snidel puede proporcionar una experiencia bastante buena y racionalizará su programación PHP.
Caminaremos por el uso para mostrar cómo el procesamiento paralelo de Snidel se derrite en su programación. La experiencia con Snidel debe resolver su dolor. ¡Comencemos!
<?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 los parámetros son opcionales.
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 ;
}
}Snidel admite registro con Logger que implementa PSR-3: interfaz de 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 una capa de abstracción de la cola. Bernard es una biblioteca de PHP de múltiples backend para crear trabajos de fondo para procesamiento posterior.
Por defecto, Snidel construye el piloto de archivo plano, pero desde una perspectiva de condición de carrera, recomendamos usar una cola más confiable en la producción.
$ 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 obtener detalles sobre el conductor, consulte aquí.
Aquí hay artículos que introducen Snidel. ¡Gracias!
| Snidel | Php |
|---|---|
| 0.1 ~ 0.8 | > = 5.3 |
| 0.9 ~ | > = 5.6 |
| 0.13 | > = 7.1 |
Le sugerimos que lo pruebe con Docker, ya que Snidel requiere algunas extensiones de PHP que se muestran en los 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, lanzado bajo la licencia MIT.
Escrito y mantenido por Ackintosh
Github @ackintosh / twitter @nakano_akihito / blog (ja)
Entradas de blog del autor sobre Snidel (JA):
Gracias a JetBrains por apoyarnos con una licencia de código abierto gratuita.