实时拍卖系统 要用php+mysql做一个实时拍卖系统,以前没接触过。关于即时竞价刷新,当访问量大的时候怎么解决。(例如在30秒的倒计时时间中,有大量用户竞拍)给出思路和技术的都给分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个也没接触过 你看看这个吧 希望能帮助你http://blog.s135.com/post/311/实时更新用ajax ajax+setTimeout()//jssleep()//php//通过ajax+setTimeout()每个一段时间(1秒或者...)请求服务器,在php里用sleep()处理(如果数据有变更,那么返回,没有则sleep()),可能有人会说这是刷机了,其实不然,如果没有sleep()那么每个机器会不停发送请求(无论数据是否更新了),而用sleep()进行遏制请求的刷机情况就会很好讲这个问题处理好了,当然了判断数据是否更新了,有很多种,自己想吧----如上其实就是comet长连接思想,当然这只是理论上的(没有在大服务器上弄过,只是自己做过,不过听说qq就是用这个原理不知道是不是真的) 希望你能够明白//a.html<textarea id="msg" rows="5" cols="30"></textarea><input type="button" value="发送" onclick="send()"><span id="sendmsg"></span><script src="../jquery.js"></script><script>function send(){ var msg = document.getElementById("msg").value; if(!msg)document.getElementById("sendmsg").innerHTML = "消息不能为空"; document.getElementById("sendmsg").innerHTML = "正在发送..."; $.post("server.php", {"msg": msg, "rand": Math.random()}, function(data){ if(data == "1"){ document.getElementById("sendmsg").innerHTML = "发送成功!"; }else{ document.getElementById("sendmsg").innerHTML = "发送失败!"; } });}</script>//b.html<div id="div"></div><script src="../jquery.js"></script><script>function text_replace(text){ var l = text.length; for (var i = 0; i < l; i++) { if (text.charAt(i) == "%"){ if(text.charAt(i+1) == "2"){ if(text.charAt(i+2) == "3"){ text = text.replace("%23","#"); } if(text.charAt(i+2) == "4"){ text = text.replace("%24","$"); } if(text.charAt(i+2) == "6"){ text = text.replace("%26","&&"); } if(text.charAt(i+2) == "B"){ text = text.replace("%2B","+"); } if(text.charAt(i+2) == "C"){ text = text.replace("%2C",","); } if(text.charAt(i+2) == "F"){ text = text.replace("%2F","/"); } } if(text.charAt(i+1) == "3"){ if(text.charAt(i+2) == "F"){ text = text.replace("%3F","?"); } if(text.charAt(i+2) == "B"){ text = text.replace("%3B",";"); } if(text.charAt(i+2) == "D"){ text = text.replace("%3D","="); } if(text.charAt(i+2) == "A"){ text = text.replace("%3A",":"); } } if(text.charAt(i+1) == "4"){ if(text.charAt(i+2) == "0"){ text = text.replace("%40","@"); } } } } return text;}var filemtime = 0;function test(){ $.post("server.php", {"filemtime": filemtime, "rand": Math.random()}, function(data){ if(data){ data = eval("(" + data + ")"); filemtime = data["filemtime"]; document.getElementById("div").innerHTML = text_replace(decodeURI(data["msg"])); setTimeout("test()", 1000); }else{ alert("error"); } });}test();</script>//server.php<?phpfunction DBConnect(){ mysql_connect('192.168.1.2', 'chushandb', 'chushandb'); mysql_select_db('chushandb'); mysql_query('set names gbk');}if(isset($_POST['msg'])){ $msg = iconv('utf-8', 'gbk', htmlspecialchars($_POST['msg'])); DBConnect(); mysql_query('insert into test(msg) values("'.$msg.'")'); if(mysql_insert_id()){ $fp = fopen('msgfile.txt', 'a'); fputs($fp, $msg, 1); echo '1'; exit; } echo '2'; exit;}$filemtime = isset($_POST['filemtime']) && $_POST['filemtime']? $_POST['filemtime']: filemtime('msgfile.txt');while(1){ if($filemtime == filemtime('msgfile.txt')){ sleep(1); clearstatcache(); }else{ DBConnect(); $rs = mysql_query('select msg from test order by id desc limit 0, 1'); if($row = mysql_fetch_assoc($rs)){ $msg = rawurlencode(iconv('gbk', 'utf-8', $row['msg'])); } echo json_encode(array('filemtime' => filemtime('msgfile.txt'), 'msg' => $msg)); exit; }}?> 问题是,你现在的压力在哪里呢?除了必须实时的数据,其余的缓存如果是ajax请求的,需要显示剩余商品数量,也可以缓存,几秒更新一次, 3 楼的代码 如果是几百种商品,访问量大的话 能行么前台用ajax 局部刷新, 后台用多线程处理,这个想法可行么? 考虑下flash做socket client,socket server(不推荐php做,java/c/c++都行)不断推送给socket client,基于tcp,一次连接,不停更新。http的话,一来一回的,用户量增大的话,不敢想象。 之前我公司也有这样的需求,但个人认为这样的系统可行性不大,特别是刷机方面很难得到控制,用ajax实现的话,如果产品多了性能肯定很差,http实现本人觉得没太大的可能吧,应该基于tcp来做 数据库的机子一定要牛.. 可以设计1小时内结束的竞拍分库存储. 抗并发webserver首选nginx。MYSQL的话表使用innodb类型,避免表锁并提供回滚。设置起拍的间隔时间。客户端让用户自己刷或者JS刷都可以。。缓存竞拍以外的所有东西。。 每次竞拍时候把要竞拍的货品及数量存储在xml中当用户竞价的时候 用 socket 和 xml 通讯这样能应付 货品数量大和用户访问量大的问题么? 关于即时竞价刷新,当访问量大的时候怎么解决。(例如在30秒的倒计时时间中,有大量用户竞拍)------------------难点可能高并发数据库读写抗并发webserver首选nginx。----这个可能是个办法,或者其他负载均可,apache内存高的话也行,主要是提高php的并发能力。数据库上能否尝试读写分离(如果更新memcache快的话也可考虑那个)。一是写的速度:如何才能更快和并发;二是读的速度(因为你前面要不断刷,而且不能缓存,当然你也可能缓存在2-3秒) 你看看这个吧,或许能帮到你www.sooowo.com 读的时候是每秒刷新一次 用ajax 发送get请求 读xml文档写的时候比读的少更新数据库和xml文档可行否? 具体细节还没看,大概的看了下。js每秒 ajax 向 server 发请求,写数据库时,使用 事务 来处理用户的拍卖。感觉是这样做,少用户还可以,但多用户,恐怕很难承受,不过我这里的服务器是自己的。 php并发这块支持本来就不怎么好,我认为php的comet做法已经很适合了 不知道楼主认为sleep睡眠好还是一直不停的刷数据库 做下压力测试吧,说什么都没用。http想完成实时任务,感觉不靠谱。 如何在php页面以数组的方式打印mysql的表的每一列的名字 php下载内容为中文的文件时打开为乱码 执行php文件的bat写法求助 PHP与MYSQL5.0老连接不上 这种效果怎么实现的? 防盗链? linux安装问题! 对文件进行类似select...where的查找,用什么函数? 问一个mysql语句 在使用mssql提交字段内容经常出现数据益出,如何搞好??? 求中文俩字符串匹配包含的函数。 在空间安装wordpress,出现错误,空间数据库也已经建好 mysql的select count如何才能更快点?
实时更新用ajax
sleep()//php//通过ajax+setTimeout()每个一段时间(1秒或者...)请求服务器,在php里用sleep()处理(如果数据有变更,那么返回,没有则sleep()),可能有人会说这是刷机了,其实不然,如果没有sleep()那么每个机器会不停发送请求(无论数据是否更新了),而用sleep()进行遏制请求的刷机情况就会很好讲这个问题处理好了,当然了判断数据是否更新了,有很多种,自己想吧----如上其实就是comet长连接思想,当然这只是理论上的(没有在大服务器上弄过,只是自己做过,不过听说qq就是用这个原理不知道是不是真的)
//a.html<textarea id="msg" rows="5" cols="30"></textarea>
<input type="button" value="发送" onclick="send()"><span id="sendmsg"></span><script src="../jquery.js"></script>
<script>
function send(){
var msg = document.getElementById("msg").value;
if(!msg)document.getElementById("sendmsg").innerHTML = "消息不能为空";
document.getElementById("sendmsg").innerHTML = "正在发送...";
$.post("server.php", {"msg": msg, "rand": Math.random()}, function(data){
if(data == "1"){
document.getElementById("sendmsg").innerHTML = "发送成功!";
}else{
document.getElementById("sendmsg").innerHTML = "发送失败!";
}
});
}
</script>
//b.html
<div id="div"></div><script src="../jquery.js"></script>
<script>
function text_replace(text){
var l = text.length;
for (var i = 0; i < l; i++) {
if (text.charAt(i) == "%"){
if(text.charAt(i+1) == "2"){
if(text.charAt(i+2) == "3"){
text = text.replace("%23","#");
}
if(text.charAt(i+2) == "4"){
text = text.replace("%24","$");
}
if(text.charAt(i+2) == "6"){
text = text.replace("%26","&&");
}
if(text.charAt(i+2) == "B"){
text = text.replace("%2B","+");
}
if(text.charAt(i+2) == "C"){
text = text.replace("%2C",",");
}
if(text.charAt(i+2) == "F"){
text = text.replace("%2F","/");
}
}
if(text.charAt(i+1) == "3"){
if(text.charAt(i+2) == "F"){
text = text.replace("%3F","?");
}
if(text.charAt(i+2) == "B"){
text = text.replace("%3B",";");
}
if(text.charAt(i+2) == "D"){
text = text.replace("%3D","=");
}
if(text.charAt(i+2) == "A"){
text = text.replace("%3A",":");
}
}
if(text.charAt(i+1) == "4"){
if(text.charAt(i+2) == "0"){
text = text.replace("%40","@");
}
}
}
}
return text;
}var filemtime = 0;
function test(){
$.post("server.php", {"filemtime": filemtime, "rand": Math.random()}, function(data){
if(data){
data = eval("(" + data + ")");
filemtime = data["filemtime"];
document.getElementById("div").innerHTML = text_replace(decodeURI(data["msg"]));
setTimeout("test()", 1000);
}else{
alert("error");
}
});
}test();
</script>//server.php
<?php
function DBConnect(){
mysql_connect('192.168.1.2', 'chushandb', 'chushandb');
mysql_select_db('chushandb');
mysql_query('set names gbk');
}if(isset($_POST['msg'])){
$msg = iconv('utf-8', 'gbk', htmlspecialchars($_POST['msg']));
DBConnect();
mysql_query('insert into test(msg) values("'.$msg.'")');
if(mysql_insert_id()){
$fp = fopen('msgfile.txt', 'a');
fputs($fp, $msg, 1);
echo '1';
exit;
}
echo '2';
exit;
}$filemtime = isset($_POST['filemtime']) && $_POST['filemtime']? $_POST['filemtime']: filemtime('msgfile.txt');while(1){
if($filemtime == filemtime('msgfile.txt')){
sleep(1);
clearstatcache();
}else{
DBConnect();
$rs = mysql_query('select msg from test order by id desc limit 0, 1');
if($row = mysql_fetch_assoc($rs)){
$msg = rawurlencode(iconv('gbk', 'utf-8', $row['msg']));
}
echo json_encode(array('filemtime' => filemtime('msgfile.txt'), 'msg' => $msg));
exit;
}
}?>
访问量大的话 能行么
前台用ajax 局部刷新, 后台用多线程处理,这个想法可行么?
抗并发webserver首选nginx。
MYSQL的话表使用innodb类型,避免表锁并提供回滚。
设置起拍的间隔时间。
客户端让用户自己刷或者JS刷都可以。。
缓存竞拍以外的所有东西。。
把要竞拍的货品及数量存储在xml中当用户竞价的时候 用 socket 和 xml 通讯这样能应付 货品数量大和用户访问量大的问题么?
(例如在30秒的倒计时时间中,有大量用户竞拍)
------------------难点可能高并发数据库读写抗并发webserver首选nginx。----这个可能是个办法,或者其他负载均可,apache内存高的话也行,主要是提高php的并发能力。数据库上能否尝试读写分离(如果更新memcache快的话也可考虑那个)。一是写的速度:如何才能更快和并发;二是读的速度(因为你前面要不断刷,而且不能缓存,当然你也可能缓存在2-3秒)
读的时候是每秒刷新一次 用ajax 发送get请求 读xml文档写的时候比读的少
更新数据库和xml文档可行否?
js每秒 ajax 向 server 发请求,写数据库时,使用 事务 来处理用户的拍卖。感觉是这样做,少用户还可以,但多用户,恐怕很难承受,不过我这里的服务器是自己的。