PHP同时运行循环和脚本

时间:2014-07-23 09:21:19

标签: php ajax multithreading fopen

我目前在PHP脚本中运行一个循环来检查用户连接是否已中止(connection_aborted() does not work on ajax calls):

connection_check.php

<?php
ignore_user_abort(true);
for ($i = 0; $i < 1000; $i++) {
    echo "<br>";
    flush();
    ob_flush();
    if (connection_aborted()) {
        echo "nocon";
        exit;
    } else {
        // Everything is fine
    }
    sleep(3);
}
?>

但是,当这个循环在&#34; background&#34;中运行时,我还需要运行我的其余PHP代码。因此,当连接中止时,脚本将死亡,但如果不是,则脚本应继续运行。我需要这样做,因为我用ajax调用调用这个PHP文件。

这是我尝试过的,然而,它不起作用(脚本继续运行并且不会死亡,connection_check.php不回应&#34; nocon&#34;) :

file.php

<?php
$child = fopen('http://ipaddress/core/connection_check.php', 'r');

/***
* ALL PHP CODE HERE THAT SHOULD START RUNNING RIGHT AWAY WHILE CONNECTION_CHECK.PHP RUNS IN THE BACKGROUND
***/

$response = stream_get_contents($child);

if($response == "nocon") {
    die();
}
?>

有任何帮助吗?如果有人有替代方案,那也值得赞赏。我已经花了一天多的时间研究这个问题,但还没有运气。

2 个答案:

答案 0 :(得分:1)

在您的代码中,您在循环中调用sleep(3)并且循环运行1000次,您是否尝试等待3000秒以完成循环?我假设您希望每3秒检查一次用户是否仍然连接。

我的建议是删除sleep,删除循环并使PHP基本上只检查一次连接并返回相关的响应。每隔X秒通过AJAX调用此PHP。您可以在Javascript中查看setTimeoutsetInterval来实现此目的。也许每次完成AJAX调用时都设置超时以再次调用它。

像这样的东西(Javascript / jQuery)

function checkConnection() {
    // Ajax call here
    $.ajax({
        // Other AJAX stuff
        complete: function() {
           setTimeout(function(){
               checkConnection();
           }, /*<YOURTIMEHERE>*/);
        }
    });
}

checkConnection();

或者甚至更好的是,当连接被认为是活动时,你可以将setTimeout位置于成功回调中。

答案 1 :(得分:-2)

使用:

ob_start(); 然后你的循环