【问题标题】:PHP And Bash result with AJAX使用 AJAX 的 PHP 和 Bash 结果
【发布时间】:2014-10-15 07:44:40
【问题描述】:

我正在创建一种系统来通过我的 linux 机器上的 Web 界面复制文件。

我有一个 bash 脚本、php 页面和 html 页面,它正在向 PHP 页面发出 AJAX 请求。

这里是这个系统中数据流的一个例子

HTML Page Form With AJAX -> PHP Script -> exec('./copy.sh '.$_REQUEST['folder'].' '.$_REQUEST['target'].'', $Output, $Result); echo end($Output); -> HTML Page Status div

这里是 Exec 函数的 PHP 部分:

exec('./copy.sh '.$_REQUEST['folder'].' '.$_REQUEST['target'].'', $Output, $Result); 
echo end($Output);

这是我的 copy.sh

#!/bin/bash
InitialDir="$(cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd )"
Folder=$1
TargetDir=$2
cd "${InitialDir}"
rsync -a ${Folder} ${TargetDir} && echo "Complete!"

问题是,我想在这个操作中添加进度条,它适用于这段代码:

$('#CopyFiles').click(function(){
overlaystart();
var url = "/copy.php";
$.ajax({
    type: "POST",
    url: url,
    data: {folder: Folder, target: TargetFolder},
    success: function(data)
    {

    }
});

setTimeout(function(){
    closestart();
    window.location = '/';
}, 9000);


$('.progressbarstart').animate(
    {width:'100%'}, 
    {
        duration:8000,
        step: function(now, fx) {
            if(fx.prop == 'width') {
                $(this).html(Math.round(now * 100) / 100 + '%');
            }
        }
    }        
);
});

但是问题来了,AJAX 完美运行,php 脚本运行没有问题,但问题是,即使文件复制速度超过 9 秒(进度条动画时间),覆盖仍然打开,但有时文件会复制时间超过 9 秒。

所以我要问的是:

  1. 是否可以通过 php + ajax 以某种方式监控复制进度(非强制性)
  2. 是否可以让 AJAX 关闭窗口,即使它还剩 4 秒以动画进度条,但收到“已完成!”来自 bash 的回应
  3. 如果以上都不可行,我还能做什么?

附:以下是我试图实现的目标的简短描述:

AJAX to PHP -> Execute Bash File -> Wait For Response -> Is Completed?
                                           ^            |
                                           |            -> Yes -> Close Modal Window Overlay
                                           |            |
                                           |            -> No -> |
                                           |                     |
                                            _____________________

【问题讨论】:

  • 你能发布你的php代码的exec部分吗?您可以使用popen() 并阅读您的脚本输出,然后发回信息?检查this answer 的想法。
  • @Seçkin 我想我已经发布了我的 bash 文件和 exec 文件(第一个代码标签)。 popen 很好,但是如果我再次查询我的 php 文件(使用 ajax),它将开始新的复制过程

标签: javascript php ajax bash


【解决方案1】:

我们使用下一个模式。在您的步骤“等待响应”中对服务器进行长时间操作(但不是文件复制)时,我们会启动定期 ajax 请求以观察流程执行。主进程取消执行时间限制。进度条的数据(以及可能的用户取消命令)我们尝试通过用户会话在主进程和 ajax-watchers 之间交换数据。我们遇到了阻塞会话数据的问题,我们不知道 session_write_close(); 并通过 db 进行了数据交换,但这是一个错误的决定,应该使用 session_write_close() 重构为会话。

【讨论】:

    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多