2

我有以下代码:

<div id="uniquefriends">
                    <?php               
                        $friends =  $helper->getuniqueUser($uid, $TOKEN);

                        foreach($friends as $friend) {

                        echo $friend; // Facebook UID

                        }
                        ?>  
            </div>
            <a href="#" id="other"><img src="bilder/arrow_otherfriends.png" style="height: 30px;" alt="load other friends" /></a>
            <script>
            $(document).ready( function() {
                $('#other').click(function() {
                  $.ajax({
                      type: 'POST',
                      url: 'otherfriends/',
                      data: { uid: "<?php echo $uid; ?>", token: "<?php echo $TOKEN; ?>"  },
                      cache: false,
                      success: function(result) {
                        $('#uniquefriends').html(result);
                      },
                  });
                });
            });
            </script>  

描述:

$friends =  $helper->getuniqueUser($uid, $TOKEN);  

正在获取用户 /me/ 的所有朋友并将其与数据库进行比较,并且 array_diff() 向我显示了朋友与已经使用该应用程序的用户的差异。
你可以想象,调用这个函数会产生巨大的重载,所以最好不要多次调用它。

这个函数每次调用只给我 4 个 uid (array_slice($array, 0, 4)) (可以修改)

问题:
当用户单击“ <a href="#" id="other"><img src="bilder/arrow_otherfriends.png" style="height: 30px;" alt="load other friends" /></a>”时,将生成下一组用户并作为结果给出我(参见 ajax 调用)。

ajax 调用如下所示:

<?php
if(isset($_POST['uid']) && !empty($_POST['uid'])) {
        $uid = $_POST['uid'];
        $token = $_POST['token'];

        $helper = new helper();     
        $friends =  $helper->getuniqueUser($uid, $token);   

        foreach($friends as $friend) {
            echo $friend;
        }
}
?>  

所以每次"$friends = $helper->getuniqueUser($uid, $TOKEN);"用户点击链接时我都会打电话。性能下降,等待时间很长。

我可以以某种方式改进此代码,以不经常调用此函数吗?有什么选择吗?

4

3 回答 3

2

您可以在 AJAX 调用的 PHP 脚本中实现一个小缓存系统。

每次您在getUniqueUser某处(会话、文件、数据库、它们的混合)调用存储时,结果都会与输入值配对。

如果输入值在缓存中是已知的,只需从中获取结果并立即返回,否则,启动函数并将丢失的结果存储在缓存中。

当然,您可能需要一个复杂的缓存,跟踪请求的时间戳以避免返回“陈旧”的朋友(也许您最近添加了新朋友并且您需要更新缓存)。这只是一个起点,但如果您不想一直调用同一个函数,则需要某种形式的缓存。

于 2013-04-23T10:16:23.580 回答
1

如果

$friends = $helper->getuniqueUser($uid, $token);

确实是获取所有相关用户(而不是遍历所有朋友,为每个相关朋友调用一个函数,这当然没有意义),那么重载不应该像你说的那么多。

但是,如果您确实发现服务器需要很长时间才能回复您的响应,那么有几个选择。

  1. 优化你的数据库,它看起来怎么样?是否正确使用索引而不使用循环依赖?
  2. 如果您真的每次只需要 4 个结果,请不要从数据库中选择 *,请使用 LIMIT。
  3. 考虑将信息存储在文本文件中,您可以轻松地每次用户登录一次从数据库中获取数据,使用信息创建一个数组,然后当您必须显示更多用户时,您可以解析文件中的数组,而不是查询 -再次 ing 数据库。
  4. 充分利用缓存。

不那么可能相关:请不要将 javascript 和 php 混合在一起,这只是一个坏习惯。尽可能避免将过多的 php 和 html 混合在一起。

于 2013-04-23T10:18:36.493 回答
-1

我相信您确实只需要一次获取列表,因此在图像标签中添加一个类。仅触发一次请求。每次点击都获取结果没有意义,因为您只发送相同的参数。

$('#other').click(function() {
if (!$(this).hasClass('clicked')) {
              $.ajax({
                  type: 'POST',
                  url: 'otherfriends/',
                  data: { uid: "<?php echo $uid; ?>", token: "<?php echo $TOKEN; ?>"  },
                  cache: false,
                  success: function(result) {
                    $('#uniquefriends').html(result);
                    $('#other').addClass('clicked');
                  }
              });
            } });
于 2013-04-23T10:23:17.953 回答