Un conteneur multi-processus. Snidel permet à tous les développeurs PHP de travailler plus facilement avec un traitement parallèle sans aucune extension .

Veuillez envisager de faire un don à l'auteur de ce projet, Akihito Nakano, pour montrer votre ❤️ et votre soutien.
Sponsor @ackintosh sur les sponsors GitHub
(en)
Pas quelques personnes, démarrez leur porteur de programmation avec PHP et continuez. Traitement parallèle, ils ne le connaissent pas et peuvent être un obstacle pour eux.
Ou bien, les personnes qui se limitent à se développer avec une langue qui n'est pas PHP (par exemple une langue qui a une caractéristique supérieure pour le traitement parallèle). (C'est moi dans le passé.)
Pour effectuer un traitement parallèle plus facilement et instinctivement à l'utiliser, j'ai commencé à développer Snidel.
Snidel peut être l'une de vos options lorsque vous envisagez "Comment le faire parallèle?". C'est un honneur pour moi.
(ja)
Je pense qu'il y a des programmeurs qui ont commencé à programmer avec PHP et ont construit leur carrière avec PHP (je suis). Pour ces personnes, le traitement parallèle peut ne pas être familier ou peut sembler être un seuil élevé.
Alternativement, il y a des gens qui doivent procéder à un développement dans une situation où ils sont liés à l'utilisation de langues autres que PHP (par exemple, les langues avec d'excellents mécanismes de traitement parallèle) en raison de diverses circonstances (c'était le cas avec moi avant).
Nous avons commencé à développer Snidel dans le but de rendre plus facile et intuitivement possible de résoudre des problèmes en utilisant un traitement parallèle.
J'espère que Snidel peut être l'une de vos options si vous dites: "Je veux exécuter ce processus en parallèle, que dois-je faire?"
$ composer require ackintosh/snidel:~0.11.0

Il est également possible un traitement parallèle via des fonctions d'intégration (par exemple exec ):
initialize_data_required_for_the_slow_jobs ();
exec ( ' php slow_job1.php & ' );
exec ( ' php slow_job2.php & ' );Pour les développeurs qui ressentent la «douleur» avec ce qui précède, Snidel peut offrir une très bonne expérience et rationalisera leur programmation PHP.
Nous allons parcourir l'utilisation pour montrer comment Snidel fait fondre le traitement parallèle dans votre programmation. L'expérience de l'utilisation de Snidel devrait résoudre votre douleur. Commençons!
<?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.Tous les paramètres sont facultatifs.
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 prend en charge la connexion avec Logger qui implémente PSR-3: Interface de la journalisation.
// 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 dépend de Bernard comme couche d'abstraction de file d'attente. Bernard est une bibliothèque PHP multi-backend pour créer des travaux d'arrière-plan pour un traitement ultérieur.
Par défaut, Snidel construit le pilote FlatFile, mais du point de vue de la condition de course, nous vous recommandons d'utiliser une file d'attente plus fiable en production.
$ 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 ,
]);Pour plus de détails sur le conducteur, veuillez consulter ici.
Voici des articles qui introduisaient Snidel. Merci!
| Snidel | Php |
|---|---|
| 0,1 ~ 0,8 | > = 5.3 |
| 0,9 ~ | > = 5.6 |
| 0,13 | > = 7.1 |
Nous vous suggérons d'essayer avec Docker car Snidel nécessite des extensions de PHP indiquées dans les exigences.
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, libéré sous la licence MIT.
Écrit et entretenu par Ackintosh
Github @ackintosh / twitter @nakano_akihito / blog (ja)
Entrées de blog par auteur sur Snidel (JA):
Merci à JetBrains de nous soutenir avec une licence open source gratuite.