Zum Hauptinhalt springen

Einführung

Die Process-Fassade von Laravel ist ein schlanker Wrapper um die Symfony-Process-Komponente. Sie bietet eine knappe API, um aus einer Laravel-Anwendung heraus Shell-Kommandos aufzurufen und deren Ergebnisse zu verarbeiten.

Prozesse starten

Mit Process::run() führen Sie ein Kommando synchron aus und erhalten das Ergebnis.
use Illuminate\Support\Facades\Process;

$result = Process::run('ls -la');

return $result->output();
Die ProcessResult-Instanz stellt verschiedene Methoden bereit, um das Ergebnis zu prüfen.
$result = Process::run('ls -la');

$result->command();       // Ausgeführtes Kommando
$result->successful();    // Erfolgreich? (Exit-Code 0)
$result->failed();        // Fehlgeschlagen? (Exit-Code ungleich 0)
$result->output();        // Standardausgabe (stdout)
$result->errorOutput();   // Fehlerausgabe (stderr)
$result->exitCode();      // Exit-Code

Bei Fehler eine Exception werfen

Um bei einem Exit-Code größer als 0 die Ausnahme Illuminate\Process\Exceptions\ProcessFailedException auszulösen, verwenden Sie throw() bzw. throwIf().
$result = Process::run('ls -la')->throw();

$result = Process::run('ls -la')->throwIf($condition);

Prozessoptionen

Arbeitsverzeichnis

Mit path() geben Sie das Arbeitsverzeichnis an. Ohne Angabe wird das aktuelle Arbeitsverzeichnis des PHP-Skripts verwendet.
$result = Process::path(__DIR__)->run('ls -la');

Standardeingabe

Mit input() übergeben Sie Daten an die Standardeingabe des Prozesses.
$result = Process::input('Hello World')->run('cat');

Timeout

Standard sind 60 Sekunden. Mit timeout() ändern Sie den Wert. Bei einem Timeout wird der Prozess abgebrochen und ProcessTimedOutException geworfen.
$result = Process::timeout(120)->run('bash import.sh');
Auch die CarbonInterval-Helferfunktionen sind nutzbar.
use function Illuminate\Support\minutes;

$result = Process::timeout(minutes(2))->run('bash import.sh');
Um das Timeout ganz zu deaktivieren, verwenden Sie forever().
$result = Process::forever()->run('bash import.sh');
Sie können auch ein Idle-Timeout festlegen (Sekunden ohne Ausgabe).
$result = Process::timeout(60)->idleTimeout(30)->run('bash import.sh');

Umgebungsvariablen

Mit env() fügen Sie Umgebungsvariablen hinzu oder überschreiben sie. Die Systemvariablen werden automatisch geerbt.
$result = Process::forever()
    ->env(['IMPORT_PATH' => __DIR__])
    ->run('bash import.sh');
Um eine geerbte Variable auszuschließen, setzen Sie sie auf false.
$result = Process::forever()
    ->env(['LOAD_PATH' => false])
    ->run('bash import.sh');

Ausgabe unterdrücken

Wenn große Ausgaben nicht benötigt werden, sparen Sie mit quietly() Speicher.
$result = Process::quietly()->run('bash import.sh');

Ausgabe in Echtzeit

Übergeben Sie run() eine Closure als zweites Argument, erhalten Sie die Ausgabe in Echtzeit.
$result = Process::run('ls -la', function (string $type, string $output) {
    echo $output;
});

Pipelines

Mit Process::pipe() verknüpfen Sie die Ausgabe eines Kommandos mit der Eingabe des nächsten.
use Illuminate\Process\Pipe;
use Illuminate\Support\Facades\Process;

$result = Process::pipe(function (Pipe $pipe) {
    $pipe->command('cat example.txt');
    $pipe->command('grep -i "laravel"');
});

if ($result->successful()) {
    // ...
}
Sie können auch ein Array mit Kommando-Strings übergeben.
$result = Process::pipe([
    'cat example.txt',
    'grep -i "laravel"',
]);
Wenn Sie jedem Prozess mit as() einen Schlüssel geben, können Sie in der Ausgabe-Closure erkennen, welcher Prozess die Ausgabe erzeugt hat.
$result = Process::pipe(function (Pipe $pipe) {
    $pipe->as('first')->command('cat example.txt');
    $pipe->as('second')->command('grep -i "laravel"');
}, function (string $type, string $output, string $key) {
    // $key ist entweder 'first' oder 'second'
});

Asynchrone Prozesse

Mit Process::start() starten Sie einen Prozess asynchron. Während der Prozess läuft, kann die Anwendung anderen Aufgaben nachgehen.
$process = Process::timeout(120)->start('bash import.sh');

while ($process->running()) {
    // Weitere Arbeit
}

$result = $process->wait();

