为啥我的 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 网络面板)的主要内容,如果未能解决你的问题,请参考以下文章
$(window).unload 在离开网页之前等待 AJAX 调用完成[重复]