2016-08-03 16 views
0

Ich richte ein extrem einfaches PHP/jQuery/Ajax Kontaktformular ein; und während es funktioniert, ist die Antwort extrem langsam (5+ Sekunden für die Erfolgsmeldung zu zeigen) und ich frage mich, was ich falsch machen könnte. HierSehr langsame Kontaktformularantwort (PHP/jQuery/Ajax)

ist alle relevanten Code:

Markup:

<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 = "[email protected]"; 
$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"); 
    } 

Ich lasse alle Formularvalidierungsfunktionen aus, um an den absoluten Grundlagen zu bleiben. Ich bin nicht sicher, ob es der Server ist, der die langsame Antwort verursacht, aber im Idealfall möchte ich, dass die Erfolgsmeldung angezeigt wird, sobald der Benutzer auf "Senden" klickt. Danke für jede Hilfe hier.

+1

Erste Rate - es ist, weil es darauf wartet, dass die E-Mail gesendet wird. – vlaz

+0

Es gibt keine Möglichkeit, die wir mit den von Ihnen bereitgestellten Informationen kennen könnten. Warum vergraben Sie eine andere Funktion innerhalb der '.submit()' Methode? –

+0

@JayBlanchard - Welche weiteren Informationen sollte ich bereitstellen? Die Website wird auf MediaTemple gehostet (freigegeben). – nickpish

Antwort

1

Ich werde Sie gehen davon aus PHPMailer, anzunehmen, aber mich zu korrigieren, wenn ich Ich liege falsch. Wenn nicht, ziehen Sie in Betracht, diesen zu verwenden, um diesen nächsten Teil zu implementieren.

Ihr PHP-Skript wartet darauf, dass die E-Mail gesendet wird. So sollte es nicht gemacht werden. Sie müssen es über einen Mail-Server senden. Siehe hierzu superb answer, wie man das macht, indem man PHPMailer benutzt.

+0

Ich benutze nicht wirklich PHPMailer, ich glaube, es ist nur die Standard-PHP-Mail-Funktion-- Ich werde den Link, den Sie zur Verfügung gestellt haben, überprüfen, danke. – nickpish

+0

schlagen Sie vor, eine E-Mail-Warteschlange zu verwenden, wie in der Antwort beschrieben, auf die Sie verwiesen haben? – nickpish

+0

@nickpish Ja, ich bin, oder eine Möglichkeit, die Nachrichten außerhalb dieses Skripts zu senden. –

3

Haben Sie einen Kommentar hinterlassen?
$success = mail($EmailTo, $Subject, $Body, "From:".$email);?

Ich könnte falsch liegen, aber das Senden von E-Mail kann ein paar Sekunden dauern
Ich empfehle Ihnen, E-Mails mit anderen Ajax-Anfrage zu senden.


Da PHP nicht async Sprache ist, zumindest standardmäßig.

  1. erster PHP-Skript: receive datas from JS, and respond with 200(success)
    jQuery auslösen 'Erfolg' Ereignis vor E-Mail zu senden.
    Dies wird Sie und andere Benutzer nicht blockieren oder stören.

  2. Second PHP-Skript: einfach per E-Mail zu schicken, ohne modal und etc.


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

Warum empfehlen Sie, E-Mails mit einer anderen Anfrage zu senden? Wie beschleunigt dies das Ergebnis Erfolg/Misserfolg? – BeetleJuice

+0

Da PHP keine asynchrone Sprache ist, zumindest standardmäßig. Erste PHP-Skript nur 'Daten von JS empfangen, und reagieren mit 200 (Erfolg)', so jQuery wird 'Erfolg' Ereignis vor dem Versand E-Mail auslösen. Dies wird Sie und andere Benutzer nicht blockieren oder stören. ... Und zweites PHP-Skript, nur um E-Mails zu senden, ohne Modal und etc. – yukioxD

+0

Eine andere AJAX-Anfrage würde es nicht transaktional machen. Einer könnte erfolgreich sein, der andere könnte aus irgendeinem Grund versagen. Und ja, PHP verwendet keine anderen Threads, aber es ist genau so, wie es gemacht werden soll. Sie können ein paar Threads in PHP mit 'fork()' hacken. Ich habe das in der Vergangenheit getan - es ist nicht erstaunlich, aber wenn Sie wirklich mehr Prozesse benötigen, kann es funktionieren. – vlaz

1

@nickpish

Sie haben php, jquery und ajax. Das Problem mit dem Engpass kann entweder das Frontend oder das Backend sein. Sie benötigen ein leistungsstarkes Tool, um das Problem zu beheben. Wenn Sie einen Fehler in Ihrem jquery haben, gibt es keine Möglichkeit, das herauszufinden. Darüber hinaus kann Ihr jquery mehr Zeit in Anspruch nehmen, wenn Sie ein Back-End-Problem haben.wenn man sich das Bild unten aussehen

enter image description here

brauchen Sie so etwas wie Firefox verwenden, (rechts überall auf Ihrem ui klicken und wählen Sie [Inspect Element Q] auf dem Netto-Panel klicken und XHR wählen. im Konsolenfenster Sie Ich werde sehen, ob es irgendwelche Fehler gibt, außerdem werden Sie Ihre Back-End-PHP-Datei bemerken und es wird Ihnen eine Reaktionszeit geben.

Wenn das Back-End-Skript zu langsam ist, können Sie in Ihre gehen Back-End-Datei Sie haben eine Mail-Funktion, vielleicht ist es der Server, der zu lange dauert.Sie ​​müssen möglicherweise Ihre smtp zu etwas schneller wechseln oder lassen Sie es so wie es ist Um mit Ihrer aktuellen smtp zu bleiben, die Zeit brauchen, sollten Sie unterdessen ein Fortschrittsfenster setzen.

+0

danke für die Antwort, @unixmiah.Ich habe gerade mit Dev-Tools überprüft, und ich sehe überhaupt keine Fehler, nur eine 'POST'' XHR' "OK" -Antwort bei 6089ms, was ich denke, erklärt die Wartezeit. – nickpish

+0

@nickpish du bist willkommen. – unixmiah

Verwandte Themen