2013-04-27 5 views
0

Я разрываю волосы, пытаясь понять, почему это может не работать, когда оно работает при выполнении из командной строки. Я отправляю анимацию POV-Ray пользователю после выполнения рендеринга и компиляции фреймов в GIF с помощью ImageMagick. У меня есть письмо, которое отправляется через mutt sleep в течение часа, чтобы оно позволяло скомпилировать анимацию пользователя. (Я изменил его на 120 секунд, так что мне не нужно ждать часа, чтобы устранить неполадки. В этом отношении я также сделал анимацию только 3 кадра, пока не выясню проблему.)Mutt email не отправляет электронную почту с помощью shell_exec

Новый файл bash, animation_done_bash.sh, создается каждый раз, когда пользователь нажимает анимацию на моем сайте, которая, в свою очередь, создает новую папку, в которой хранятся фреймы для анимации и с анимацией_done_bash.sh. Чтобы страница PHP перейти на следующую страницу, файл bash выполняется в dev null. Я уже тестировал, если это проблема в командной строке, и она работает там, поэтому я действительно не знаю, в чем проблема.

Ниже приведен код и выход (я повторил это выход на мою страницу PHP, чтобы увидеть, что было не так), что производится, который выполняется с shell_exec:

$animation_done_email = "#!/usr/bin/bash \nsleep 120; mutt -s \"Animation Finished\" -a animation.gif -- ".$email." <email.txt;"; 

     /*Creates new animation_done_bash each time user hits animate*/ 
     $directory_bash = "./User_Files/Animation/".$location."/"; 
     $filename_bash = 'animation_done_bash.sh'; 
     $handler_bash = fopen($directory_bash.$filename_bash, "w"); 
     fwrite($handler_bash, $animation_done_email); 
     fclose($handler_bash); 

     /*Need to change the permissions on bash file so it can execute*/ 
     chmod($directory_bash."/animation_done_bash.sh", 0777); 

     $command_5 = 'cd /home/ouraccount/public_html/User_Files/Animation/'.$location.'/; bash animation_done_bash.sh > /dev/null 2>/dev/null &'; 
     $shellOutput = shell_exec($command_5); 

Где $ электронная почта электронной почты пользователя и $ location - это папка, в которой хранятся кадры. email.txt хранится в одной папке.

Выход: cd/home/ouraccount/public_html/User_Files/Animation/ani_51 /; bash animation_done_bash.sh>/dev/null 2>/dev/null &

Любое руководство было бы высоко оценено. Благодаря!

+1

Я думаю, вы идете по нему не так, просто добавьте команду в сценарий bash, который отправляет изображение после его рендеринга. – dtech

+0

Вот что я пытался сделать. Я не мог понять, как это распознать, когда это было сделано, поэтому я просто попросил отправить спам вместо этого. Что я должен использовать вместо mutt, если это не так? Я просто смущен, почему все это работает, когда я выполняю его из оболочки, но не тогда, когда он выполняется на PHP, даже если я изменил разрешения. – Dominick

+0

Возможно, потому, что PHP останавливается или пользователь неверен или по какой-то другой причине. Слишком много возможностей, это просто неверный прецедент для PHP. Ниже я расскажу о фрагменте примера. Это проблема XY: http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – dtech

ответ

1

В таких ситуациях нажатие (вызов сценария при завершении операции рендеринга) является предпочтительным для опроса (периодически проверяя, завершена ли операция рендеринга).

Если вы не можете нажать, сделайте это только на одном языке, не создавайте гибрид bash и PHP. Здесь есть 2 примера вы можете попробовать, которые могли бы удовлетворить вашу ситуацию:

Пример, если рендеринг команды возвращается после окончания:

<?php 
    /** PHP wrapper around rendering command X that mails the output **/ 
    // Don't write attachment code yourself, use a class like PHPMailer: https://github.com/Synchro/PHPMailer 
    require_once('class.phpmailer.php'); 

    // Ignore user browser close, rendering takes a long time 
    ignore_user_abort(true); 
    // On windows you'll also need to set_time_limit to something large. On Unix PHP doesn't count things like database queries and shell commands, on Windows it does 

    // Execute render command, don't forget to escape if you use user input 
    // Script will only continue once renderer returns. If renderer return before rendering is finished you cannot use this 
    $render_output = shell_exec('renderer input.file output.file'); 
    // Could also be done in PHP for finer control and error handling 
    $imagemagick_output = shell_exec("convert output.file animation.gif"); 
    unlink("output.file"); 

    $mail = new PHPMailer(); 
    $mail->addAttachment('animation.gif'); 
    // etc. 

    unlink("animation.gif"); 
    ?> 

Пример, если рендеринг команды возвращает до окончания:

<?php 
    /** PHP wrapper around rendering command X that mails the output **/ 
    // Don't write attachment code yourself, use a class like PHPMailer: https://github.com/Synchro/PHPMailer 
    require_once('class.phpmailer.php'); 

    // Ignore user browser close 
    ignore_user_abort(true); 

    // Execute render command, don't forget to escape if you use user input 
    // If renderer returns before file is finished use this 
    $render_output = shell_exec('renderer input.file output.file 2> error.file'); 

    // Wait for rendering to finish 
    // Implement these function, e.g. file_exists for output.file or error.file 
    while(!rendering_has_failed() && !rendering_is_finished()) { 
     sleep(15*60); // Low-resource wait for 15 minutes 
    } 

    // Could also be done in PHP for finer control and error handling 
    $imagemagick_output = shell_exec("convert output.file animation.gif"); 
    unlink("output.file"); 

    $mail = new PHPMailer(); 
    $mail->addAttachment('animation.gif'); 
    // etc. 

    unlink("animation.gif"); 
    ?> 
+0

Или просто создайте один сценарий оболочки для выполнения в фоновом режиме; 'Визуализации; конвертировать; mutt' – tripleee

+0

@tripleee Также хороший вариант, но повышенная вероятность возникновения призрачных процессов и труднее отлаживать ошибки. – dtech

+0

Спасибо всем! Я буду смотреть на это на будущее. На данный момент я отправил ссылку на анимацию вместо этого пользователю. Из того, что я вижу, хотя вышеупомянутое решение будет работать с тем, что я пытался выполнить. Спасибо за твою помощь! – Dominick

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