【问题标题】:How to redirect php while the shell_exec() command is running at background?shell_exec() 命令在后台运行时如何重定向 php?
【发布时间】:2018-12-13 19:24:58
【问题描述】:

当点击按钮时,一个 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,直到预定运行 30 分钟的 python 脚本结束。

目前我只是在 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');   

}?>

Python

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])

谢谢。

【问题讨论】:

  • 这究竟是一个 Python 问题? (=> 标签已移除,下次添加无关标签前请三思)。
  • 也许你没有粘贴整个 Python 脚本,但如果你粘贴了,你错过了“sys”模块的导入。

标签: php redirect cmd execute


【解决方案1】:

要一次性运行您的 Python 脚本,您可以像这样在后台运行它:

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

或者如果它不能以这种方式工作,则将该调用与nohup 结合起来。

【讨论】:

  • 浏览器现在在不调用脚本的情况下被重定向,因为它在 windows 上因此不能使用 nohup。
  • 嗯,有很多东西可能会出错。例如,PHP 脚本是否找到了 Python 解释器? Python 解释器是否找到脚本?
  • 它在包含新脚本之前运行过。我应该发布我的整个代码吗?
  • 我用你的 Python 脚本尝试了我的 PHP 调用,但它可以在 Linux 上运行。
  • 运行进程的“&”在 Windows 中不起作用。您可以尝试使用 Powershell cmdlet 'Start-Process -NoNewWindow ...'。
【解决方案2】:

你可以使用:

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

在 PHP 中。然后命令将在后台运行

【讨论】:

  • 浏览器现在无需调用脚本即可重定向
  • 已发布。请看。
【解决方案3】:

你可以使用函数ignore_user_abort:

当将 PHP 作为命令行脚本运行时,脚本的 tty 会在脚本没有终止的情况下消失,那么脚本将在下次尝试写入任何内容时终止,除非值设置为 TRUE

注意:

在尝试向客户端发送信息之前,PHP 不会检测到用户已中止连接。仅使用 echo 语句并不能保证发送信息,请参阅 flush()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多