PHP MYSQL JQuery 长轮询 - 未按预期工作

PHP MYSQL JQuery Long Polling - Not working as expected

我的长轮询实现不起作用。很难理解从哪里调试上述代码。

要点

PHP 部分 -

$path= $_SERVER[ 'DOCUMENT_ROOT']; 
$path .= "/config.php" ; 
require_once($path);

require_once(PHP_PATH . "/classes/user.php");

session_start(); 

require_once(PHP_PATH . "/functions/database.php");

// Return to Login if no Session
if(!isset($_SESSION['user'])){
    header("Location: /login");
    die();
}

$db = connectdatabase();

$timeout = 40;    

// if no post ids kill the script // Should never get here
if(!isset($_POST['post_ids'])){
    die();
}

if(!isset($_POST['timestamp'])){
    die();
}

$last_ajax_call = $_POST['timestamp'];
$post_ids = trim(strip_tags($_POST['post_ids']));
$id = $_SESSION['user']->getID();

// Check if there are posts from the last search that need to be updated with a comments or the like number has to be updated
$query = "SELECT posts.*, users.first_name, users.last_name, users.picture
        FROM posts
        LEFT JOIN users
        ON users.id = posts.user_id
        WHERE ((UNIX_TIMESTAMP(posts.date) > :last_ajax_call OR UNIX_TIMESTAMP(posts.last_modified) > :last_ajax_call) 
        AND posts.parent IN (:post_ids)) OR (posts.id IN (:post_ids) AND UNIX_TIMESTAMP(posts.last_modified) > :last_ajax_call)";

while ($timeout > 0) {
    $check_for_updates = $db->prepare($query);
    $check_for_updates->bindParam(':post_ids', $post_ids);
    $check_for_updates->bindParam(':last_ajax_call', $last_ajax_call);
    $check_for_updates->execute();
    $r = $check_for_updates->fetchAll();

    if(!empty($r)){
        // Get current date time in mysql format
        $unix_timestamp = time();

        // Cofigure result array to pass back
        $result = array(
            'timestamp' => $unix_timestamp,
            'updates' => $r
        );

        $json = json_encode($result);
        echo $json;
        return;
    } else {
        $timeout --;
        usleep( 250000 );
        clearstatcache();
    }
}
// you only get here if no data found
$unix_timestamp = time();

// Cofigure result array to pass back
$result = array(
    'timestamp' => $unix_timestamp
);

$json = json_encode($result);
echo $json;

JQuery Ajax -

function getUpdates(timestamp) {
            var post_ids = $("#newsfeed").find("#post_ids").attr('data-post-ids');
            var data = {'timestamp' : timestamp,
                        'post_ids' : post_ids};

            poll = $.ajax({
                    type: 'POST',
                    url: '/php/check_for_updates.php',
                    data: data,
                    async: true, /* If set to non-async, browser shows page as "Loading.."*/
                    cache: false,
                    success: function(data) {
                        try {
                            // put result data into "obj"
                            var obj = jQuery.parseJSON(data);
                            // put the data_from_file into #response
                            //$('#response').html(obj.data_from_file);
                            // repeat
                            console.log("SQL: " + obj['timestamp']);
                            setTimeout( function() {
                                // call the function again, this time with the timestamp we just got from server.php
                                getUpdates(obj['timestamp']);
                            }, 1000 );

                        } catch( e ) {
                            // repeat
                            // Get mysql formated date
                            var unix_timestamp = Math.floor(Date.now() / 1000);

                            console.log("JS:  " + unix_timestamp);
                            setTimeout( function() {
                                getUpdates(unix_timestamp);
                            }, 1000 );
                        }

                    }
                }
            );
        }

您可以做的两件事是:

1.) Open the Chrome Developer tools and then click on the Network tab and clear everything out. Then click on submit. Look at the network tab and see what is being posted and what isn't. Then adjust accordingly from there.

2.) Echo out different steps in your php script and do the same thing with the Network tab and then click on the "results" area and see what's being echoed out and if it's as expected.

从那里,您应该能够调试正在发生的事情并找出问题所在。

感谢大家的帮助!我问了很多人,找到了很多调试代码的好地方。

我终于在这里找到了答案 -

看起来我 PHP 检查更新阻止了任何更新的发生,直到 PHP 停止检查更新。