Web应用程序性能改进

时间:2015-02-27 10:31:04

标签: php jquery mysql ajax

我有一个用于评估的网络应用程序。我在服务器上使用PHP和MySQL,在客户端上使用jQuery。用户界面是一个问题,后面跟着多个选项(无线电)。用户从无线电中选择选项后,单击按钮(向前或向后)。然后,应用程序通过ajax提交所选选项,同时向用户显示上一个或下一个问题。不需要向用户提供反馈。

虽然此应用程序主要用于本地Intranet,但有些客户会在Internet上使用它。由于代表人数有限,我无法上传短片。

这是ajax

$.ajax({ 

       type: 'POST',
       url: 'ajax.php',
       data: myData,
       dataType:'json',
       encode:true,
      })

      .done( function( response ){

         //the response from server is OK    
         if( response == "OK" ){   
           // Do something
         }
         //the response from server is BAD
         else if( response == 'BAD' ){

            // Do something else                     
         }
     })
     .fail( function( response ){
         //for debugging
     })

     .always( function( response ) {

     });

和PHP脚本。省略了验证和其他细节,为简短

if( isset( $_POST['submit_answer'] ) ){

     $question_number = $_POST['number'];

     $answer = $_POST['answer'];

     $assessment = new Assessment();

     if( $assessment->saveAnswer( array( 'number'=>$question_number, 'answer'=>$answer,) ){

        $response = 'OK';
     }
     else{

        $response = 'BAD';
    }
}

以上脚本实例化的类:

class Assessment
{

    public function saveAnswer( array $answer )
    {
        $sql ="INSERT INTO table SET question_number = :number, answer = :answer;
        $stmt = $dbLink->prepare( $sql );

        $stmt->bindValue( ':number', $answer['number'], PDO::PARAM_STR );

        $stmt->bindValue( ':answer', $answer['answer'], PDO::PARAM_STR );

        $stmt->execute();

        if( $stmt->rowCount() == 1 )
            return true;
        else
            return false;
    }
}

现在我设想了一个场景,用户选择他们的选项并以非常快速的顺序提交,而前面的提交尚未由服务器处理。我在开发机器上尝试了这个,发现数据库中缺少一些选择。

导致这种情况的原因是什么?是延迟吗?无论提交的频率如何,我如何确保提交所有选择。我需要在服务器和客户端脚本甚至数据库查询上添加哪些改进或调整。

1 个答案:

答案 0 :(得分:0)

我终于有了这个工作。首先感谢@KIKISoftware。我从他的回答中得到了一个想法。而不是发布到下一页,在我的javascript中,我实例化了一个全局数组变量:

var answers = [];

然后在下一个和后退按钮单击事件中,我实例化了一个本地对象变量:

var newAnswer = {
  number: questionNumber,
  answer: chosenAnswer 
};

然后将此对象添加到answers数组中。每隔一段时间,例如60秒,使用JSON.stringify(回答)后,数组将发布到服务器。

这就像一个魅力。我很高兴。