Ajax 脚本仅在接收到的 XML 足够大/加载时间足够长时才有效?
Posted
技术标签:
【中文标题】Ajax 脚本仅在接收到的 XML 足够大/加载时间足够长时才有效?【英文标题】:Ajax script only works when the received XML is big enough/takes long enough to load? 【发布时间】:2013-10-14 15:34:06 【问题描述】:我有一个 jQuery 脚本,它调用一个 php 文件来查询数据库,然后将结果作为 XML 输出。 jQuery 脚本获取 XML,对其进行解析并将其放入数组中以绘制一些图表。
这是 Ajax 脚本:
<script>
var arr=;
$(document).ready(function()
$.ajax(
type: "POST",
url: "http://myserver.com/query.php",
dataType: "xml",
success: function(xml)
$(xml).find('item').each(function(index,value)
var data=;
$(this).find('*').each(function(i,v)
if(isNaN(parseFloat($(this).text())))
data[$(this).prop('tagName')]=$(this).text();
else
data[$(this).prop('tagName')]=parseFloat($(this).text());
);
arr[index]=data;
)
DataLoaded();
);
);
</script>
我已经使用 query.php 文件中的真实查询测试了这个脚本,它运行良好。数据从数据库中检索出来,形成 XML 格式,然后发送回 javascript,在那里得到正确处理和播放。
现在...我在修改查询时发现了最奇怪的问题:如果返回的 XML 太短??
,ajax 脚本不起作用与 Ajax 脚本配合良好的 XML 输出(简化)示例:
<results>
<item>
<variable1>value1</variable1>
<variable2>value2</variable2>
<variable3>value3</variable3>
</item>
<item>
<variable1>value4</variable1>
<variable2>value5</variable2>
<variable3>value6</variable3>
</item>
<item>
<variable1>value7</variable1>
<variable2>value8</variable2>
<variable3>value9</variable3>
</item>
<item>
<variable1>value10</variable1>
<variable2>value11</variable2>
<variable3>value12</variable3>
</item>
</results>
不起作用的 XML 输出示例:
<results>
<item>
<variable1>value1</variable1>
<variable2>value2</variable2>
<variable3>value3</variable3>
</item>
<item>
<variable1>value4</variable1>
<variable2>value5</variable2>
<variable3>value6</variable3>
</item>
</results>
对于最后一种情况,PHP 工作正常(我可以直接从浏览器访问 PHP 文件,并看到如上所示的 XML 输出),但如果我在服务器上运行 html 文件,它会很简单永远停顿而不显示数据。
我使用了 Chrome 调试工具和 Fiddler,我发现我的服务器显然返回了“500 Internal Server Errror”。但是,如果我在 Fiddler 中检查消息,正确的 XML 输出实际上是存在的?!?!
为什么服务器会连同 XML 数据一起返回 500 Internal Server Error?为什么只有当输出太短时才会抛出错误??
我的意思是,我可以理解它对较长的数据集有问题...但是对于 较短的 数据集??
我在这里完全不知所措...任何帮助将不胜感激!
编辑: 来自 Fiddler 的更多信息。
响应消息之间的唯一区别似乎在标题中。
成功案例:
HTTP/1.1 200 OK
Date: Mon, 07 Oct 2013 21:50:10 GMT
Server: Apache/2.2.12 (Linux/SUSE)
X-Powered-By: PHP/5.2.14
Content-Length: 4627
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/xml
失败案例:
HTTP/1.0 500 Internal Server Error
Date: Mon, 07 Oct 2013 21:21:22 GMT
Server: Apache/2.2.12 (Linux/SUSE)
X-Powered-By: PHP/5.2.14
Content-Length: 371
Connection: close
Content-Type: text/xml
在此之下,两条消息都只包含预期的干净 XML 数据!
更新:
PHP 代码:
<?php
$dbhost = 'myserver.com';
$dbuser = 'login';
$dbpass = 'password';
$dbname = 'DB';
$link = mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error");
mysql_select_db($dbname, $link) or die("DB error");
$sql = "select bla bla bla... working query here";
$result = mysql_query($sql);
function mysql_XML($result, $docName='results', $itemName='item')
$field = array();
for ($i=0; $i<mysql_num_fields($result); $i++)
$field[$i] = mysql_field_name($result, $i);
// XML document
$dom = new DOMDocument('1.0', 'UTF-8');
$doc = $dom->appendChild($dom->createElement($docName));
for ($i=0; $i<mysql_num_rows($result); $i++)
$node = $doc->appendChild($dom->createElement($itemName));
for ($b=0; $b<count($field); $b++)
$textField = $node->appendChild($dom->createElement($field[$b]));
$textField->appendChild($dom->createTextNode(mysql_result($result, $i, $b)));
// returning XML as text
$dom->formatOutput = true;
return $dom->saveXML();
header ('Content-type: text/xml');
echo mysql_XML($result);
$mysql_close();
?>
【问题讨论】:
听起来您的问题出在服务器端。你能告诉我们PHP代码吗? 对我来说,这听起来像是服务器端 php 的问题,或者可能是错误使用异步调用的问题。即:如果您假设 $.ajax(); 之后的任何代码;之后代码将运行,你的假设不正确。 @Matt:用上面的PHP代码更新了,请看一下。 @OddityOverseer:这些都是长时间运行的查询。 “长”的可能需要 20 秒才能运行,“短”的可能需要 15 秒。我想如果我遇到同步问题,它们会在两种情况下都出现? 当服务器返回 5xx 状态码时,它应该将原因记录在/var/log/apache2/error.log
之类的地方——你看了吗?
【参考方案1】:
感谢n.st的建议,我找到了问题!
我查看了服务器日志,发现 PHP 脚本中有一个特定的行引发了错误……一行内容如下:
$mysqli->close();
这行应该被注释掉(因为最后我使用了不推荐使用的'mysql_'函数),但由于某种原因我没有注释它。
无论如何...即使是 PHP 错误,当直接从浏览器访问时,PHP 本身并没有抛出任何错误。此外,当查询足够短(足够短,可能运行 10 秒)时,这只会导致“500 内部服务器错误”响应,而对于比这更长的查询,我在浏览器中没有看到任何错误!
也许对于更长的查询,500 错误在实际 XML 到达时已经“过期”了?我真的不知道...但是如果你们中的任何人遇到 500 错误,请记住:检查您的 PHP 代码中的任何错误!即使是浏览器中的非错误也可能成为 AJAX 事务中的错误。
谢谢大家!
【讨论】:
很高兴你解决了它!顺便说一句,您可以接受自己的答案。【参考方案2】:例如,您的数据库中的条目可能包含 DOMDocument 不喜欢 &rsquo;
的字符。自从我使用 php XML 库以来已经有一段时间了,但我很确定当您尝试使用 XML 未定义的 HTML 特殊字符时它们会抛出错误。检查您的数据库中是否存在 html 特殊字符的实例。 select * from some_table where some_column like '%&%;';
之类的东西应该返回可能的 html 特殊字符。
在您查询的表中“更靠后”的一行中发现一个特殊字符可以解释为什么“更短”的响应有效而“更长”的响应不起作用。
【讨论】:
以上是关于Ajax 脚本仅在接收到的 XML 足够大/加载时间足够长时才有效?的主要内容,如果未能解决你的问题,请参考以下文章