我一直在使用jquery $.ajax({}).
从javascript调用php我发现这太慢了,特别是如果ajax调用在循环遍历页面元素的代码中。构建ajax调用以获得最佳性能的最佳方法是什么?
这是一个ajax调用示例。还有更好的方法吗?
// Make ajax call to update XML
$.ajax({
url: "make_update.php",
type: "POST",
data: { nodeid: scard_id, name: '', top: scard_top, left: '', width: '', height: '' },
cache: false,
/* async: true, */
success: function (response) {
if (response != '')
{
/* alert(response); */
}
}
});
文件make_update.php有此代码。
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
include_once("phpshared.php");
function make_update( $nodeid, $name, $top, $left, $width, $height ) {
$nodes = new SimpleXMLElement('linkcards.xml', null, true);
$returnArray = $nodes->xpath("//LINKCARD[@ID='$nodeid']");
$node = $returnArray[0];
if ($name != null) { $node->NAME = $name; }
if ($top != null) { $node->TOP = $top; }
if ($left != null) { $node->LEFT = $left; }
if ($width != null) { $node->WIDTH = $width; }
if ($height != null) { $node->HEIGHT = $height; }
$nodes->asXML('linkcards.xml');
$formatted = formatXmlString($nodes->asXML());
$file = fopen ('linkcards.xml', "w");
fwrite($file, $formatted);
fclose ($file);
}
echo make_update(trim($_REQUEST['nodeid']),trim($_REQUEST['name']),trim($_REQUEST['top']),trim($_REQUEST['left']),trim($_REQUEST['width']),trim($_REQUEST['height']));
?>
答案 0 :(得分:3)
不是每页元素单独调用,而是编写服务器端代码,允许通过一次调用完成大量的操作。
答案 1 :(得分:0)
根据您的代码和问题,我怀疑大部分开销是由 1)Ajax调用循环,可以很容易地捆绑在一个数组中 2)解析linkcards.xml文档
因此,在客户端,您的代码应如下所示:
var xhrData = [];
/* Enqueue all the data generated in your loop to an array */
for(var i in loop) {
xhrData.push({ nodeid: loop[i].scard_id, name: '', top: loop[i].scard_top, left: '', width: '', height: '' });
}
/* Post the whole array */
$.ajax({
url: "make_update.php",
type: "POST",
data: { data: xhrData },
cache: false,
success: function (response) {
for(var i in response) {
if (response[i] != '') {
/* alert(response[i]); */
}
}
}
});
服务器端请求应按如下方式处理:
function make_update() {
/* somewhere here you should read the XML file */
$nodes = new SimpleXMLElement('linkcards.xml', null, true);
foreach($_REQUEST['data'] as &$element) {
/* here goes the $_REQUEST data manipulation */
}
/* and this is where the XML writing should go */
$file = fopen ('linkcards.xml', "w");
fwrite($file, $formatted);
fclose ($file);
/* return JSON encoded string back to the client */
return json_encode($_REQUEST['data'])
}
echo make_update();
不幸的是,我不能更具体,因为你的代码依赖于外部数据,而我对其背后的逻辑没有任何了解。但问题是,您应该考虑获取阵列中的所有数据,然后将整个阵列发送到您的服务器。在服务器上,不必连续打开和关闭XML文件,因为每个调用都包含相同的操作。
如果您希望获得更好的服务器端性能,我建议使用XMLReader / XMLWriter而不是SimpleXML。