Ajax性能 - 如何获得最快的响应

时间:2011-11-21 20:51:32

标签: php javascript ajax

我一直在使用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']));

?>

2 个答案:

答案 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。