0

重複の可能性:PHPで応答を待機している
結果exec()を待機しないphp execコマンド(または同様のコマンド)

Matlabスクリプトを呼び出して実行するphpスクリプトがあります。Matlabスクリプトの結果は.png画像であり、これをphpに読み込んで、Webページに送信します。私が持っている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スクリプトの実行が終了するのを待ってから、画像ファイルを読み込もうとするようにする方法はありますか?

4

2 に答える 2

2

passthruここでの主な問題ではありません..しかし、コマンドからの応答があるとすぐに、画像は即座に書き込まれるのではなく、3番目のプロセスによって書き込まれると思います

file_get_contentsこの場合も失敗する可能性があります。これは、イメージが1回または書き込み中に書き込まれず、ファイルロックが発生する可能性があるためです。いずれの場合も、出力を送信する前に有効なイメージがあることを確認する必要があります。

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();
}
于 2012-10-29T19:07:46.467 に答える
1

それに変更すればpassthruexec意図したとおりに機能すると思います。これを試すこともできます:

$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;
    }

}
于 2012-10-29T18:45:04.823 に答える