非常慢的联系表单响应(PHP / jQuery / Ajax)

时间:2016-08-03 20:09:50

标签: javascript php jquery html ajax

我正在设置一个非常基本的PHP / jQuery / Ajax联系表单;当它正在工作时,响应非常缓慢(成功消息显示的时间超过5秒),我想知道我可能做错了什么。

以下是所有相关代码:

标记:

<form id="contact-form" name="contact-form" action="php/form-process.php" method="post" role="form">
    <input type="text" name="name" id="name" placeholder="Name" required>
    <input type="email" name="email" id="email" placeholder="Email" required>
    <textarea id="message" name="message" rows="5" placeholder="Your message" required></textarea>
    <button type="submit" id="form-submit" class="contact-button">Submit</button>
    <div id="msg-submit" class="hidden">Message sumbitted!</div>
</form>

PHP:

<?php
$name = $_POST["name"];
$email = $_POST["email"];
$message = $_POST["message"];

$EmailTo = "test@test.com";
$Subject = "New Contact Form Message";

// prepare email body text
$Body .= "Name: ";
$Body .= $name;
$Body .= "\n";

$Body .= "Email: ";
$Body .= $email;
$Body .= "\n";

$Body .= "Message: ";
$Body .= $message;
$Body .= "\n";

// send email
$success = mail($EmailTo, $Subject, $Body, "From:".$email);

// redirect to success page
if ($success){
   echo "success";
}else{
    echo "invalid";
}

?>

jQuery的:

$('#contact-form').submit(function(event){
        event.preventDefault();
        submitForm(); 
    });

    function submitForm(){
        var $this = $('#contact-form');
        $.ajax({
            type: $this.attr('method'),
            url: $this.attr('action'),
            data: $this.serialize(),
            success : function(text){
                if (text == "success"){
                    formSuccess();
                }
            }
        });
    }
    function formSuccess(){
        $("#msg-submit").removeClass("hidden");
    }

我遗漏了所有表单验证功能,以坚持绝对的基础知识。我不确定服务器是否导致响应缓慢,但理想情况下,我希望用户点击提交后立即显示成功消息。感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

你有没有试着评论出来 $success = mail($EmailTo, $Subject, $Body, "From:".$email);

我可能错了,但发送电子邮件可能需要几秒钟时间 我建议你使用其他ajax请求发送电子邮件。

因为PHP不是异步语言,所以至少默认

  1. 第一个PHP脚本:receive datas from JS, and respond with 200(success)
    在发送电子邮件之前,jQuery将触发“成功”事件 这不会阻止或打扰您和其他用户。

  2. 第二个PHP脚本:只是发送电子邮件,没有模态等

  3.    $.ajax({
            //here, you could send some infos to  use with DB, check if
           //datas, e-mail is valid with filter_var($email, FILTER_VALIDATE_EMAIL), etc..
            type: $this.attr('method'),
            url: $this.attr('action'),
            data: $this.serialize(), 
            success : function(text){
                if (text == "success"){
                    formSuccess();
                }
            }
        });
       function formSuccess(){
           $("#msg-submit").removeClass("hidden");
           $.ajax({
            //here, you could send some infos to build and send Email
            //It's right, because the first ajax did succeed right ?
            type: $this.attr('method'),
            url: $this.attr('action'),
            data: $this.serialize(), 
            success : function(text){
                //yey :D
            }
       }
    

答案 1 :(得分:1)

我假设你假设PHPMailer,但如果我错了,请纠正我。如果没有,请考虑使用它来实现下一部分。

您的PHP脚本正在等待发送电子邮件。这不是应该怎么做的。您需要使用邮件服务器发送它。有关如何使用PHPMailer

的信息,请参阅此superb answer

答案 2 :(得分:1)

@nickpish

您有switchvar myFavoriteNumbers: [Int] = [] var myLeastFavoriteNumbers: [Int] = [] let myNumberDescriptions = ["my number is number 1", "this is number 2", "I don't like number 3", "Number Four"] let myNumber = 1 /* unique action: perform a unique action (given a valid number) and thereafter proceed to common cases */ if 1...myNumberDescriptions.count ~= myNumber { print(myNumberDescriptions[myNumber-1]) } /* common cases */ switch myNumber { /* common case: is a favourite number */ case 1...2: myFavoriteNumbers += [myNumber] /* common case: is a least favourite number */ case 3...4: myLeastFavoriteNumbers += [myNumber] default: print("Default") } php。瓶颈的问题可以是前端或后端。你需要一个强大的工具来调试问题。如果你的jquery中有错误,则无法解决这个问题。此外,如果您遇到后端问题,可能会导致ajax花费更多时间回复您的前端用户界面。如果你看下面的图像

enter image description here

你需要使用像firefox这样的东西,(点击你的ui上的任意位置并选择[jquery]点击网络面板,然后在控制台窗口中选择jquery。你会看到有任何错误;此外,你会注意到你的后端php文件,它会给你一个响应时间。

如果后端脚本太慢,您可以进入后端文件。你有一个邮件功能,也许这是服务器花了太长时间。您可能需要将Inspect Element Q更快地转换为某些内容或保持原样。如果你选择留在可能需要时间的当前XHR,你应该考虑同时设置一个进度窗口。