为啥我的 Ajax 调用的“等待”长度如此之长? (Chrome 网络面板)

Posted

技术标签:

【中文标题】为啥我的 Ajax 调用的“等待”长度如此之长? (Chrome 网络面板)【英文标题】:Why is the "waiting" length so long on my Ajax call? (Chrome Network Panel)为什么我的 Ajax 调用的“等待”长度如此之长? (Chrome 网络面板) 【发布时间】:2013-03-05 07:24:01 【问题描述】:

我在请求一些 json 内容的页面上有几个 ajax 调用。在所有这些电话中,我在响应完成时等待了很长时间。对于这些呼叫中的每一个,呼叫中有几秒钟的“等待”时间,如下面的 Chrome 网络面板所示。我附上了一张图片:

我不太确定是什么原因造成的,因为我对查询数据库的 php 代码进行了一些基准测试,据此,查询和处理 json 以发送回的调用在 0.001 秒内运行或者。

那么,这只是网络延迟问题吗?这是我没有正确执行数据库查询的问题吗?也许我正在淹没每个浏览器窗口的最大连接数?不知道。其他请求的移动速度也一样慢,所以看起来可能是一致的。

这是其余请求时间的另一张照片(另一个主要的 ajax 调用与 get_usergames_simple 调用所用的时间一样多:

作为参考,这里是ajax调用:

self.getGamesContent = function()

  var userID = "<?php echo $userID; ?>";

  var post_data = 
    userID: userID
  ;

  $.post("https://mydomain.com/games/get_usergames_simple/", post_data, function(result)
  
    var json = $.parseJSON(result);

    var mappedGames = $.map(json.games, function(item) 
      return new GameItem(item)
    );
    self.gameitems(mappedGames);
  );
;

这是控制器中运行查询的 php 代码:

$userID = $this->input->post('userID');
$this->benchmark->mark('code_start');

$userGames = $this->cache->model('games', 'getGamesSimpleByUserID', array($userID), 120); // keep for 2 minutes

$returnString = "";

$returnString .= '"user_id": "' . $userID . '",';

$gameCount = 0;

$returnString .= '"games": [';
foreach ($userGames as $ug)

  $returnString .= "";
  $returnString .= '"user_id" : "' . $userID . '",';
  $returnString .= '"game_id" : "' . $ug->GameID . '",';
  $returnString .= '"game_name" : "' . $ug->GameName . '",';
  $returnString .= '"game_image" : "' . $ug->GameImage . '",';
  $returnString .= '"description" : "' . htmlspecialchars($ug->GameDescription) . '",';
  $returnString .= '"genre_id" : "' . $ug->GameGenreCatID . '",';
  $returnString .= '"genre_name" : "' . $ug->GameGenreName . '",';
  $returnString .= '"publisher_id" : "' . $ug->GamePublisherID . '",';
  $returnString .= '"publisher_name" : "' . $ug->GamePublisherName . '",';
  $returnString .= '"developer_id" : "' . $ug->GameDeveloperID . '",';
  $returnString .= '"developer_name" : "' . $ug->GameDeveloperName . '",';
  $returnString .= '"active_flag" : "' . $ug->GameIsActive . '",';
  $returnString .= '"create_date" : "' . $ug->GameCreateDate . '",';
  $returnString .= '"remove_date" : "' . $ug->GameRemoveDate . '",';
  $returnString .= '"last_update_date" : "' . $ug->GameLastUpdateDate . '",';
  $returnString .= '"user_syncing_game" : "' . $ug->UserSyncingGame . '"';
  $returnString .= ",";
  $gameCount++;


if ($gameCount > 0)
  $returnString = substr($returnString, 0, strlen($returnString) - 1);

$returnString .= "]";


$this->benchmark->mark('code_end');

//echo $this->benchmark->elapsed_time('code_start', 'code_end');

echo $returnString;

【问题讨论】:

控制器的构造函数有什么慢吗? 这是个好问题!我没想到...让我在那里做一些基准测试并回复您。 为什么不用json_encode() 而不是字符串连接? @f_martinez 这完全是问题所在!你能回答这个问题,以便我选择你作为正确答案吗? @janson0:只需使用正确的键构建数组,然后 json_encode() 就可以工作。因为它代表任何数据中的单个 " 会破坏输出。我会构建一些知道如何格式化响应的演示者对象。它更容易测试,无需复制和粘贴即可重复使用。此外,如果您只对蛇形案例进行骆驼案例,您可以创建简单的自动生成密钥。 【参考方案1】:

在控制器的构造函数中肯定有一些慢动作。

在 Codeigniter 中使用内置分析器会更好:

http://ellislab.com/codeigniter/user-guide/general/profiling.html

【讨论】:

非常感谢您的帮助!

以上是关于为啥我的 Ajax 调用的“等待”长度如此之长? (Chrome 网络面板)的主要内容,如果未能解决你的问题,请参考以下文章

使AJAX调用等待php中的事件

为啥我的简单 ajax 帖子没有调用 c# web 方法?

$(window).unload 在离开网页之前等待 AJAX 调用完成[重复]

为啥我的 AngularJS ajax 自动触发,即使我没有调用它?

为啥我的 FORM 在 Ajax 调用后被提交? [复制]

为啥在我的 HttpPost 方法 Ajax 调用中,控制器上的参数为空?