Как запустить консольную команду (npm) из кода php?

Я пытаюсь выполнить команду npm --version из php. Пробовал использовать стандартный shell_exec и Process от Symfony. Вот собственно код:

<?php

namespace App\Http\Controllers;

use Symfony\Component\Process\Process;

class Home extends Controller
{
    public function main()
    {
        dd([
            'Via exec:'    => $this->tryRunNpmViaExec(),
            'Via process:' => $this->tryRunNpmViaProcess()
        ]);
    }

    public function tryRunNpmViaExec()
    {
        return shell_exec('npm --version 2>&1');
    }

    public function tryRunNpmViaProcess()
    {
        $process = new Process(['npm', '--version']);
        $process->run();

        if (!$process->isSuccessful()) {
            return $process->getErrorOutput();
        }

        return $process->getOutput();
    }
}

На выходе в браузере получаю следующее:

введите сюда описание изображения

А вот я вызываю ту же самую команду npm --version из терминала phpStorm и командной строки Windows:

введите сюда описание изображения

То есть значения переменной среды PATH у меня настроены и любые npm команды работают, но только не при выполнении из php. С чем это может быть связано и как я могу это исправить?


Ответы (1 шт):

Автор решения: Nick B

Используйте функцию exec(), чтобы выполнять команды. Первым аргументом передается сама команда, для выполнения, а вторым аргументом output (вывод) выполнения команды. Также, если задать третий параметр, то можно получить статус выполнения команды. Ниже переделан Ваш код под функцию exec()

<?php

namespace App\Http\Controllers;
    
class Home extends Controller
{
    public function main()
    {
        dd($this->tryRunNpmViaExec());
    }

    public function tryRunNpmViaExec()
    {
        return exec('npm --version');
    }
}
→ Ссылка