从PHP运行AMPL代码(Laravel Process)

时间:2018-04-26 12:40:20

标签: php laravel symfony ubuntu symfony-process

我正在尝试使用Symfony Process从Laravel运行一个Ampl .run(或任何放大代码)文件。我的代码如下:

$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());

但我无法开始放大。我得到一个错误:

  

“”“”命令“'。/ AMP'”失败。\ n \ n退出代码:2(误用shell)   builtins)\ n \ n工作目录:   /usr/local/bin/amplitude/amplide.linux64\n \ n输出:\ n   ================ \ n \ n \ n错误输出:\ n   ================ \ n“”“

我怀疑这是目录中的权限错误,但是当我使用时:

$commandArray = array('ls');

它可以工作并输出文件和文件夹列表。我知道Ampl基本上是一个终端程序,所以如何访问和编写命令呢?

如果有人可以解释如何从Process访问终端程序,我认为这将非常有帮助。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我发现这里的问题是只需通过键入./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文件中,然后执行它。

如果需要将参数传递给Laravel的.dat文件,使用字符串连接将其传递给命令会导致问题,尽管我不知道原因。我建议首先使用Laravel中的Storage类更新.dat文件,然后使用.run文件运行Ampl问题。