다중 프로세스 컨테이너. Snidel을 사용하면 모든 PHP 개발자가 확장없이 병렬 처리를보다 쉽게 작업 할 수 있습니다.

이 프로젝트의 저자 인 Akihito Nakano에 기부하여 귀하의 지원과 지원을 보여주십시오.
GitHub 스폰서의 스폰서 @ackintosh
(en)
몇 사람이 아니라 PHP로 프로그래밍 캐리어를 시작하고 계속하십시오. 병렬 처리, 그들은 익숙하지 않으며 그들에게 장애물 일 수 있습니다.
또는 PHP가 아닌 언어 (예 : 병렬 처리를위한 우수한 기능을 가진 언어)로 발전하도록 제한되는 사람들. (과거의 나야.)
병렬 처리를보다 쉽고 본능적으로 사용하기 위해 Snidel을 개발하기 시작했습니다.
Snidel은 "평행 한 방법"을 고려할 때 옵션 중 하나가 될 수 있습니다. 그것은 저에게 영광입니다.
(JA)
PHP로 프로그래밍을 시작하고 PHP (I AM)와의 경력을 쌓은 일부 프로그래머가 있다고 생각합니다. 그러한 사람들의 경우, 병렬 처리는 그것에 익숙하지 않거나 높은 임계 값인 것처럼 보일 수 있습니다.
또는 PHP 이외의 언어 (예 : 병렬 처리를위한 우수한 메커니즘이있는 언어)를 사용하여 제한되는 상황에서 개발을 진행 해야하는 사람들이 있습니다 (이전의 경우).
우리는 병렬 처리를 사용하여 문제를보다 쉽고 직관적으로 해결하기 위해 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 : Logger 인터페이스를 구현하는 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은 Bernard에 큐 추상화 레이어로 의존합니다. Bernard는 나중에 처리를위한 백그라운드 작업을 만들기위한 멀티 백인드 PHP 라이브러리입니다.
기본적으로 Snidel은 플랫 파일 드라이버를 구축하지만 레이스 조건 관점에서보다 신뢰할 수있는 대기열을 사용하는 것이 좋습니다.
$ 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을 소개하는 기사입니다. 감사합니다!
| 스니 델 | PHP |
|---|---|
| 0.1 ~ 0.8 | > = 5.3 |
| 0.9 ~ | > = 5.6 |
| 0.13 | > = 7.1 |
Snidel에는 요구 사항에 표시된 PHP 확장이 필요하므로 Docker와 함께 시도해 보는 것이 좋습니다.
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가 저술 및 유지 관리합니다
github @ackintosh / twitter @nakano_akihito / blog (JA)
Snidel (JA)에 대한 저자의 블로그 항목 :
무료 오픈 소스 라이센스로 우리를 지원해 주신 JetBrains에게 감사합니다.