【问题标题】:Very slow contact form response (PHP/jQuery/Ajax)联系表单响应非常慢(PHP/jQuery/Ajax)
【发布时间】:2016-12-09 17:10:18
【问题描述】:

我正在设置一个非常基本的 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");
    }

我将省略所有表单验证功能以坚持绝对基础。我不确定是否是服务器导致响应缓慢,但理想情况下,我希望在用户单击提交后立即显示成功消息。感谢您在此处提供的任何帮助。

【问题讨论】:

  • 第一个猜测 - 这是因为它正在等待发送电子邮件。
  • 根据您提供的信息,我们不可能知道。为什么要在 .submit() 方法中隐藏另一个函数?
  • @JayBlanchard - 我应该提供哪些进一步的信息?该网站托管在 MediaTemple(共享)上。
  • 很确定是因为电子邮件功能,这取决于您的服务器......

标签: javascript php jquery html ajax


【解决方案1】:

您是否尝试过评论
$success = mail($EmailTo, $Subject, $Body, "From:".$email);

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


因为 PHP 不是异步语言,至少默认情况下

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

  2. 第二个PHP脚本:只发Email,不带modal等


   $.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
        }
   }

【讨论】:

  • 为什么建议使用另一个请求发送电子邮件?这如何加速成功/失败结果?
  • 因为 PHP 不是异步语言,至少在默认情况下是这样。第一个 PHP 脚本只是 receive datas from JS, and respond with 200(success),所以 jQuery 会在 dispatchEmail 之前触发 'success' 事件。这不会阻止或打扰您和其他用户。 ...和第二个 PHP 脚本,只是发送电子邮件,没有模式等。
  • 另一个 AJAX 请求会使其成为非事务性的。一个可能成功,另一个可能因任何原因而失败。是的,PHP 不使用不同的线程,但这正是它应该如何完成的。您可以使用fork() 将一些线程侵入到 PHP 中。我过去已经这样做了 - 这并不令人惊讶,但如果您真的需要更多流程,它可以工作。
  • 你说得对,我之前曾与forkThread 合作过......尽管它比 2 $.ajax 更复杂。
  • @yukioxD 感谢您的回复——就将回复与电子邮件的实际发送分开而言,这种方法是有意义的。您能否就额外请求所涉及的 jQuery/Ajax 提供一些指导?
【解决方案2】:

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

您的 PHP 脚本正在等待发送电子邮件。这不是应该做的。您需要使用邮件服务器发送它。请参阅此superb answer,了解如何使用PHPMailer 执行此操作。

【讨论】:

  • 我并没有真正使用PHPMailer,我相信它只是默认的PHP邮件功能--我会查看您提供的链接,谢谢。
  • 更具体地说,您是否建议使用您引用的答案中描述的电子邮件队列?
  • @nickpish 是的,我是,或者以任何方式在该脚本之外发送消息。
  • 只是回到这里:我按照建议实现了 PHPMailer,它的工作就像一个魅力!我正在使用 SMTP,响应时间从 mail() 的 6 秒以上下降到 SMTP 和 PHPMailer 的 1 秒以上。谢谢!
【解决方案3】:

@nickpish

您有phpjqueryajax。瓶颈问题可能是前端或后端。您需要一个强大的工具来调试问题。如果您的jquery 中有错误,则无法解决。此外,如果您有后端问题,这可能会导致您的jquery 需要更多时间来响应您的前端用户界面。如果你看下面的图片

你需要使用firefox之类的东西,(在你的用户界面上的任何地方右击并选择[Inspect Element Q]点击网络面板并选择XHR。在控制台窗口中你会看到是否有任何错误;此外,您会注意到您的后端 php 文件,它会给您一个响应时间。

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

【讨论】:

  • 感谢@unixmiah 的回复。我刚刚使用开发工具进行了检查,根本没有看到任何错误,只是在 6089 毫秒时出现了 POST XHR“OK”响应,我猜这解释了等待。
猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多