我正在尝试编写一个长轮询函数,该函数仅在某些自定义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\');
最合适的回答,由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秒后停止,而不会通知您。