2013-04-22 1 views
0

У меня возникла проблема с командой оболочки, которая работает до того, как я захочу. Например, у меня есть 6 команд, которые я хочу запустить последовательно, а первые 5 работают нормально, но как только я доберусь до последнего, который опирается на результат, полученный предыдущим, он не будет работать , Другими словами, есть ли в любом случае, что я могу сделать свою последнюю команду не запущенной UNTIL, пятый полностью завершен? Ниже приведен краткий обзор фрагмента кода для этой ситуации.Нужна команда shell_exec для ожидания до ее выполнения.

 /*Renders user image*/ 
     //$command_1 = 'cd ./***/; povray +I'.$newname.' +O'.$newname_t.' +D '.$_POST['AA'].' +H75 +W100'; 
     $command_2 = 'cd ./***/; povray +I'.$newname.' +O'.$newname_i.' +D '.$_POST['AA'].' '.$_POST['resolution']; 

     /*Command to copy the .pov, .ini, and .inc files from User_Files to the correct animation directory before frame renders can be done*/ 
     $command_cp_pov = 'cp ***'.$newname.' ***'.$location; 
     $command_cp_ini = 'cp ***'.$newname_j.' ***'.$location; 
     $command_cp_inc = 'cp *** ***'.$location; 


     /*Render the frames for the animation*/ 
     $command_3 = 'cd ***'.$location.'; povray +I '.$newname_j.' +A +H384 +W512'.'> /dev/null 2>/dev/null &'; 

     /*Testing purposes*/ 
     //echo $command_3."\n"; 

     /*Throw together the animation using the .png files in the directory*/ 
     $command_4 = 'cd ***'.$location.'; convert -delay 0 -loop 0 *.png animation.gif'.'> /dev/null 2>/dev/null &'; 

     /*Testing purposes*/ 
     //echo $command_4; 

     $shellOutput = shell_exec($command_2); 
     $shellOutput = shell_exec($command_cp_pov); 
     $shellOutput = shell_exec($command_cp_ini); 
     $shellOutput = shell_exec($command_cp_inc); 
     $shellOutput = shell_exec($command_3); 
     // I want this command to run once the previous one is completely finished 
     $shellOutput = shell_exec($command_4); 

5-shell_exec команда работает .ini файл с помощью POVRAY создать 50 кадров сцены, так что я могу затем использовать ImageMagick, чтобы поместить все эти кадры вместе в GIF. В настоящее время он работает некорректно, потому что мне нужен способ как-то задержать выполнение команды_4 до тех пор, пока команда command_3 не будет полностью завершена (все 50 кадров будут визуализированы).

Если кому-то интересно, что означают все звездочки ('*'), то это просто я не чувствую себя комфортно, показывая свои фактические местоположения на моем сервере. Извините, если это смущает кого угодно.

+0

вы можете проверить, работает ли процесс, глядя на его идентификатор процесса. –

ответ

0

Что бы разница, если вы использовали вместо Exec и проверить переменную возвращаемого Succes, а затем запустить LaStone

/*Throw together the animation using the .png files in the directory*/ 

    /* can you change command to remain in the browser, 
     and report the results rather than writing to dev/null? */ 
    $command_3 = 'cd ***'.$location.'; povray +I '.$newname_j.' +A +H384 +W512'.'2>&1'; 


    exec($command_3,$shellOutput,$return_value); 
    // I want this command to run once the previous one is completely finished 
    if ($return_value === 0){ 
     $command_4 = 'cd ***'.$location.'; convert -delay 0 -loop 0 *.png animation.gif'.' 2>&1'; 

     exec($command_4,$shellOutput,$return_value); 
     if ($return_value !== 0){ 
       $failed_result = "An error on 4 ($return) occured.<br>"; 
       foreach($shellOutput as $v) 
        echo "shelloutput: $v<br>"; 
     } 
    } else { 
     $failed_result = "An error on 3 ($return) occured.<br>"; 
     foreach($shellOutput as $v) 
        echo "shelloutput: $v<br>"; 
    } 
+0

К сожалению, это не устраняет мою проблему. Я проверил его, но все же получил те же результаты, что и раньше. Я все равно получаю все 50 кадров, но файл .gif просто не создается. – Drew

+0

Попробуйте ввести результаты команды exec. – ndasusers

+0

Все в порядке, позже я думаю, что вы можете запустить их в спину. На данный момент необходимо выяснить, почему он не пишет файл. – ndasusers

0

Я не понимаю синтаксис используемой оболочки. Но если это помогает, у меня никогда не было проблем с тем, что bash был настолько нетерпелив, что начал одну команду, прежде чем povray закончил предыдущий рендеринг в огромной партии. Я использовал синтаксис вроде этого:

Баш

для г в fracpos04 * .pov; do povray $ i + fn + w1280 + h960 + kff225 + a0.3; сделано

0

Вы можете получить этот результат с помощью PHP Process API.

Если вы посмотрите на функцию proc_close вы увидите, что ясно сказано:

proc_close() ожидает процесса прекратить, и возвращает код завершения.

Есть хороший пример на proc_open manual page. Во время выполнения вы можете получать обновления статуса, вызывая proc_get_status.

Смежные вопросы