Я понял, что проблема в том, что простой вызов консоли усилителя с помощью набора ./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.