Dieses Paket erleichtert die gleichzeitige Ausführung von PHP. Hinter den Kulissen wird Parallelität erreicht, indem der Haupt-PHP-Prozess auf eine oder mehrere untergeordnete Aufgaben aufgeteilt wird.
In diesem Beispiel, in dem wir eine imaginäre langsame API aufrufen, werden alle drei Schließungen gleichzeitig ausgeführt.
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
In diesem Video auf YouTube erklären wir, wie das Paket intern funktioniert.
Wir investieren viele Ressourcen in die Erstellung erstklassiger Open-Source-Pakete. Sie können uns unterstützen, indem Sie eines unserer kostenpflichtigen Produkte kaufen.
Wir freuen uns sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welches unserer Pakete Sie verwenden. Unsere Adresse finden Sie auf unserer Kontaktseite. Wir veröffentlichen alle erhaltenen Postkarten auf unserer virtuellen Postkartenwand.
Dieses Paket erfordert PHP 8 und die pcntl-Erweiterungen, die standardmäßig auf vielen Unix- und Mac-Systemen installiert sind.
pcntl funktioniert nur in CLI-Prozessen, nicht in einem Webkontext. Posix ist für die korrekte Behandlung der Prozessbeendigung für Alpine Linux erforderlich.
Sie können das Paket über Composer installieren:
composer require spatie/fork
Sie können so viele Schließungen passieren, wie Sie run
möchten. Sie werden gleichzeitig ausgeführt. Die run
gibt ein Array mit den Rückgabewerten der ausgeführten Abschlüsse zurück.
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'
Wenn Sie vor oder nach jedem an run
übergebenen Callable Code ausführen müssen, können Sie ein Callable an before
oder after
Methoden übergeben. Dieser übergebene Callable wird im untergeordneten Prozess unmittelbar vor oder nach der Ausführung des an run
übergebenen Callable ausgeführt.
before
und after
in der untergeordneten Aufgabe Hier ist ein Beispiel, in dem wir mithilfe eines Laravel Eloquent-Modells einen Wert aus der Datenbank abrufen. Damit die untergeordnete Aufgabe die Datenbank verwenden kann, muss die Verbindung zur Datenbank wiederhergestellt werden. Der before
übergebene Abschluss wird in beiden untergeordneten Aufgaben ausgeführt, die für die an run
übergebenen Abschlüsse erstellt werden.
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 (),
);
Wenn Sie nach der Ausführung des Callables eine Bereinigung in der untergeordneten Aufgabe durchführen müssen, können Sie die Methode after
für eine SpatieForkFork
-Instanz verwenden.
before
und after
in der übergeordneten Aufgabe. Wenn Sie den übergebenen Callable before
oder after
der Ausführung in der übergeordneten Aufgabe zulassen müssen, müssen Sie diesen Callable an das parent
Argument übergeben.
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 (),
);
Sie können auch verschiedene Abschlüsse übergeben, die in der untergeordneten und der übergeordneten Aufgabe ausgeführt werden
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 (),
);
Alle Ausgabedaten werden in einem Array gesammelt und stehen zur Verfügung, sobald alle untergeordneten Elemente fertig sind. In diesem Beispiel enthält $results
drei Elemente:
$ results = Fork:: new ()
-> run (
fn () => ( new Api )-> fetchData (userId: 1 ),
fn () => ( new Api )-> fetchData (userId: 2 ),
fn () => ( new Api )-> fetchData (userId: 3 ),
);
Die Ausgabe ist auch in den after
-Callbacks verfügbar, die immer dann aufgerufen werden, wenn ein untergeordnetes Element fertig ist, und nicht ganz am Ende:
$ 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 ,
);
Schließlich werden Rückgabewerte von untergeordneten Aufgaben mithilfe der in PHP integrierten serialize
serialisiert. Das bedeutet, dass Sie alles zurückgeben können, was Sie normalerweise in PHP serialisieren können, einschließlich Objekte:
$ result = Fork:: new ()
-> run (
fn () => new DateTime ( ' 2021-01-01 ' ),
fn () => new DateTime ( ' 2021-01-02 ' ),
);
Standardmäßig werden alle Callables parallel ausgeführt. Sie können jedoch eine maximale Anzahl gleichzeitiger Prozesse konfigurieren:
$ results = Fork:: new ()
-> concurrent ( 2 )
-> run (
fn () => 1 ,
fn () => 2 ,
fn () => 3 ,
);
In diesem Fall werden die ersten beiden Funktionen sofort ausgeführt und sobald eine davon beendet ist, wird auch die letzte gestartet.
composer test
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Weitere Informationen finden Sie unter BEITRAGEN.
Bitte lesen Sie unsere Sicherheitsrichtlinie zum Melden von Sicherheitslücken.
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.