2016-08-03 33 views
0

非常に基本的なPHP/jQuery/Ajaxのコンタクトフォームを設定しています。それが動作している間は、応答は非常に遅く(成功メッセージが表示されるまで5秒以上)、私は何が間違っているのだろうと思っています。ここで非常に遅いコンタクトフォームのレスポンス(PHP/jQuery/Ajax)

関連するすべてのコードです:

マークアップ:

<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"); 
    } 

絶対的な基本を守るために、すべてのフォーム検証機能を使いません。遅い応答を引き起こすサーバであるかどうかはわかりませんが、理想的には、ユーザーが送信をクリックするとすぐに成功メッセージが表示されるようにしたいと思います。ご協力いただきありがとうございます。

+1

最初の推測です。電子メールが送信されるのを待っているからです。 – vlaz

+0

あなたが提供した情報で私たちが知る方法はありません。なぜあなたは '.submit()'メソッド内に別の関数を埋め込んでいますか? –

+0

@JayBlanchard - 何を提供する必要がありますか?このサイトはMediaTemple(共有)でホストされています。 – nickpish

答えて

1

せずに、電子メールを送信するために、私は「場合はPHPMailerを想定していると仮定しますが、私を修正するつもりです間違っている。そうでない場合は、これを使用して次の部分を実装することを検討してください。

PHPスクリプトが電子メールの送信を待機しています。それはどのようにすべきかではありません。メールサーバーを使用して送信する必要があります。 PHPMailerを使用してこの操作を行う方法については、superb answerを参照してください。あなたがphpjqueryajaxを持って@nickpish

+0

私は実際にPHPMailerを使用していません、私はそれがちょうどデフォルトのPHPメール機能だと信じています - あなたが提供したリンクをチェックします、ありがとうございます。 – nickpish

+0

具体的には、参照した回答に記載されているメールキューを使用することをおすすめしますか? – nickpish

+0

@nickpishはい、私は、またはそのスクリプトの外にメッセージを送信する方法です。 –

3

コメントをしようとしました
$success = mail($EmailTo, $Subject, $Body, "From:".$email);

私は間違っているかもしれませんが、メールの送信には数秒かかる場合があります
他のajaxリクエストを使用してメールを送信することをお勧めします。


PHPは、少なくともデフォルトで非同期言語、ではありませんので。

  1. まずPHPスクリプト:receive datas from JS, and respond with 200(success)
    jQueryのは、電子メールを送信する前に '成功' イベントをトリガします。
    あなたと他のユーザーをブロックしたり、迷惑をかけたりすることはありません。

  2. 第二のPHPスクリプト:ちょうどモーダルとなど


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

別のリクエストを使用して電子メールを送信することをお勧めします。どのように成功/失敗の結果をスピードアップしますか? – BeetleJuice

+0

PHPは少なくともデフォルトでは非同期言語ではないため、 最初のPHPスクリプトは 'JSからデータを受信し、200(成功)'で応答するので、jQueryはdispatchEmailの前に 'success'イベントをトリガーします。あなたと他のユーザーをブロックしたり、迷惑をかけたりすることはありません。 ... 2番目のPHPスクリプトです。モーダルなどを使わずにメールを送信するだけです。 – yukioxD

+0

もう1つのAJAXリクエストでは、非トランザクションになります。 1つは成功することができ、もう1つは何らかの理由で失敗する可能性があります。そして、はい、PHPは異なるスレッドを使用しませんが、それはまさにそれが行われるはずです。 'fork()'を使って、PHPへのスレッディングをハックすることができます。私は過去にそれをやったことがあります。それは素晴らしいことではありませんが、もっと多くのプロセスが本当に必要な場合は、うまくいく可能性があります。 – vlaz

1

。ボトルネックの問題は、フロントエンドまたはバックエンドのいずれかになります。問題をデバッグするには強力なツールが必要です。 jqueryにエラーがある場合は、それを把握する方法がありません。また、バックエンドに問題があると、jqueryがフロントエンドUIに返信するのに時間がかかることがあります。あなたは

enter image description here

下の画像を見れば、あなたは右のあなたのUI上の任意の場所をクリックし、[Inspect Element Q]ネットパネルをクリックしてXHRを選ぶ選択(、Firefoxのようなものを使用する必要があります。コンソールウィンドウであなたさらにエラーがある場合は表示され、バックエンドのPHPファイルに気づき、応答時間が返されます。

バックエンドスクリプトが遅すぎる場合は、バックエンドファイル。あなたはメール機能を持​​っているかもしれませんが、それは長すぎるサーバでしょうか?あなたはsmtpを何かより速く切り替えるか、そのままにしておく必要があります。あなたの現在のsmtpに滞在するには時間がかかるかもしれませんが、あなたは進行中のウィンドウを置くことを考えなければなりません。

+0

応答、@ unixmiahありがとう。私はdevツールを使って確認しましたが、何のエラーも見られませんでした.6089msの 'POST''XHR'" OK "というレスポンスがありました。 – nickpish

+0

@nickpishようこそ。 – unixmiah