我目前正在尝试让网页看起来更现代化,但我在向模态窗口添加一些相对简单的功能时遇到了一些麻烦。
在我的网页上,用户首先上传文件,然后在点击提交时,文件由shell脚本处理(根据文件大小,可能需要几秒到几分钟)。
我一直在做的是显示进程状态是使用php执行以下代码:
$cmd = "script.bash -i $input_file";
$PID = shell_exec($cmd . " >> $log 2>&1 & echo $!");
while(is_process_running($PID)){
echo(" . ");
ob_flush(); flush();
sleep(3);
}
除了显示的一些其他信息(未显示)之外,这只会打印出“。”每隔几秒钟就会向用户显示进程正在运行的指示。完成后,将显示下载链接,以便可以检索已处理的数据。
我现在要做的是在模态窗口中加载此信息。我可以毫不费力地创建模态窗口(使用boostrap和javascript)并为其添加下载功能,但是只有在通过php执行的$ cmd完成后才能执行此操作。我想要做的是执行$ cmd,加载模态窗口,然后查询进程状态并在模态窗口中显示某种指示符,最后在进程完成时创建下载链接。我相信这需要通过AJAX来完成,但我对如何做到这一点感到有点困惑。这是我的代码更详细一点:
<?
if($theaction == "run_script" and !$error_msg){
$cmd = "script.bash -i $input_file";
$PID = shell_exec($cmd . " >> $log 2>&1 & echo $!");
while(is_process_running($PID)){ #ensure the process is compete before loading the html
echo("");
ob_flush(); flush();
sleep(3);
}
echo "
<script type=\"text/javascript\">
$(function() { $(\"#myModalProcess\").modal('show') })
</script>
<div class=\"modal fade\" id=\"myModalProcess\" tabinex=\"-1\" role=\"dialog\" aria-hidden=\"true\">
<div class=\"modal-dialog\">
<div class=\"modal-content\">
<div class=\"modal-header\">
<h4><b>Process ID: $PID</b></h4>
<hr>
<p>Other stuff here</p>
<a type=\"button\" class=\"btn btn-primary\" href='".$_SERVER['PHP_SELF']."?theaction=download&workDir=$workDir&out_folder=$out_folder'>Download Results</a>
</div>
</div>
</div>
</div>
";
}
?>
答案 0 :(得分:1)
我会为你澄清这个流程,但是我不会给你代码,因为它写得太长了,我认为你最好首先理解你需要开发的理论。
因此,第一个错误是在运行php脚本后尝试执行javascript和html(模态)代码。
你应该做的是使用ajax,所以你可以通过“ajax”运行你的php脚本(里面有你的shell脚本),再次使用ajax你可以在php脚本运行时询问进度。
所有这一切都应该有点简单,我知道,但问题是你在这里有各种复杂的东西:
希望这有帮助,如果您有任何其他具体问题,请问:)