长轮询:停滞在While循环中

时间:2014-10-26 作者:JimQ

我正在尝试编写一个长轮询函数,该函数仅在某些自定义post\\u meta更新后立即将数据返回给客户端。这个自定义post\\u meta是一个unix时间戳,然后与客户端通过AJAX发送给函数的unix时间戳进行比较。如果post\\u meta值高于客户机值,则将post\\u meta值发送回客户机。但由于某种原因,该函数一直停留在while循环中,用于比较两个时间戳。unix时间戳似乎格式正确,可以进行比较,没有问题,我在while循环之外尝试了这一点。但是,当在while循环和post\\u meta中同时更新时,while循环不会停止。while循环的条件似乎永远不会改变,无论数据库中的更新值是多少(当然更高)。我错过了什么?

function my_sync_function () { 

$post_id = intval(wp_strip_all_tags($_GET[\'post_id\'])); // make post ID integer

$lastRequest = wp_strip_all_tags($_GET[\'timestamp\']); // unix timestamp

$lastModified = get_post_meta( $post_id, \'last_modified\', true ); // unix timestamp

// do nothing until the lastModified timestamp is greater than the lastRequest timestamp
while ($lastModified <= $lastRequest) {
    usleep(2000000);           
    clearstatcache();    
    $lastModified = get_post_meta( $post_id, \'last_modified\', true ); // check for updated timestamp       
}

$result[\'type\'] = \'success\';
$result[\'timestamp\'] = $lastModified;
$result = json_encode($result);
echo $result;

die();
}
    add_action(\'wp_ajax_my_sync_function\', \'my_sync_function\');

1 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

PHP不是一种多任务语言,您不应该尝试这样使用它。换句话说,除非您使用专门为支持长轮询而设计的语言构造,否则您不应该尝试甚至尝试进行长轮询。

特别是对于你的问题,你可能会失败,因为wordpress有一个习惯,即在内存中缓存尽可能从DB中检索的马赫数信息(这是核心功能,不涉及插件)。在我的内存中,一旦检索到post元数据,它就会被缓存,因此get_post_meta( $post_id, \'last_modified\', true ) 始终返回相同的值。您需要使缓存无效,以便能够执行您正在尝试的操作,或者绕过WP API向DB发送查询。

此外,您的代码对服务器的性能有非常坏的影响,因为您让一个apache进程繁忙,而没有做任何有用的事情,这意味着如果您让apache运行10个进程,那么您可以在代码运行时减少10%的请求。

另一个因素是php执行时间限制,通常设置为30秒,因此您的长轮询过程将在30秒后停止,而不会通知您。

结束

相关推荐

Admin AJAX不适用于非登录用户

我知道这个问题已经讨论过很多次了,但我想大多数建议我都试过了。这是我的代码:$.post(\'<?php echo admin_url( \'admin-ajax.php\' ) ?>\', {\'action\': \'load_posts\', \'offset\': offset, \'author\' : <?php echo $uid?>, \'cat\' : \'<?php echo $ca