Wadah multi-proses. Snidel memudahkan semua pengembang PHP untuk bekerja dengan pemrosesan paralel tanpa ekstensi .

Harap pertimbangkan untuk menyumbang kepada penulis proyek ini, Akihito Nakano, untuk menunjukkan ❤️ dan dukungan Anda.
Sponsor @ackintosh di sponsor github
(en)
Tidak sedikit orang, memulai pembawa pemrograman mereka dengan PHP, dan melanjutkan. Pemrosesan paralel, mereka tidak akrab dengannya, dan mungkin menjadi rintangan bagi mereka.
Atau orang lain, orang yang terbatas untuk berkembang dengan bahasa yang bukan PHP (misalnya bahasa yang memiliki fitur superior untuk pemrosesan paralel). (Ini aku di masa lalu.)
Untuk membuat pemrosesan paralel lebih mudah dan naluriah untuk mereka gunakan, saya mulai mengembangkan snidel.
Snidel bisa menjadi salah satu pilihan Anda saat Anda mempertimbangkan "bagaimana melakukannya paralel?". Itu suatu kehormatan bagi saya.
(JA)
Saya pikir ada beberapa programmer yang telah memulai pemrograman dengan PHP dan telah membangun karier mereka dengan PHP (saya). Bagi orang -orang seperti itu, pemrosesan paralel mungkin tidak terbiasa dengan itu atau mungkin tampak seperti ambang batas tinggi.
Atau, ada orang yang harus melanjutkan pengembangan dalam situasi di mana mereka dibatasi menggunakan bahasa selain PHP (misalnya, bahasa dengan mekanisme yang sangat baik untuk pemrosesan paralel) karena berbagai keadaan (ini adalah kasus dengan saya sebelumnya).
Kami telah mulai mengembangkan snidel dengan tujuan membuatnya lebih mudah dan dimungkinkan secara intuitif untuk menyelesaikan masalah dengan menggunakan pemrosesan paralel.
Saya berharap Snidel bisa menjadi salah satu pilihan Anda jika Anda berkata, "Saya ingin menjalankan proses ini secara paralel, apa yang harus saya lakukan?"
$ composer require ackintosh/snidel:~0.11.0

Dimungkinkan juga pemrosesan paralel melalui fungsi build-in (misalnya exec ):
initialize_data_required_for_the_slow_jobs ();
exec ( ' php slow_job1.php & ' );
exec ( ' php slow_job2.php & ' );Untuk pengembang yang merasakan "rasa sakit" dengan hal di atas, Snidel dapat memberikan pengalaman yang cukup baik dan akan merampingkan pemrograman PHP mereka.
Kami akan berjalan melalui penggunaan untuk menunjukkan bagaimana snidel melelehkan pemrosesan paralel ke dalam pemrograman Anda. Pengalaman menggunakan Snidel harus menyelesaikan rasa sakit Anda. Mari kita mulai!
<?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.Semua parameter adalah opsional.
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 mendukung pencatatan dengan Logger yang mengimplementasikan PSR-3: Antarmuka 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 tergantung pada Bernard sebagai lapisan abstraksi antrian. Bernard adalah perpustakaan PHP multi-backend untuk menciptakan pekerjaan latar belakang untuk pemrosesan selanjutnya.
Secara default Snidel membangun driver FlatFile, tetapi dari perspektif kondisi balapan, kami sarankan menggunakan antrian produksi yang lebih andal.
$ 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 ,
]);Untuk detail tentang pengemudi, silakan lihat di sini.
Berikut adalah artikel yang memperkenalkan Snidel. Terima kasih!
| Snidel | Php |
|---|---|
| 0,1 ~ 0,8 | > = 5.3 |
| 0.9 ~ | > = 5.6 |
| 0.13 | > = 7.1 |
Kami sarankan Anda mencobanya dengan Docker karena Snidel membutuhkan beberapa ekstensi PHP yang ditunjukkan dalam persyaratan.
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, dirilis di bawah lisensi MIT.
Ditulis dan dikelola oleh Ackintosh
Github @ackintosh / twitter @nakano_akihito / blog (JA)
Entri blog oleh penulis tentang Snidel (JA):
Terima kasih kepada JetBrains karena telah mendukung kami dengan lisensi open source gratis.