Pool.php
TLDR
This file contains the Pool
class, which represents a pool of processes. The class provides methods for adding processes to the pool, starting the processes, and waiting for them to finish.
Methods
as
This method adds a process to the pool with a key. It returns a PendingProcess
instance.
start
This method starts all of the processes in the pool. It accepts an optional output
callback. It returns an InvokedProcessPool
instance.
run
This method is an alias for the wait
method. It starts and waits for the processes to finish. It returns a ProcessPoolResults
instance.
wait
This method starts and waits for the processes to finish. It returns a ProcessPoolResults
instance.
__call
This magic method dynamically proxies method calls to a new pending process. It returns a PendingProcess
instance.
Classes
There are no additional classes in this file.
<?php
namespace Illuminate\Process;
use InvalidArgumentException;
/**
* @mixin \Illuminate\Process\Factory
* @mixin \Illuminate\Process\PendingProcess
*/
class Pool
{
/**
* The process factory instance.
*
* @var \Illuminate\Process\Factory
*/
protected $factory;
/**
* The callback that resolves the pending processes.
*
* @var callable
*/
protected $callback;
/**
* The array of pending processes.
*
* @var array
*/
protected $pendingProcesses = [];
/**
* Create a new process pool.
*
* @param \Illuminate\Process\Factory $factory
* @param callable $callback
* @return void
*/
public function __construct(Factory $factory, callable $callback)
{
$this->factory = $factory;
$this->callback = $callback;
}
/**
* Add a process to the pool with a key.
*
* @param string $key
* @return \Illuminate\Process\PendingProcess
*/
public function as(string $key)
{
return tap($this->factory->newPendingProcess(), function ($pendingProcess) use ($key) {
$this->pendingProcesses[$key] = $pendingProcess;
});
}
/**
* Start all of the processes in the pool.
*
* @param callable|null $output
* @return \Illuminate\Process\InvokedProcessPool
*/
public function start(?callable $output = null)
{
call_user_func($this->callback, $this);
return new InvokedProcessPool(
collect($this->pendingProcesses)
->each(function ($pendingProcess) {
if (! $pendingProcess instanceof PendingProcess) {
throw new InvalidArgumentException('Process pool must only contain pending processes.');
}
})->mapWithKeys(function ($pendingProcess, $key) use ($output) {
return [$key => $pendingProcess->start(output: $output ? function ($type, $buffer) use ($key, $output) {
$output($type, $buffer, $key);
} : null)];
})
->all()
);
}
/**
* Start and wait for the processes to finish.
*
* @return \Illuminate\Process\ProcessPoolResults
*/
public function run()
{
return $this->wait();
}
/**
* Start and wait for the processes to finish.
*
* @return \Illuminate\Process\ProcessPoolResults
*/
public function wait()
{
return $this->start()->wait();
}
/**
* Dynamically proxy methods calls to a new pending process.
*
* @param string $method
* @param array $parameters
* @return \Illuminate\Process\PendingProcess
*/
public function __call($method, $parameters)
{
return tap($this->factory->{$method}(...$parameters), function ($pendingProcess) {
$this->pendingProcesses[] = $pendingProcess;
});
}
}