이 패키지를 사용하면 PHP를 동시에 쉽게 실행할 수 있습니다. 이면에서는 기본 PHP 프로세스를 하나 이상의 하위 작업으로 분기하여 동시성을 달성합니다.
가상의 느린 API를 호출할 이 예에서는 세 개의 클로저가 모두 동시에 실행됩니다.
use Spatie Fork Fork ;
$ results = Fork:: new ()
-> run (
fn () => ( new Api )-> fetchData (userId: 1 ),
fn () => ( new Api )-> fetchData (userId: 2 ),
fn () => ( new Api )-> fetchData (userId: 3 ),
);
$ results [ 0 ]; // fetched data of user 1
$ results [ 1 ]; // fetched data of user 2
$ results [ 2 ]; // fetched data of user 3
YouTube의 이 비디오에서는 패키지가 내부적으로 어떻게 작동하는지 설명합니다.
우리는 동급 최고의 오픈 소스 패키지를 만드는 데 많은 리소스를 투자합니다. 유료 제품 중 하나를 구매하여 우리를 지원할 수 있습니다.
귀하가 사용하고 있는 당사 패키지를 언급하면서 귀하의 고향에서 엽서를 보내주셔서 진심으로 감사드립니다. 연락처 페이지에서 주소를 확인하실 수 있습니다. 우리는 수신된 모든 엽서를 가상 엽서 월에 게시합니다.
이 패키지에는 기본적으로 많은 Unix 및 Mac 시스템에 설치되는 PHP 8과 pcntl 확장이 필요합니다.
pcntl은 웹 컨텍스트가 아닌 CLI 프로세스에서만 작동합니다. Alpine Linux의 프로세스 종료를 올바르게 처리하려면 posix가 필요합니다.
작곡가를 통해 패키지를 설치할 수 있습니다.
composer require spatie/fork
run
싶은 만큼 많은 클로저를 전달할 수 있습니다. 동시에 실행됩니다. run
함수는 실행된 클로저의 반환 값이 포함된 배열을 반환합니다.
use Spatie Fork Fork ;
$ results = Fork:: new ()
-> run (
function () {
sleep ( 1 );
return ' result from task 1 ' ;
},
function () {
sleep ( 1 );
return ' result from task 2 ' ;
},
function () {
sleep ( 1 );
return ' result from task 3 ' ;
},
);
// this code will be reached this point after 1 second
$ results [ 0 ]; // contains 'result from task 1'
$ results [ 1 ]; // contains 'result from task 2'
$ results [ 2 ]; // contains 'result from task 3'
각 콜러블이 run
에 전달되기 전이나 후에 일부 코드를 실행해야 하는 경우 콜러블을 메소드 before
이나 after
전달할 수 있습니다. 전달된 이 콜러블은 run
에 전달된 콜러블 실행 직전이나 직후에 하위 프로세스에서 실행됩니다.
before
after
다음은 Laravel Eloquent 모델을 사용하여 데이터베이스에서 값을 가져오는 예입니다. 하위 작업이 DB를 사용하게 하려면 DB에 다시 연결해야 합니다. before
에 전달된 클로저는 run
에 전달된 클로저에 대해 생성된 두 하위 작업 모두에서 실행됩니다.
use App Models User ;
use Illuminate Support Facades DB ;
use Spatie Fork Fork ;
Fork:: new ()
-> before ( fn () => DB :: connection ( ' mysql ' )-> reconnect ())
-> run (
fn () => User:: find ( 1 )-> someLongRunningFunction (),
fn () => User:: find ( 2 )-> someLongRunningFunction (),
);
콜러블이 실행된 후 하위 작업에서 일부 정리를 수행해야 하는 경우 SpatieForkFork
인스턴스에서 after
메서드를 사용할 수 있습니다.
before
과 after
사용합니다. 상위 작업에서 실행 before
after
콜러블을 전달해야 하는 경우 해당 콜러블을 parent
인수에 전달해야 합니다.
use App Models User ;
use Illuminate Support Facades DB ;
use Spatie Fork Fork ;
Fork:: new ()
-> before (
parent: fn () => echo ' this runs in the parent task '
)
-> run (
fn () => User:: find ( 1 )-> someLongRunningFunction (),
fn () => User:: find ( 2 )-> someLongRunningFunction (),
);
하위 작업과 상위 작업에서 실행되도록 다양한 클로저를 전달할 수도 있습니다.
use Spatie Fork Fork ;
Fork:: new ()
-> before (
child: fn () => echo ' this runs in the child task ' ,
parent: fn () => echo ' this runs in the parent task ' ,
)
-> run (
fn () => User:: find ( 1 )-> someLongRunningFunction (),
fn () => User:: find ( 2 )-> someLongRunningFunction (),
);
모든 출력 데이터는 배열로 수집되며 모든 하위 항목이 완료되는 즉시 사용할 수 있습니다. 이 예에서 $results
세 가지 항목이 포함됩니다.
$ results = Fork:: new ()
-> run (
fn () => ( new Api )-> fetchData (userId: 1 ),
fn () => ( new Api )-> fetchData (userId: 2 ),
fn () => ( new Api )-> fetchData (userId: 3 ),
);
출력은 after
콜백에서도 사용할 수 있습니다. 이 콜백은 자식 작업이 끝날 때가 아니라 완료될 때마다 호출됩니다.
$ results = Fork:: new ()
-> after (
child: fn ( int $ i ) => echo $ i , // 1, 2 and 3
parent: fn ( int $ i ) => echo $ i , // 1, 2 and 3
)
-> run (
fn () => 1 ,
fn () => 2 ,
fn () => 3 ,
);
마지막으로 하위 작업의 반환 값은 PHP에 내장된 serialize
메서드를 사용하여 직렬화됩니다. 이는 객체를 포함하여 PHP에서 일반적으로 직렬화할 수 있는 모든 것을 반환할 수 있음을 의미합니다.
$ result = Fork:: new ()
-> run (
fn () => new DateTime ( ' 2021-01-01 ' ),
fn () => new DateTime ( ' 2021-01-02 ' ),
);
기본적으로 모든 호출 가능 항목은 병렬로 실행됩니다. 그러나 최대 동시 프로세스 수를 구성할 수 있습니다.
$ results = Fork:: new ()
-> concurrent ( 2 )
-> run (
fn () => 1 ,
fn () => 2 ,
fn () => 3 ,
);
이 경우 처음 두 기능은 즉시 실행되며, 그 중 하나가 완료되자마자 마지막 기능도 시작됩니다.
composer test
최근 변경된 사항에 대한 자세한 내용은 변경 로그를 참조하세요.
자세한 내용은 CONTRIBUTING을 참조하세요.
보안 취약점을 보고하는 방법에 대한 보안 정책을 검토하세요.
MIT 라이센스(MIT). 자세한 내용은 라이센스 파일을 참조하십시오.