【问题标题】:Optimization: Loading content using ajax优化:使用ajax加载内容
【发布时间】:2012-07-08 04:48:17
【问题描述】:

我想听听您关于使用 ajax 优化内容加载的想法。接下来,我将提出几种方法,我会提出我自己的想法。

  • 直接加载 html - 这样可以轻松加载内容,无需进一步计算。更适合不受用户操作影响的内容或部分需要定期更新的内容
  • 从服务器获取 json 对象 - 似乎是在 json 对象中包含页面内容的好方法。允许通过将当前值与新对象进行比较来仅修改某些部分
  • 按部分(块)加载 - 似乎是最难的更新方式。您必须知道哪个部分已更改以及在何处加载它(对应该更改/更新的节点的特定 dom 访问)。此外,从计算的角度来看,似乎比获取 json 对象并“手动”创建标签或使用我们将数据加载到其中的模板更容易

那么,您如何看待每种方法?随意提出一种新方法!

【问题讨论】:

    标签: javascript jquery ajax optimization


    【解决方案1】:

    嗯,我在企业软件领域工作(仅仅作为一名顾问,而不是开发人员;))我已经多次看到第三种方法被广泛使用,因为它在页面的动态性方面更加灵活。

    除此之外,从仅更新某些部分的角度来看,前两种方法似乎并不引人注目:即使在第二种情况下(使用 JSON),您也必须比较两个页面片段,我认为这是一个幼稚的方法(恐怕不是那么容易维持)。

    但是您的问题缺少一些重要信息,例如您使用什么来生成页面。这在第一种情况下不太重要,因为您只是生成一个字符串(其中包含页面源代码),但在第三种情况下,如果您的 AJAX 加载代码干扰您正在使用的 HTML 模板引擎,它可能会变得一团糟。

    我希望这会有所帮助,如果需要,请在问题中添加更多信息!

    【讨论】:

      【解决方案2】:

      我将内容分为 3 个部分。

      1. HTML,不是 db 缓存和 ajax
      2. db 缓存,而不是 ajax(内容更改周期是周期性的)
      3. db 缓存和 ajax(高 db 操作时间)

      如果页面很慢,分析它并更改为 2 或 3。 在使用ajax内容加载之前,你必须分析你的页面访问速度和db负载。

      对于数据库缓存,我传递函数和参数。

      $c1 = db_cache("main_top_naver_cache", 300, "naver_popular('naver_popular', 4)");
      db_cache - php function(my own)
      main_top_naver_cahce : cache name
      300 : cache duration
      naver('naver_popular',4) : php function and arguments
      

      这段代码是我的 ajax 内容加载方法。很简单。

      link

      我考虑ajax加载方法很多年了,上个月我得到了非常简单的代码。 试试我的 ajax 内容加载代码。

      <div id='main_b'>
      // codes for ajax content loading...
      // enter this code at the end of program.
      // your home page is boosted.
      <?
      function remove_nr($str) {
      $reg_e = array('/\n/', '/\r/', '/\"/', "/<\/script>/i"); 
      $reg_p = array(' ', ' ', '\\"', "<\/SCRIPT>"); 
      return preg_replace($reg_e, $reg_p, $str);
      }
      ?>
      <script type="text/javascript">
      $("#main_b").html( " <? echo remove_nr(db_cache("main_top_naver_cache", 300, "naver_popular('naver_popular', 4)"))?> " );
      </script>
      

      还有我的 db_cache 代码。你可以分析一下。

      function db_cache($c_name, $seconds=300, $c_code) {
      
          global $g4;
      
          $result = sql_fetch(" select c_name, c_text, c_datetime from $g4[cache_table] where c_name = '$c_name' ");
          if (!$result) {
              // 시간을 offset 해서 입력 (-1을 해줘야 처음 call에 캐쉬를 만듭니다)
              $new_time = date("Y-m-d H:i:s", $g4['server_time'] - $seconds - 1);
              $result['c_datetime'] = $new_time;
              sql_query(" insert into $g4[cache_table] set c_name='$c_name', c_datetime='$new_time' ");
          }
      
          $sec_diff = $g4['server_time'] - strtotime($result['c_datetime']);
          if ($sec_diff > $seconds) {
      
              // $c_code () 안에 내용만 살림 
              $pattern = "/[()]/";
              $tmp_c_code = preg_split($pattern, $c_code);
      
              // 수행할 함수의 이름
              $func_name = $tmp_c_code[0];
      
              // 수행할 함수의 인자
              $tmp_array = explode(",", $tmp_c_code[1]);
      
              if ($func_name == "include_once" || $func_name == "include") {
      
                  ob_start();
                  include($tmp_array[0]);
                  $c_text = ob_get_contents();
                  ob_end_clean();
      
              } else {
      
              // 수행할 함수의 인자를 담아둘 변수
              $func_args = array();
      
              for($i=0;$i < count($tmp_array); $i++) {
                  // 기본 trim은 여백 등을 없앤다. $charlist = " \t\n\r\0\x0B"
                  $tmp_args = trim($tmp_array[$i]);
                  // 추가 trim으로 인자를 넘길 때 쓰는 '를 없앤다
                  $tmp_args = trim($tmp_args, "'");
                  // 추가 trim으로 인자를 넘길 때 쓰는 "를 없앤다
                  $func_args[$i] = trim($tmp_args, '"');
              }
              // 새로운 캐쉬값을 만들고
              $c_text = call_user_func_array($func_name, $func_args);
              }
      
              // db에 넣기전에 slashes들을 앞에 싹 붙여 주시고
              $c_text1 = addslashes($c_text);
      
              // 새로운 캐쉬값을 업데이트 하고
              sql_query(" update $g4[cache_table] set c_text = '$c_text1', c_datetime='$g4[time_ymdhis]' where c_name = '$c_name' ");
      
              // 새로운 캐쉬값을 return (slashes가 없는거를 return 해야합니다)
              return $c_text;
      
          } else {
      
              // 캐쉬한 데이터를 그대로 return
              return $result['c_text'];
      
          }
      }
      

      我运营 db 密集型网站 450,000 页/天 在 5 岁的 Web 服务器上提高速度 带有代码和许多其他 mysql 提示。 我的网络服务器有 1 个 CPU/4Core、RAM 12G、2 个 SATA HDD/Raid 1。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 2014-11-07
        • 2011-06-17
        • 1970-01-01
        相关资源
        最近更新 更多