Ein Multi-Process-Behälter. Snidel erleichtert es allen PHP -Entwicklern, mit paralleler Verarbeitung ohne Erweiterungen zu arbeiten.

Bitte erwägen Sie, den Autor dieses Projekts, Akihito Nakano, zu spenden, um Ihre ❤️ und Unterstützung zu zeigen.
Sponsor @ackintosh auf Github -Sponsoren
(en)
Nicht wenige Leute, starten Sie ihren Programmierträger mit PHP und fahren Sie fort. Parallele Verarbeitung, sie sind damit nicht vertraut und können eine Hürde für sie sein.
Oder Personen, die sich auf eine Sprache entwickelt haben, die kein PHP ist (z. B. eine Sprache, die überlegene Funktionen für die parallele Verarbeitung hat). (Ich bin es in der Vergangenheit.)
Um die parallele Verarbeitung einfacher und instinktiv für sie zu verwenden, begann ich, Snidel zu entwickeln.
Snidel kann eine Ihrer Optionen sein, wenn Sie überlegen, wie man es parallel macht? Es ist eine Ehre für mich.
(Ja)
Ich denke, es gibt einige Programmierer, die mit dem Programmieren mit PHP begonnen haben und ihre Karriere mit PHP (ich bin) aufgebaut haben. Für solche Menschen kann die parallele Verarbeitung damit nicht vertraut sein oder es scheint, als wäre es eine hohe Schwelle.
Alternativ gibt es Menschen, die mit der Entwicklung in einer Situation fortfahren müssen, in der sie aufgrund verschiedener Umstände (dies war bei mir zuvor bei mir der Fall bei mir zuvor bei mir).
Wir haben damit begonnen, Snidel zu entwickeln, um es einfacher und intuitiv möglich zu machen, Probleme mithilfe der parallelen Verarbeitung zu lösen.
Ich hoffe, Snidel kann eine Ihrer Optionen sein, wenn Sie sagen: "Ich möchte diesen Prozess parallel ausführen. Was soll ich tun?"
$ composer require ackintosh/snidel:~0.11.0

Es ist auch eine mögliche parallele Verarbeitung durch Build-In-Funktionen (z. B. exec ):
initialize_data_required_for_the_slow_jobs ();
exec ( ' php slow_job1.php & ' );
exec ( ' php slow_job2.php & ' );Für die Entwickler, die mit dem oben genannten "Schmerz" spüren, kann Snidel ziemlich gute Erfahrung bieten und ihre PHP -Programmierung rationalisieren.
Wir werden die Verwendung durchgehen, um zu zeigen, wie die parallele Verarbeitung von Snidel in Ihre Programmierung schmelzt. Die Erfahrung mit Snidel sollte Ihre Schmerzen lösen. Fangen wir an!
<?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.Alle Parameter sind optional.
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 unterstützt die Protokollierung mit Logger, die die PSR-3: Logger-Schnittstelle implementiert.
// 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 hängt von Bernard als Warteschlangeabstraktionschicht ab. Bernard ist eine PHP-Bibliothek mit mehreren Backends für die Erstellung von Hintergrundjobs für die spätere Verarbeitung.
Standardmäßig erstellt Snidel den Flatfile -Treiber, aber aus Sicht der Rennbedingung empfehlen wir eine zuverlässigere Warteschlange in der Produktion.
$ 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 ,
]);Weitere Informationen zum Fahrer finden Sie hier.
Hier sind Artikel, die Snidel einführen. Danke schön!
| Schnupfen | Php |
|---|---|
| 0,1 ~ 0,8 | > = 5,3 |
| 0,9 ~ | > = 5,6 |
| 0,13 | > = 7.1 |
Wir empfehlen Ihnen, es mit Docker auszuprobieren, da Snidel einige PHP -Erweiterungen erfordert, die in den Anforderungen angegeben sind.
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, veröffentlicht unter der MIT -Lizenz.
Verfasst und gewartet von Ackintosh
Github @ackintosh / twitter @nakano_akihito / blog (Ja)
Blogeinträge des Autors über Snidel (JA):
Vielen Dank an JetBrains, die uns mit einer kostenlosen Open -Source -Lizenz unterstützt haben.