Jquery Ajax / PHP - 多次调用函数

时间:2013-04-23 10:05:30

标签: php jquery function

我有以下代码:

<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);  

获取用户/我/的所有朋友并将其与数据库进行比较,array_diff()向我显示朋友与已使用该应用的用户的区别。
你可以想象,调用这个函数会产生巨大的过载,所以不要多次调用它会很聪明。

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

问题:
当用户点击&#34; <a href="#" id="other"><img src="bilder/arrow_otherfriends.png" style="height: 30px;" alt="load other friends" /></a>&#34;将生成下一组用户并将其作为结果给出(参见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);"拨打电话。性能下降,等待时间很长。

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

3 个答案:

答案 0 :(得分:2)

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

每次调用getUniqueUser存储某个地方(会话,文件,数据库,它们的混合)结果,与输入值配对。

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

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

答案 1 :(得分:1)

如果

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

确实是在获取所有相关用户(而不是通过所有朋友,通过每个相关朋友的函数调用,这当然没有意义),然后重载不应该像你说的那么多。 / p>

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

  1. 优化您的数据库,它看起来如何?它是否正确使用索引而不使用循环依赖?
  2. 如果您每次只想要4个结果,请不要从数据库中选择*,请使用LIMIT。
  3. 考虑将信息存储在文本文件中,您可以轻松地从每个用户登录数据库中获取数据,创建包含该信息的数组,然后您可以在需要显示更多用户时解析文件中的数组,而不是再次查询数据库。
  4. 利用缓存。
  5. 不太可能相关:请不要将javascript和php混合在一起,这只是一个坏习惯。就像你应该避免混合太多的php和html一样。

答案 2 :(得分:-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');
                  }
              });
            } });