2

我正在尝试将两种想法结合起来,但我不确定它们是否相互兼容。

想法 1:让 php 脚本运行命令(例如:ping)并在 Web 浏览器中提供命令的实时结果。

想法 2:出现一个 jQuery 对话框,打开时运行 php 脚本并在对话框中提供实时结果。

想法 1 很容易实现(ping.php):

<?php
header('Content-Type: text/html; charset=utf-8');
set_time_limit(1800);
ob_implicit_flush(true);
ob_end_flush();

$exe_command = 'C:\\Windows\\System32\\ping.exe -n 10 google.com';

$descriptorspec = array(
    0 => array("pipe", "r"),  // stdin
    1 => array("pipe", "w"),  // stdout -> we use this
    2 => array("pipe", "w")   // stderr 
);
flush(); 

$process = proc_open($exe_command, $descriptorspec, $pipes);
echo "<pre>";  

if (is_resource($process))
{
    while ($s = fgets($pipes[1])) {  
        print $s; 

        flush();  
    }  
}
echo "</pre>"; 
?>

如果我在浏览器中打开 ping.php,我会得到一行一行的响应 YAY!

想法 2 给我带来了麻烦。我可以打开对话框,但直到 php 完成工作后数据才会出现。这可能是 ajax 的本质,所以我可能在正确的方法上偏离了目标。

这是我在 index.html 中的 javascript:

<script language="Javascript">

function testGetScript() {
    $.getScript("./cgi-bin/ping.php", function(data) {
        var divResults = document.getElementById('pingMe');
        divResults.innerHTML = data;
    });
}

function initDialogs() {
    $('#testDialog').dialog({
        autoOpen: false,
        width: 800,
        title: "PINGING.....",
        modal: true,
        open: function(event, ui) {
            testGetScript();
        },
        close: function() {
            $(this).dialog("close");
            },
        buttons: [
            {text: "Done", click: function() {
                $(this).dialog("close");
            }}
        ]
    });

}

$(document).ready(function(){
    initDialogs();

    $("*[class='btn']").button().click(function() {
            $('#testDialog').dialog('open');
    });

</script>

有人对这是否可能有任何想法吗?如果是这样,您对如何实现这一点有任何建议吗?

4

4 回答 4

2

用于jQuery.get()请求您的 PHP 页面,getScript用于加载 javascript 文件。

$.get('yourpage.php', {}, function(data, status, xhr) {
    // all done, get your content from the data variable.
});

如果您在 get 调用的正文中显示弹出窗口,而不是从对话框中调用 get,则对话框将在包含所有数据后显示。

编辑:AJAX 似乎在显示任何信息之前等待 readyState 4。PHP 刷新似乎发送了 3 的 readyState。您需要监听并填写 responseText

有一些潜在的错误可能需要禁用压缩并将内容类型设置为 application/octet-stream

于 2013-07-29T18:51:55.797 回答
0

您可以按照您的方式执行此操作,除非您需要为 jQuery 的 getScript 使用 done 函数。

http://api.jquery.com/jQuery.getScript/

我更喜欢使用他们的 ajax 函数

http://api.jquery.com/jQuery.ajax/

如果您需要它来更新设置一个 js 间隔/超时

于 2013-07-29T18:52:03.360 回答
0

正如建议的那样,我将我的工作标记为这个问题的答案,以便其他人可以从中受益。

首先,我在 index.html 中的对话框中添加了一个 iFrame:

<div id="pwrShellDiagWC" style="display: none;">
<iframe id="ajaxFrameWC" src="" width="100%" height="60%"; frameborder="0"></iframe>
</div>

然后在 Javascript(使用 jQuery)中,我初始化了这个对话框,将代码添加到“open”选项以将 php url 加载到 iFrame 中:

$('#pwrShellDiagWC').dialog({
autoOpen: false,
width: 800,
title: "Processing your request",
resizable: false,
modal: true,
open: function(event, ui) {
    var frameAttrib = $('#ajaxFrameWC').attr('src');
    var phpURL = './cgi-bin/test.php?value1=arg1';

    if (frameAttrib) {
         // do nothing!
    }
    else {
         $('#ajaxFrameWC').attr('src',phpURL)
    }
});

我也添加了一些按钮,但我不相信你需要看到它才能工作。test.php 使用我在问题中输入的代码,并在对话框中逐行显示。

我现在正在研究的唯一方面是强制 iFrame 保持滚动在底部,但我相信一些放置得当的搜索会让我过去那个小麻烦。

干杯,希望这对某些人有帮助!

于 2013-08-30T17:22:37.523 回答
0

我遇到了同样的问题,作为我的搜索结果,你可以使用 XMLHttpRequest。

<html>
<head>
<script type="text/javascript" src="jquery-1.11.3.js"></script>
<script type="text/javascript" language="javascript">
function changeText() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', '/test.php', true);
    xhr.send(null);
    var timer;
    timer = window.setInterval(function() {
        if (xhr.readyState == XMLHttpRequest.DONE) {
            window.clearTimeout(timer);
            $('body').append('done <br />');
        }
        $('#phanxMessage').html(xhr.responseText);
        console.log(xhr.responseText);
    }, 1000);
}

</script> 
</head>
<body>
<input id="submit" onclick="changeText();" type="button" value="Get PHP Response"/>
<textarea id="phanxMessage" rows="30" cols="100">
</textarea>
</body>
</html>

见[1]:jquery ajax,增量读取流?

于 2015-11-07T04:16:42.207 回答