Заставить PHP ждать, пока скрипт Matlab завершит выполнение [duplicate]

Возможный дубликат:

Команда php exec (или аналогичная), чтобы не ждать результата

exec () ожидает ответа в PHP

У меня есть скрипт php, который вызывает и запускает скрипт Matlab. Результатом сценария 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;

Тем не менее, похоже, что после отправкипройти' Команда php не ожидает завершения работы сценария Matlab. Таким образом, если файл образа не существует до запуска кода PHP, то я получаю сообщение об ошибке.

Есть ли способ сделать так, чтобы код php ожидал завершения работы сценария Matlab, прежде чем он попытается загрузить файл изображения?

 user55784629 окт. 2012 г., 19:45
помеченный ответ на 2-ю ссылку выглядит идеально для меня.
 Baba29 окт. 2012 г., 19:46
Дагон ... выглядит, но решает нааа .. провел симуляцию, и это не решает проблему .. у хакре есть идеальное решение, я удивляюсь, почему пока нет ответа
 hakre29 окт. 2012 г., 19:45
ОП хочет дождаться завершения программы. Проблема в том, что он работает в фоновом режиме (как это выглядит). Однако почемуpassthru Я должен спросить. Не имея готового Matlab, поэтому я не могу проверить.
 user55784629 окт. 2012 г., 19:42
неправильно должно было быть:stackoverflow.com/questions/7093510/...
 Josiah29 окт. 2012 г., 20:09
Дадим идею сна / цикла. Я думаю, что это будет работать просто отлично. Не совсем уверен, как работает функция proc_open. Я'Я только пару дней возился с php, так что есть чему поучиться. Благодарю.
 Baba29 окт. 2012 г., 19:44
@Dagon но ссылки не решают вопросы ОП ....
 hakre29 окт. 2012 г., 19:40
Вы можете спать / зацикливаться и ждать появления выходного файла изображения. Кроме того, если Matlab закрывается, вы могли бы использоватьproc_open и дождитесь окончания процесса:

Ответы на вопрос(2)

Я верю, если вы измените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;
    }

}
 wisefish29 окт. 2012 г., 20:01
Я думаю, что вам нужно пересмотреть условный цикл while.
 Anthony Hatzopoulos29 окт. 2012 г., 20:36
@setsuna спасибо, я исправил это.
 Anthony Hatzopoulos30 окт. 2012 г., 18:52
лол, да, это намного лучше @setsuna, спасибо
 Josiah29 окт. 2012 г., 20:07
Я попытался изменить passthru на exec, и он все еще дает мне ошибку. Однако цикл проверки файла может работать. Я'Дадим трещину. Благодарю.
Решение Вопроса

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();
}
 Josiah29 окт. 2012 г., 20:24
Кажется, это работает просто отлично. Я также попробовал простой цикл, опубликованный Энтони, который работал, хотя яЯ выбираю ваш в качестве ответа из-за дополнительной проверки ошибок. У меня все еще есть проблема, когда изображение ненеправильно отправляется обратно на мою HTML-страницу (этос отображением ASCII, а не изображения), но этоЭто отдельная тема. Спасибо!
 Baba29 окт. 2012 г., 20:25
@Josiah рад, что смог помочь

Ваш ответ на вопрос