- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发具有实时投标系统的现场拍卖网站。当用户对项目出价时,我正在使用 LONG POLLING。我选择了长轮询,因为 WebSockets 还没有得到很好的支持,而且 NODEJS 对我来说现在实现起来太复杂了。所以我坚持使用这种简单的 ajax 长轮询,它非常适合大约五个出价。
所以问题是: 出价非常适合 1 秒间隔内的 5-6 个项目出价(我从 server-ajax 得到即时响应),但是第 7 个(点击)出价按钮这个响应-long 轮询挂起大约 16-22 秒,然后完成请求。最后,所有内容都在数据库中更新并完成,但在每 5-6 个投标响应/ajax 调用后挂起大约 16-22 秒。
我怎样才能减少这个时间,无论用户出价多少次,一切都应该顺利,没有延迟...
我在 localhost/wamp 上使用 Apache/PHP/MySql
我的代码:index.php
<script type="text/javascript" charset="utf-8">
var old_timestamp = <?php echo $old_timestamp;?>; //here i'm echoing last timestamp of auction
function waitForMsg(){
jq.ajax({
type: "POST",
url: "http://localhost/bid/comet/poll.php",
data: {"old_timestamp" : old_timestamp},
async: true,
cache: false,
success: function(data){
var json = eval('(' + data + ')');
if(json['msg'] != "") {
jq('#comet_display').html(json['msg']); //here I show ID of which auction item was bidded
}
old_timestamp = json['old_timestamp'];
setTimeout('waitForMsg()',100);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
setTimeout('waitForMsg()',1000);
}
});
}
jq(window).load(function(){
waitForMsg();
jq("#a_loader").show();
var url = "http://localhost/bid/auctions-ajax"; // the script where you handle the form input.
jq.ajax({
type: "POST",
url: url,
data: {au978 : true},
async:false, //to sem dodal za časovni zamik
success: function(data)
{
jq("#a_loader").hide();
jq("#show-category").html(data); // show response from the php script.
},
error: function(result) {
jq("#show-category").html("Sorry, something went wrong. Please try again later.");
}
});
});
function bid(id){
var url = "http://localhost/bid/comet/update-auction.php"; // the script where you handle the form input.
var user_id=<?php echo $user_id;?>; //user id from session
jq.ajax({
type: "POST",
url: url,
data: {"auct_id" : id, "user_id" : user_id}, // serializes the form's elements.
success: function(data)
{
//it updates in user table its remaining number of bids
},
error: function(XMLHttpRequest, textStatus, errorThrown){
alert("Something went wrong. Click OK to refresh.");
}
});
}
</script>
poll.php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
require_once($_SERVER['DOCUMENT_ROOT'] . 'bid/include/DEFINES.php');
require_once(CLASS_AUCTION);
require_once(CLASS_DB);
$a=new Auction();
$old_timestamp = $_POST['old_timestamp'];
$bidded_id=0;
$db=DB::getInstance();
$sql="SELECT timestamp, id FROM auction ORDER BY timestamp DESC LIMIT 1"; //desno doda tabelo kategorija
$stmt=$db->db->prepare($sql) or die("Prepare Error");
$stmt->execute();
$result2=$stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($result2 as $rez){
$current_timestamp=$rez['timestamp'];
$bidded_id=$rez['id'];
}
$stmt->closeCursor();
while($current_timestamp <= $old_timestamp){
usleep(1000);
clearstatcache();
$db=DB::getInstance();
$sql="SELECT timestamp, id FROM auction ORDER BY timestamp DESC LIMIT 1";
$stmt=$db->db->prepare($sql) or die("Prepare Error");
$stmt->execute();
$result=$stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $rez){
$current_timestamp=$rez['timestamp'];
$bidded_id=$rez['id'];
}
$stmt->closeCursor();
}
$response = array();
$response['msg'] = 'BID na avkciji: '.$bidded_id;
$response['old_timestamp'] = $current_timestamp;
echo json_encode($response);
}else{
require_once($_SERVER['DOCUMENT_ROOT'] . 'bid/errors/404.html');
}
?>
和 update-auction.php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
require_once($_SERVER['DOCUMENT_ROOT'] . 'bid/include/DEFINES.php');
require_once(CLASS_AUCTION);
require_once(CLASS_USER);
require_once(CLASS_DB);
$u=new User();
$a=new Auction();
$auction_id=$_POST['auct_id'];
$user_id=$_POST['user_id'];
$date = new DateTime();
$timestamp=$date->getTimestamp();
$a->updateAuction($auction_id,$user_id,$timestamp/*,$bid_price,$bids_spent,$total_paid*/);
$u->updateUserBids($user_id);
}else{
require_once($_SERVER['DOCUMENT_ROOT'] . 'bid/errors/404.html');
}
?>
感谢您查看我的问题!
最佳答案
考虑切换到 WebSockets。它旨在解决长轮询问题。
关于php - LONG POLLING(在 php 中)在对数据库发出 5 次请求后开始挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15588344/
我原以为 epoll 应该比 poll 快,但是当我做下面的实验时,结果发现它更慢。 首先,我设置了 1 个连接了 10 个客户端套接字的服务器套接字。 import socket server =
当我尝试在代码编辑器中粘贴时他剪掉了我的标签。它不允许它..我不明白,我什么都试过了。 有人可以帮助我.. 给我> extended_valid_elements: 'poll[poll-id
我无法唤醒被 poll.poll() 函数阻塞的线程。有人可以帮我吗? 最佳答案 处理这个问题的方法是在传递给 poll() 的描述符列表中包含一个额外的文件描述符。对于该描述符,等待读取准备就绪。让
在下面的 poll() 方法中,我的 IDE 提示它返回 JobSet。工具提示显示: my.package.JobSetQueue 中的 poll() 与 java.util.concurrent.
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
在每个 youtube 教程中,我都看到人们只是将“app_name”添加到 INSTALLED_APPS 列表中。 昨天我开始了官方 Django 教程,他们建议使用“app_name.apps.A
我正在查看 LinkedList 中的 poll() 和 unlinkFirst() 代码,但我似乎找不到如何实现如果 LinkedList 中存在 null 项,它可以防止返回 null。 poll
为什么当我尝试轮询时,我在 ajax 中看到此错误消息“(!)注意: undefined index :在 D:\wamp\www\poll\poll.php 第 6 行中进行轮询”。我有两个文件 1
我使用 python 的 cProfile 模块分析了我的 python 代码并得到了以下结果: ncalls tottime percall cumtime percall filen
我尝试通过 websocket 和轮询运行我的 socket.io 程序,它们都有效。但是,当尝试运行 xhr-polling 时,它会超时。这可能是什么原因造成的? 对于这个程序,我使用的是 soc
我正在实现自己的自定义组件,我发现我需要为消费者提供两个用例: 第一个尝试经常获取 N 条可用消息(轮询消费者) 第二个是订阅者消费者,它会在消息可用时获取消息。 我的主要问题是是否可以实现这两种类型
测试环境:Ubuntu 12.04描述:我做了以下 # `sudo truncate -s 0 /var/log/syslog` # logger "helloworld". # `cat /var/
我正在使用(很棒的)mrjob Yelp 的库在 Amazon 的 Elastic Map Reduce 中运行我的 python 程序。它依赖于标准 python 库中的子进程。在我运行 pytho
这直接来自民意调查教程,我是编程新手,正在学习 Python 和 Django,这对我来说看起来很陌生。这是 JavaScript 吗?我还需要学习什么语言才能学习 Django 吗? 民意调查/模板
我试图了解在 kafka 消费者中处理需要更长时间处理的记录的更好选择是什么?我进行了一些测试来理解这一点,并观察到我们可以通过修改 max.poll.records 来控制这一点。或 max.pol
我正在尝试创建我的 Django 项目/网站的“投票”部分,教程 (https://docs.djangoproject.com/en/1.8/intro/tutorial01/) 说在我们“激活”模
我有一个应用程序,其工作原理如下:Linux 机器生成 28 种不同类型的给客户的信件。信件必须以 .docx(Microsoft Word 格式)发送。秘书维护 MS Word 模板,必要时会自动使
我目前正在尝试让 FileSystemWatcher 工作,如 this question 中所述.在我的研究过程中,我在这个网站上发现了很多描述这个类(class)不可靠的答案和评论。相反,在某些地
我正在寻找 kafka 来实现低延迟消息队列,并且我一直在阅读有关消费者长轮询的信息。但是,没有关于如何实际使用长轮询或需要设置哪些选项才能启用它的示例。如何使用 kafka java api 启用长
用户首次登录时的通知,没那么难,只需要扫描数据库,我可以处理。然而,当 friend 在个人资料 X 上发送请求或评论时,会发送通知,并且几乎立即在另一端收到通知,即使用户 X 没有提出任何请求。是投
我是一名优秀的程序员,十分优秀!