要用php+mysql做一个实时拍卖系统,以前没接触过。关于即时竞价刷新,当访问量大的时候怎么解决。
(例如在30秒的倒计时时间中,有大量用户竞拍)给出思路和技术的都给分

解决方案 »

  1.   

    这个也没接触过 你看看这个吧 希望能帮助你http://blog.s135.com/post/311/
    实时更新用ajax
      

  2.   

    ajax+setTimeout()//js
    sleep()//php//通过ajax+setTimeout()每个一段时间(1秒或者...)请求服务器,在php里用sleep()处理(如果数据有变更,那么返回,没有则sleep()),可能有人会说这是刷机了,其实不然,如果没有sleep()那么每个机器会不停发送请求(无论数据是否更新了),而用sleep()进行遏制请求的刷机情况就会很好讲这个问题处理好了,当然了判断数据是否更新了,有很多种,自己想吧----如上其实就是comet长连接思想,当然这只是理论上的(没有在大服务器上弄过,只是自己做过,不过听说qq就是用这个原理不知道是不是真的)
      

  3.   

    希望你能够明白
    //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;
    }
    }?>
      

  4.   

    问题是,你现在的压力在哪里呢?除了必须实时的数据,其余的缓存如果是ajax请求的,需要显示剩余商品数量,也可以缓存,几秒更新一次,
      

  5.   

    3 楼的代码  如果是几百种商品,
    访问量大的话  能行么
    前台用ajax 局部刷新, 后台用多线程处理,这个想法可行么?
      

  6.   

    考虑下flash做socket client,socket server(不推荐php做,java/c/c++都行)不断推送给socket client,基于tcp,一次连接,不停更新。http的话,一来一回的,用户量增大的话,不敢想象。
      

  7.   

    之前我公司也有这样的需求,但个人认为这样的系统可行性不大,特别是刷机方面很难得到控制,用ajax实现的话,如果产品多了性能肯定很差,http实现本人觉得没太大的可能吧,应该基于tcp来做
      

  8.   

    数据库的机子一定要牛.. 可以设计1小时内结束的竞拍分库存储. 
    抗并发webserver首选nginx。
    MYSQL的话表使用innodb类型,避免表锁并提供回滚。
    设置起拍的间隔时间。
    客户端让用户自己刷或者JS刷都可以。。
    缓存竞拍以外的所有东西。。
      

  9.   

    每次竞拍时候
    把要竞拍的货品及数量存储在xml中当用户竞价的时候 用 socket 和 xml 通讯这样能应付 货品数量大和用户访问量大的问题么?
      

  10.   

    关于即时竞价刷新,当访问量大的时候怎么解决。
    (例如在30秒的倒计时时间中,有大量用户竞拍)
    ------------------难点可能高并发数据库读写抗并发webserver首选nginx。----这个可能是个办法,或者其他负载均可,apache内存高的话也行,主要是提高php的并发能力。数据库上能否尝试读写分离(如果更新memcache快的话也可考虑那个)。一是写的速度:如何才能更快和并发;二是读的速度(因为你前面要不断刷,而且不能缓存,当然你也可能缓存在2-3秒)
      

  11.   

    你看看这个吧,或许能帮到你www.sooowo.com
      

  12.   


    读的时候是每秒刷新一次 用ajax 发送get请求 读xml文档写的时候比读的少
    更新数据库和xml文档可行否?
      

  13.   

    具体细节还没看,大概的看了下。
    js每秒 ajax 向 server 发请求,写数据库时,使用 事务 来处理用户的拍卖。感觉是这样做,少用户还可以,但多用户,恐怕很难承受,不过我这里的服务器是自己的。
      

  14.   

    php并发这块支持本来就不怎么好,我认为php的comet做法已经很适合了
      

  15.   

    不知道楼主认为sleep睡眠好还是一直不停的刷数据库
      

  16.   

    做下压力测试吧,说什么都没用。http想完成实时任务,感觉不靠谱。