Как перенаправить php, когда команда shell_exec () работает в фоновом режиме? - PullRequest
0 голосов
/ 05 июля 2018

При нажатии кнопки вызывается страница PHP, которая, в свою очередь, выполняет команду shell_exec (), которая запускает скрипт python. Проблема в том, что запуск сценария python займет почти 30 минут, а браузер будет работать до тех пор, пока сценарий фактически не завершится. Итак, есть ли способ, чтобы при запуске команды shell_exec она возвращалась обратно, тогда как скрипт python запускается в фоновом режиме?

if(isset($_POST['fire_automation_now'])){

    $cmd = "python schedule_php.py now";
    shell_exec($cmd); 
    header('location:index.php');   

} 

Теперь он не перенаправляет на index.php до тех пор, пока не закончится сценарий python, который запланирован на 30 минут.

В настоящее время я просто создаю текстовый файл с задержкой 300 с, чтобы имитировать ожидание в сценарии.

HTML

<form action="fire_automation.php" method="POST">
  <div class=" row">
    <div class="col-md-6">
  <button type="submit" name="fire_automation_now" class="btn btn-large btn-success">Run Now</button>
  </div>
</div>
</form>

PHP

<?php
if(isset($_POST['fire_automation_now'])){

    $cmd = "python schedule_php.py now";
    shell_exec($cmd); 
    header('location:index.php');   

}?>

ПИТОН

import time

def now():
    time.sleep(300)
    open("test.txt", "w")

def main(choice):
    if choice == "now":
        now()

if __name__ == '__main__':
    main(sys.argv[1])

Спасибо.

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вы можете использовать функцию ignore_user_abort:

При запуске PHP как сценария командной строки, когда tty сценария удаляется без завершения сценария, сценарий умрет в следующий раз, когда попытается что-либо написать, если значение не установлено в TRUE

Примечание:

PHP не обнаружит, что пользователь прервал соединение, пока не будет предпринята попытка отправить информацию клиенту. Простое использование оператора echo не гарантирует отправку информации, см. Flush ().

0 голосов
/ 05 июля 2018

Для однократного запуска скрипта Python вы можете просто запустить его в фоновом режиме, например:

shell_exec("python schedule_php.py now > /dev/null 2>/dev/null &"); 

Или объедините этот вызов с nohup, если он не работает таким образом.

0 голосов
/ 05 июля 2018

вы можете использовать:

exec($cmd . " > /dev/null &");

в PHP. тогда команда будет работать в фоновом режиме

...