Prozess-ID und Signale

Mit id() erhalten Sie die Prozess-ID des laufenden Prozesses.
$process = Process::start('bash import.sh');

return $process->id();
Mit signal() senden Sie ein Signal an den Prozess.
$process->signal(SIGUSR2);

Ausgabe eines asynchronen Prozesses

Während der Ausführung liefern latestOutput() und latestErrorOutput() die seit dem letzten Abruf entstandene Ausgabe.
$process = Process::timeout(120)->start('bash import.sh');

while ($process->running()) {
    echo $process->latestOutput();
    echo $process->latestErrorOutput();

    sleep(1);
}
Um zu warten, bis eine bestimmte Ausgabe erscheint, verwenden Sie waitUntil().
$process = Process::start('bash import.sh');

$process->waitUntil(function (string $type, string $output) {
    return $output === 'Ready...';
});

Timeout in asynchronen Prozessen prüfen

Rufen Sie in Schleifen ensureNotTimedOut() auf, um bei einem Timeout eine Exception zu erhalten.
$process = Process::timeout(120)->start('bash import.sh');

while ($process->running()) {
    $process->ensureNotTimedOut();

    sleep(1);
}

Parallele Prozesse

Mit Process::pool() führen Sie mehrere Prozesse parallel aus.
use Illuminate\Process\Pool;
use Illuminate\Support\Facades\Process;

$pool = Process::pool(function (Pool $pool) {
    $pool->path(__DIR__)->command('bash import-1.sh');
    $pool->path(__DIR__)->command('bash import-2.sh');
    $pool->path(__DIR__)->command('bash import-3.sh');
})->start(function (string $type, string $output, int $key) {
    // ...
});

while ($pool->running()->isNotEmpty()) {
    // ...
}

$results = $pool->wait();
Mit concurrently() schreiben Sie „Pool sofort starten und auf Ergebnisse warten“ in einer Zeile.
[$first, $second, $third] = Process::concurrently(function (Pool $pool) {
    $pool->path(__DIR__)->command('ls -la');
    $pool->path(app_path())->command('ls -la');
    $pool->path(storage_path())->command('ls -la');
});

echo $first->output();

Prozessen Namen geben

Mit as() weisen Sie jedem Prozess einen String-Schlüssel zu, sodass Ergebnisse eindeutig zugänglich sind.
$pool = Process::pool(function (Pool $pool) {
    $pool->as('first')->command('bash import-1.sh');
    $pool->as('second')->command('bash import-2.sh');
    $pool->as('third')->command('bash import-3.sh');
})->start(function (string $type, string $output, string $key) {
    // ...
});

$results = $pool->wait();

return $results['first']->output();
Sie können auch an den gesamten Pool ein Signal senden.
$pool->signal(SIGUSR2);

Tests

Prozesse faken

Mit Process::fake() testen Sie, ohne dass echte Shell-Kommandos ausgeführt werden.
use Illuminate\Support\Facades\Process;

Process::fake();

$response = $this->get('/import');

Process::assertRan('bash import.sh');
Ausgabe und Exit-Code lassen sich vorgeben.
Process::fake([
    '*' => Process::result(
        output: 'Test output',
        errorOutput: 'Test error output',
        exitCode: 1,
    ),
]);

Bestimmte Kommandos faken

Über Wildcards oder konkrete Kommando-Strings als Schlüssel legen Sie individuelle Fakes fest.
Process::fake([
    'cat *'    => Process::result(output: 'file contents'),
    'ls -la'   => Process::result(output: 'file listing'),
]);

Sequenzen faken

Wenn dasselbe Kommando mehrfach aufgerufen wird, geben Sie die Reihenfolge der Ergebnisse an.
Process::fake([
    'ls *' => [
        Process::result('first time'),
        Process::result('second time'),
    ],
]);

Assertions

MethodeBeschreibung
Process::assertRan('command')Prüft, dass ein Kommando ausgeführt wurde
Process::assertNotRan('command')Prüft, dass ein Kommando nicht ausgeführt wurde
Process::assertRan(fn)Detaillierte Prüfung über eine Closure
Process::assertRanTimes('command', 3)Prüft, dass ein Kommando N-mal ausgeführt wurde

Unerwartete Prozesse verhindern

Mit Process::preventStrayProcesses() wird eine Exception geworfen, sobald ein Kommando ausgeführt wird, für das kein Fake definiert wurde.
Process::preventStrayProcesses();

Process::fake([
    'ls *' => Process::result('file listing'),
]);

// Exception: für 'bash import.sh' ist kein Fake definiert
Process::run('bash import.sh');

Verwandte Seiten

Artisan-Konsole

Eigene Kommandos erstellen und Prozesse aufrufen

Queues

Vergleich zu asynchroner Verarbeitung
Zuletzt geändert am 13. Juli 2026