我们先来谈谈我的处境:
我的MySQL数据库中有一个表,大约有10000个条目
目前,从表1收集信息时。我每页总共收集20-24行。
例如:
Q1:从表中选择*其中cat=1限制0,25
R1:id:1,name:something,info:12
执行这些查询的PHP文件由jquery ajax函数调用,并创建jquery函数读取并向用户显示的XML文件。
我的问题是。如何提高这个过程的速度和稳定性。我可以有多达1万名访客在同一时间获取信息,这使得我的服务器运行非常缓慢,在某些情况下甚至崩溃。
我完全不知道,所以我在这里寻求帮助。下面是我当前数据收集的实际演示(:

public function collectItems($type, $genre, $page = 0, $search = 0)
  {
    // Call Core (Necessary for Database Interaction
    global $plusTG;
    // If Search
    if($search)
    {
        $searchString = ' AND (name LIKE "%'.$search.'%")';
    }
    else
    {
        $searchString = '';
    }

    // Validate Query
    $search = $plusTG->validateQuery($search);
    $type = $plusTG->validateQuery($type);
    $genre = $plusTG->validateQuery($genre);

    // Check Numeric

    if((!is_numeric($genre)))
    {
      return false;
    }
    else
    {
      if(!is_numeric($type))
      {
        if($type != 0)
        {
          $typeSelect = '';
          $split = explode(',',$type);

          foreach($split as $oneType)
          {
            if($typeSelect == '')
            {
              $typeSelect .= 'type = '.$oneType.' ';
            }
            else
            {
              $typeSelect .= 'OR type = '.$oneType.' ';
            }
          }
        }
      }
      else
      {
        $typeSelect = 'type = ' . $type . ' ';
      }

      //echo $typeSelect;
      $limit = ($page - 1) * 20;

      if(($type != 0) && ($genre != 0))
      {
        $items = $plusTG->db->query('SELECT * FROM dream_items WHERE active = 1 AND genre = '.$genre.' AND ('.$typeSelect.')'.$searchString.' ORDER BY name LIMIT '.$limit.',20');
        $total = $plusTG->db->query('SELECT COUNT(*) as items FROM dream_items WHERE active = 1 AND genre = '.$genre.' AND ('.$typeSelect.')'.$searchString);
      }
      elseif(($type == 0) && ($genre != 0))
      {
        $items = $plusTG->db->query('SELECT * FROM dream_items WHERE active = 1 AND genre = '.$genre.$searchString.' ORDER BY name LIMIT '.$limit.',20');
        $total = $plusTG->db->query('SELECT COUNT(*) as items FROM dream_items WHERE active = 1 AND genre = '.$genre.$searchString);
      }
      elseif(($type != 0) && ($genre == 0))
      {
        $items = $plusTG->db->query('SELECT * FROM dream_items WHERE active = 1 AND ('.$typeSelect.')'.$searchString.'ORDER BY name LIMIT '.$limit.',20');
        $total = $plusTG->db->query('SELECT COUNT(*) as items FROM dream_items WHERE active = 1 AND ('.$typeSelect.')'.$searchString);
      }
      elseif(($type == 0) && ($genre == 0))
      {
        $items = $plusTG->db->query('SELECT * FROM dream_items WHERE active = 1'.$searchString.' ORDER BY name LIMIT '.$limit.',20');
        $total = $plusTG->db->query('SELECT COUNT(*) as items FROM dream_items WHERE active = 1'.$searchString);
      }

      $this->buildInfo($items->num_rows, $total->fetch_assoc());


      while($singleItem = $items->fetch_assoc())
      {
        $this->addItem($singleItem);
      }
    }
    return true;
  }

build info调用和add item调用正在将项添加到DOMXML中。
这是我的javascript(已筛选域和文件名):
function itemRequest(type,genre,page, search)
{
  if(ajaxReady != 0)
  {
    ajaxReady = 0;
    $('#item_container').text('');
    var searchUrl = '';
    var searchLink;
    var ajaxURL;
    if(search != 0)
    {
      searchUrl = '&search=' + search;
      searchLink = search;
      ajaxURL = "/////file.php";
    }
    else
    {
      searchLink = 0;
      ajaxURL = "////file.php";
    }

    $.ajax({
      type: "GET",
      url: ajaxURL,
      data: "spec=1&type="+type+"&genre="+genre+"&page="+page+searchUrl,
      success: function(itemListing){
        $(itemListing).find('info').each(function()
        {
          var total = $(this).find('total').text();
          updatePaging(total, page, type, genre, searchLink);
        });
        var items = $(itemListing).find('items');

        $(items).find('item').each(function()
        {
          var itemId = $(this).find('id').text();
          var itemType = $(this).find('type').text();
          var itemGenre = $(this).find('genre').text();
          var itemTmId = $(this).find('tm').text();
          var itemName = $(this).find('name').text();

          buildItem(itemId, itemType, itemGenre, itemTmId, itemName);
        });
        $('.item_one img[title]').tooltip();
      },
      complete: function(){
        ajaxReady = 1;
      }
    });
  }

生成项调用此:
function buildItem(itemId, itemType, itemGenre, itemTmId, itemName)
{
  // Pick up Misc. Data
  var typeName = nameOfType(itemType);
  // Create Core Object
  var anItem = $('<div/>', {
    'class':'item_one'
  });
  // Create Item Image
  $('<img/>', {
    'src':'///'+typeName+'_'+itemTmId+'_abc.png',
    'alt':itemName,
    'title':itemName,
    click:function(){
      eval(typeName + 'Type = ' + itemTmId);
      $('.equipped_item[name='+typeName+']').attr('src','//'+typeName+'_'+itemTmId+'_abc.png');
      $('.equipped_item[name='+typeName+']').attr('alt',itemName);
      $('.equipped_item[name='+typeName+']').attr('title',itemName);
      $('.equipped_item[title]').tooltip();
      recentEquipped(typeName, itemTmId, itemName);
      updateSelfy();
    }
  }).appendTo(anItem);
  // Favs
  var arrayHack = false;
  $(favEquips).each(function(){
    if(arrayHack == false)
    {
      if(in_array(itemTmId, this))
      {
        arrayHack = true;
      }
    }
  });
  var itemFaved = '';
  if(arrayHack == true)
  {
    itemFaved = 'activated';
  }
  $('<div/>',{
    'class':'fav',
    'id':itemFaved,
    click:function(){
      if($(this).attr('id') != 'activated')
      {
        $(this).attr('id','activated');
      }
      else
      {
        $(this).removeAttr('id');
      }
      itemFav(itemTmId, typeName, itemName);
    }
  }).appendTo(anItem);
  $(anItem).appendTo('#item_container');
}

如果有人能帮我改进这段代码,我将不胜感激。

最佳答案

cat列的表添加索引
找出瓶颈是什么,如果是您的XML,那么试试json,
如果是您的网络,请尝试启用gzip压缩

关于php - 最有效的数据收集方式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5981321/

10-12 00:17
查看更多