Php jquery的传入数据事件处理程序

Php jquery的传入数据事件处理程序,php,events,jquery,javascript-events,Php,Events,Jquery,Javascript Events,我正在编写一个PHP代码,从我的服务器ping一台计算机。代码很简单,但我认为浏览器正在缓存传入的数据: run.php <?php for ($i=0; $i<10; $i++) { $host = '127.0.0.1'; $port = 80; $waitTimeoutInSeconds = 1; if($fp = fsockopen($host,$port,$errCode,$errStr,$wa

我正在编写一个PHP代码,从我的服务器ping一台计算机。代码很简单,但我认为浏览器正在缓存传入的数据:

run.php

<?php

    for ($i=0; $i<10; $i++) {
        $host = '127.0.0.1'; 
        $port = 80; 
        $waitTimeoutInSeconds = 1; 
        if($fp = fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds)){   
            // It worked 
            echo "yes, you can access $ip from this server<BR>";
            sleep(1);
        } else {
            // It didn't work 
            echo "nope, you cannot access $ip from this server<BR>";
        } 
        fclose($fp);
    }

?>
index.php

<script src="http://code.jquery.com/jquery-1.10.0.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script>
    $.ajax({
        url: 'run.php',
        success: function(data) {
            $('.ping-data').append(data);
        }
    });
</script>
Ping data:
<div class="ping-data" style="border: 1px solid #9f9f9f; width: 600px; min-height: 400px;"></div>

但是当我运行code index.php时,它会等待并回显整个数据一次,而不是每秒打印一行ping。如何捕获此事件并在发送一行数据时打印数据?

只需从PHP文件中删除循环,使其只执行一次请求,并将循环添加到客户端Javascript

只需从PHP文件中删除循环,使其只执行一次请求,并将循环添加到客户端Javascript

您需要从php中删除sleep/for,并在js中创建一个函数来对服务器进行间歇ping,如:

var interval = setInterval(ping, 1000);
var times = 0;
var timestorun = 10;
function ping(){
    if(times < timestorun){
        times++;
    }else{
        clearInterval(interval);
        return false;
    }
    $.ajax({
        url: 'run.php',
        success: function(data) {
            $('.ping-data').append(data);
        }
    });
}

您需要从php中删除sleep/for,并在js中创建一个函数来对服务器进行间歇ping,如:

var interval = setInterval(ping, 1000);
var times = 0;
var timestorun = 10;
function ping(){
    if(times < timestorun){
        times++;
    }else{
        clearInterval(interval);
        return false;
    }
    $.ajax({
        url: 'run.php',
        success: function(data) {
            $('.ping-data').append(data);
        }
    });
}

除了类的答案之外,我建议将cache参数添加到ajax调用中,以避免浏览器端缓存:

var interval = setInterval(ping, 1000);
var times = 0;
var timestorun = 10;
function ping(){
    if(times < timestorun){
        times++;
    }else{
        clearInterval(interval);
        return false;
    }
    $.ajax({
        url: 'run.php',
        cache: false,
        success: function(data) {
            $('.ping-data').append(data);
        }
    });
}

另请参见添加到类的答案,我建议将cache参数添加到ajax调用中,以避免浏览器端缓存:

var interval = setInterval(ping, 1000);
var times = 0;
var timestorun = 10;
function ping(){
    if(times < timestorun){
        times++;
    }else{
        clearInterval(interval);
        return false;
    }
    $.ajax({
        url: 'run.php',
        cache: false,
        success: function(data) {
            $('.ping-data').append(data);
        }
    });
}


另请参见

在js而不是php上创建超时。我添加了timeout:1,但它不起作用!我假设timeout:1被添加到ajax函数中。这只会将run.php的调用延迟1/1000秒。在js而不是php上创建一个超时。我添加了timeout:1,但它不起作用!我假设timeout:1被添加到ajax函数中。这只会将run.php的调用延迟1/1000秒。是的,在Javascript中使用setInterval函数。是的,在Javascript中使用setInterval函数。理论上,唯一的潜在问题是,第二次ping的结果可能会在第一次ping的结果之前返回,由于某种网络延迟影响了运行PHP的服务器和浏览器之间的第一次ping。这和ping无关,只和AJAX数据通信有关。但在实践中,由于存在1秒超时,因此在这种情况下不太可能出现问题。在这种情况下,如果用户需要,可以在success函数中使用setTimeoutping,10,而不是使用setInterval和ping作为第一行。如果我想使用execping而不使用java脚本的固定间隔,该怎么办?我的意思是,我想监听服务器,每当它发送一行数据时,我就会接收并回显它。换句话说,我希望服务器发出一个事件,客户端处理该事件。socket.io/nodejs是javascript库,用于与服务器通信,而不是相反。至少据我所知,socket.io用于真正的双向通信;这就是WebSocket的全部内容。但是你是对的,我忘记了socket.io没有PHP版本的事实。还有另一个库,让我找到链接……理论上,唯一的潜在问题是,第二次ping的结果可能会在第一次ping的结果之前返回,因为某种网络延迟会影响运行PHP的服务器和浏览器之间的第一次ping。这和ping无关,只和AJAX数据通信有关。但在实践中,由于存在1秒超时,因此在这种情况下不太可能出现问题。在这种情况下,如果用户需要,可以在success函数中使用setTimeoutping,10,而不是使用setInterval和ping作为第一行。如果我想使用execping而不使用java脚本的固定间隔,该怎么办?我的意思是,我想监听服务器,每当它发送一行数据时,我就会接收并回显它。换句话说,我希望服务器发出一个事件,客户端处理该事件。socket.io/nodejs是javascript库,用于与服务器通信,而不是相反。至少据我所知,socket.io用于真正的双向通信;这就是WebSocket的全部内容。但是你是对的,我忘记了socket.io没有PHP版本的事实。还有另一个库可以,让我找到链接…我认为您未能正确复制和粘贴某些内容…我希望在某个地方看到cache:false。我考虑对您的问题进行编辑,以添加缓存部分。这会有点讽刺,不是吗?@Class我可以编辑,但我尝试添加cache:false,但不是根据您的建议。我认为您未能正确复制和粘贴某些内容…我希望在某个地方看到cache:false。我想对您的问题进行编辑,添加cache部分。这有点讽刺,不是吗?@Class我可以编辑,但我试过添加cache:false,不是根据你的建议