حاوية متعددة العمليات. Snidel يسهل على جميع مطوري PHP العمل مع المعالجة الموازية دون أي امتدادات .

يرجى النظر في التبرع لمؤلف هذا المشروع ، Akihito Nakano ، لإظهار ❤ ودعمك.
الراعي ackIntosh على رعاة Github
(en)
ليس عدد قليل من الناس ، ابدأ حامل البرمجة مع PHP ، واستمر. معالجة متوازية ، فهي ليست على دراية بها ، وقد تكون عقبة عليهم.
وإلا ، فإن الأشخاص الذين يقتصرون على التطور بلغة ليست PHP (مثل اللغة التي لها ميزة متفوقة للمعالجة المتوازية). (أنا في الماضي.)
لجعل المعالجة الموازية بسهولة أكبر وغريزيها لاستخدامها ، بدأت في تطوير Snidel.
يمكن أن يكون Snidel أحد خياراتك عندما تفكر في "كيفية القيام بذلك بالتوازي؟". إنه شرف لي.
(جا)
أعتقد أن هناك بعض المبرمجين الذين بدأوا البرمجة مع PHP وبناء حياتهم المهنية مع PHP (أنا). بالنسبة لمثل هؤلاء الأشخاص ، قد تكون المعالجة الموازية غير مألوفة بها أو قد تبدو وكأنها عتبة عالية.
بدلاً من ذلك ، هناك أشخاص يتعين عليهم المضي قدمًا في التنمية في موقف يتم فيه تقييدهم من استخدام لغات أخرى غير PHP (على سبيل المثال ، اللغات ذات الآليات الممتازة للمعالجة المتوازية) بسبب الظروف المختلفة (كان هذا هو الحال معي من قبل).
لقد بدأنا في تطوير Snidel بهدف تسهيل حل المشكلات بشكل أسهل وحدسيات باستخدام المعالجة المتوازية.
آمل أن يكون Snidel أحد خياراتك إذا قلت ، "أريد تشغيل هذه العملية بالتوازي ، ماذا علي أن أفعل؟"
$ composer require ackintosh/snidel:~0.11.0

من الممكن أيضًا معالجة متوازية عبر وظائف البناء (مثل exec ):
initialize_data_required_for_the_slow_jobs ();
exec ( ' php slow_job1.php & ' );
exec ( ' php slow_job2.php & ' );بالنسبة للمطورين الذين يشعرون بـ "الألم" مع ما سبق ، يمكن أن يوفر Snidel تجربة جيدة وسيؤدي إلى تبسيط برمجة PHP الخاصة بهم.
سوف نسير من خلال الاستخدام لإظهار كيف يذوب Snidel المعالجة الموازية في البرمجة الخاصة بك. يجب أن تحل التجربة باستخدام Snidel ألمك. لنبدأ!
<?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.جميع المعلمات اختيارية.
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 التسجيل باستخدام المسجل الذي ينفذ PSR-3: واجهة المسجل.
// 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 على برنارد كطبقة تجريد قائمة انتظار. Bernard هي مكتبة PHP متعددة المقاومة لإنشاء وظائف في الخلفية للمعالجة اللاحقة.
بشكل افتراضي ، يبني Snidel برنامج تشغيل Flatfile ، ولكن من منظور حالة السباق ، نوصي باستخدام قائمة انتظار أكثر موثوقية في الإنتاج.
$ 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 ,
]);للحصول على تفاصيل على السائق ، يرجى الاطلاع هنا.
فيما يلي مقالات تقدم Snidel. شكرًا لك!
| Snidel | PHP |
|---|---|
| 0.1 ~ 0.8 | > = 5.3 |
| 0.9 ~ | > = 5.6 |
| 0.13 | > = 7.1 |
نقترح عليك تجربة مع Docker حيث يتطلب Snidel بعض امتدادات PHP الموضحة في المتطلبات.
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 ، الذي تم إصداره بموجب ترخيص MIT.
تأليف والحفاظ على Ackintosh
githubackintosh / twitternakano_akihito / blog (ja)
إدخالات المدونة للمؤلف عن Snidel (JA):
شكرًا لك على JetBrains لدعمنا بترخيص مجاني مفتوح المصدر.