让PHP等待Matlab脚本完成执行

时间:2012-10-29 18:29:09

标签: php matlab

  

可能重复:
  php exec command (or similar) to not wait for result
  exec() waiting for a response in PHP

我有一个调用并运行Matlab脚本的php脚本。 Matlab脚本的结果是一个.png图像,然后我想在php中加载并发送到网页。我的PHP代码是:

$matlabExe = '"C:\\Program Files\\MATLAB\\R2012a\\bin\\matlab.exe"';
$mFile = "'C:\\processSatData.m'";
$combine = '"run(' . $mFile . ');"';
$command = $matlabExe . ' -nodisplay -nosplash -nodesktop -r ' . $combine;

passthru($command);

$im = file_get_contents('C:\\habitat.png');
header('Content-type:image/png');
echo $im;

然而,似乎在发送'passthru'命令之后,php不会等待Matlab脚本完成运行。因此,如果在运行php代码之前图像文件不存在,那么我会收到一条错误消息。

有没有办法让php代码在尝试加载图片文件之前等待Matlab脚本完成运行?

2 个答案:

答案 0 :(得分:2)

passthru不是这里的主要问题..但是我想你很快就得到了你的命令的响应,图像不会立即写入,而是通过第三个过程

file_get_contents在这个实例中也可能失败,因为..图像可能不会被写入一次或在写入过程中可能导致文件锁定..无论如何你需要确保你有效发送输出前的图像;

set_time_limit(0);
$timeout = 30; // sec
$output = 'C:\\habitat.png';
$matlabExe = '"C:\\Program Files\\MATLAB\\R2012a\\bin\\matlab.exe"';
$mFile = "'C:\\processSatData.m'";
$combine = '"run(' . $mFile . ');"';
$command = $matlabExe . ' -nodisplay -nosplash -nodesktop -r ' . $combine;

try {
    if (! @unlink($output) && is_file($output))
        throw new Exception("Unable to remove old file");

    passthru($command);

    $start = time();
    while ( true ) {
        // Check if file is readable
        if (is_file($output) && is_readable($output)) {
            $img = @imagecreatefrompng($output);
            // Check if Math Lab is has finished writing to image
            if ($img !== false) {
                header('Content-type:image/png');
                imagepng($img);
                break;
            }
        }

        // Check Timeout
        if ((time() - $start) > $timeout) {
            throw new Exception("Timeout Reached");
            break;
        }
    }
} catch ( Exception $e ) {
    echo $e->getMessage();
}

答案 1 :(得分:1)

我相信如果您将passthru更改为exec,它将按预期工作。你也可以试试这个:

$matlabExe = '"C:\\Program Files\\MATLAB\\R2012a\\bin\\matlab.exe"';
$mFile = "'C:\\processSatData.m'";
$combine = '"run(' . $mFile . ');"';
$command = $matlabExe . ' -nodisplay -nosplash -nodesktop -r ' . $combine;

passthru($command);

// once a second, check for the file, up to 10 seconds
for ($i = 0; $i < 10; $i++) { 
    sleep(1);

    if (false !== ($im = @file_get_contents('C:\\habitat.png'))) {
        header('Content-type:image/png');
        echo $im;
        break;
    }

}