Класс Process
Класс Process запускает внешние команды
из PHP-кода и позволяет управлять их выполнением.
Первым параметром передаётся массив с именем
программы и её аргументами. Класс предоставляет
методы для синхронного и асинхронного запуска,
получения вывода, кода возврата и работы с ошибками.
Синтаксис
<?php
use SymfonyComponentProcessProcess;
$process = new Process([command, arg1, arg2]);
?>
Пример
Давайте выполним команду ls и получим её вывод:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentProcessProcess;
class ProcessController extends AbstractController
{
#[Route('/process', name: 'process_index')]
public function index(): Response
{
$process = new Process(['ls', '-la']);
$process->run();
return new Response($process->getOutput());
}
}
?>
Результат выполнения кода:
"total 8"
Пример
Давайте проверим успешность выполнения команды
с помощью метода isSuccessful:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentProcessProcess;
class ProcessController extends AbstractController
{
#[Route('/process-check', name: 'process_check')]
public function check(): Response
{
$process = new Process(['php', '-v']);
$process->run();
if ($process->isSuccessful()) {
return new Response('success');
}
return new Response('fail');
}
}
?>
Результат выполнения кода:
"success"
Пример
Давайте запустим команду асинхронно
с помощью метода start и дождёмся
её завершения через wait:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentProcessProcess;
class ProcessController extends AbstractController
{
#[Route('/process-async', name: 'process_async')]
public function async(): Response
{
$process = new Process(['echo', 'hello']);
$process->start();
while ($process->isRunning()) {
// waiting
}
$process->wait();
return new Response($process->getOutput());
}
}
?>
Результат выполнения кода:
"hello"
Пример
Давайте получим вывод ошибок через
метод getErrorOutput:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentProcessProcess;
class ProcessController extends AbstractController
{
#[Route('/process-error', name: 'process_error')]
public function error(): Response
{
$process = new Process(['ls', '/nonexistent-path-abcde']);
$process->run();
return new Response($process->getErrorOutput());
}
}
?>
Результат выполнения кода:
"ls: cannot access '/nonexistent-path-abcde': No such file or directory"
Пример
Давайте создадим процесс из строки команды
с помощью статического метода fromShellCommandline:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
use SymfonyComponentProcessProcess;
class ProcessController extends AbstractController
{
#[Route('/process-shell', name: 'process_shell')]
public function shell(): Response
{
$process = Process::fromShellCommandline('echo "abcde"');
$process->run();
return new Response($process->getOutput());
}
}
?>
Результат выполнения кода:
"abcde"
Смотрите также
-
метод
run,
который синхронно запускает процесс -
метод
mustRun,
который запускает процесс и бросает исключение при ошибке -
метод
getOutput,
который возвращает стандартный вывод процесса -
метод
getErrorOutput,
который возвращает вывод ошибок процесса