Запуск кода AMPL из PHP (Laravel Process) - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь запустить файл .run (или любой другой код) из Laravel, используя Symfony Process. Мой код, как показано ниже:

$commandArray = array('./ampl');

$process = new Process($commandArray);

        $process->setWorkingDirectory('/usr/local/bin/amplitude/amplide.linux64');
        $process->run();

        if (!$process->isSuccessful()) 
        {
            throw new ProcessFailedException($process);
        }

        dd($process->getOutput());

Но я не могу запустить усилитель. Я получаю сообщение об ошибке:

"" "Команда" './ampl' "не выполнена. \ N \ n Код выхода: 2 (неправильное использование оболочки встроенный) \ n \ n Рабочий каталог: /usr/local/bin/amplitude/amplide.linux64\n \ n Вывод: \ n ================ \ n \ n \ n Вывод ошибки: \ n ================ \ n "" "

Я подозревал, что это ошибка прав доступа в каталоге, но когда я использую:

$commandArray = array('ls');

работает и выводит список файлов и папок. Я понимаю, что amp по сути является терминальной программой, так как мне получить к ней доступ и написать команды?

Если кто-то может объяснить, как получить доступ к терминальным программам из Process, я думаю, это было бы очень полезно. Заранее спасибо.

1 Ответ

0 голосов
/ 27 апреля 2018

Я понял, что проблема в том, что простой вызов консоли усилителя с помощью набора ./ampl не вызывает никакого ответа. Поскольку это не может быть интерпретировано как фактическая команда, Laravel выдает ошибку. Хитрость заключается в том, чтобы передать фактическую команду объекту процесса и , чтобы всегда указывать полный путь к любому файлу .run / .mod / .dat, который вы буферизуете. Например:

$commandArray = array('./ampl path/to/example.run;');

или

$command = './ampl path/to/example.run';

отлично работает и даст ответ.

Еще одна важная вещь, которую я заметил, заключалась в том, что, поскольку AMPL - это, по сути, еще одна программа, работающая в терминале, мы не можем отдельно передавать различные команды процессу, используя массивы, подобные следующим:

$commandArray = array('./ampl model.mod;','./ampl data.dat;', './ampl solve;');

Это не будет работать. Также не будет это:

$commandArray = array('./ampl, model.mod; data.dat; solve;');

В идеале лучше всего иметь все в файле .run и затем выполнить его.

Если вам нужно передать параметры в файл .dat из Laravel, передача этого в команды с использованием конкатенации строк вызывает проблемы, хотя я точно не знаю, почему. Я бы предложил использовать класс Storage в Laravel, чтобы сначала обновить файл .dat, а затем запустить задачу amp, используя файл .run.

...