Когда я посылаю слишком много запросов, это дает сбой, и весь сайт перестает работать - PullRequest
0 голосов
/ 23 января 2019

Я создаю страницу регистрации, на которой пользователь может выбрать только доступное имя пользователя, то есть, которого нет в базе данных. поэтому я использую ajax для этого ... но когда я ввожу слишком много запросов за раз, это дает сбой, и мой сайт перестает работать ... через некоторое время все будет хорошо, но через 5-10 минут он перестанет работать.

ВЕБ-САЙТ ДАЕТ ОШИБКУ: -

Эта страница не работает events.collegespike.com не отправляла никаких данных. ERR_EMPTY_RESPONSE

Код для извлечения данных из базы данных:

<?php

if (isset($_POST['user_name']) && $_POST['user_name'] != '') {
    $response = array();
    $username = mysqli_real_escape_string($db, $_POST['user_name']);
    $sql = "select username from login_master where username='" . $username . "'";
    $res = mysqli_query($db, $sql);
    $count = mysqli_num_rows($res);
    if ($count > 0) {
        $response['status'] = false;
        $response['msg'] = 'Username already exists.';
    } else if (strlen($username) < 6 || strlen($username) > 15) {
        $response['status'] = false;
        $response['msg'] = 'Username must be 6 to 15 characters';
    } else if (!preg_match("/^[a-zA-Z1-9]+$/", $username)) {
        $response['status'] = false;
        $response['msg'] = 'Use alphabet and numeric only.';
    } else {
        $response['status'] = true;
        $response['msg'] = 'Username is available.';
    }

    echo json_encode($response);
}
?>

Код Ajax: -

//including jquery 2.0.3
<script type="text/javascript" charset="utf8" src="https.://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.js"></script>

//jquery code to fetch data
<script type="text/javascript">
$(document).ready(function() {
    $('#username').keyup(function() {
        var usercheck = $(this).val();
        $('#usercheck').html('<img src="images/loading.gif" width="150" />');
        $.post("signup/check1.php", {
            user_name: usercheck
        }, function(data) {
            if (data.status == true) {
                $('#usercheck')
                   .parent('div')
                   .removeClass('has-error')
                   .addClass('has-success');

            } else {
                $('#usercheck')
                   .parent('div')
                   .removeClass('has-success')
                   .addClass('has-error');
            }
            $('#usercheck').html(data.msg);
        }, 'json');
    });
});
</script>

HTML код: - // код для ввода и отображения вывода

//taking input
<input class="check-form"  name="user_name" id="username" type="text"  placeholder="User Name (please enter unique username)">

//showing output
<span id="usercheck" class="help-block"></span>
<span><i class="ti-check"></i></span>

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Я считаю, что ваша проблема в том, что вы одновременно запускаете слишком много запросов к серверу.

Я заметил, что вы используете .keyup(), а затем запускаете запрос AJAX. Это означает, что если бы я набрал имя пользователя Jonathan, он бы запустил 8 запросов всего за секунду. Это создаст узкое место.

Если вы откроете консоль, вы заметите, что один символ (один запрос) будет работать нормально, введите второй символ после получения ответа от первого и он снова будет работать. Однако быстрый набор и ожидание ответа не будет работать. В консоли вы увидите, что они будут загружаться и загружаться до тех пор, пока не произойдет тайм-аут / что угодно.

Я предлагаю вам уменьшить количество запросов, которые вы запускаете, и запускать запрос только в том случае, если клавиши перестали нажиматься в течение x миллисекунд.

Решение:

Задержка выполнения keyup. Вот чистое решение javascript, которое я использовал несколько раз и которое работает в моих приложениях. Я упростил его и изменил, чтобы он, надеюсь, работал в вашем случае.

Вы заметите, что вызывается delayKeyupExecution(), и мы передаем myInput (в вашем случае это имя пользователя), userNameAjaxCheck в качестве обратного вызова (это функция, которая будет содержать ваш запрос ajax) и 500 , это количество мс, чтобы задержать его.

// Your username input
var myInput = document.getElementById("username");

function userNameAjaxCheck(params) {
  // Your ajax code to check the username
};

// Delay a function from triggering
function delayKeyupExecution(input, callback, delay) {
  var timer = null;
  var params = null; // Anything you want to pass to the callback function (userNameAjaxCheck)

  input.onkeypress = function() { // Equivalent to your .keyup
    if (timer) window.clearTimeout(timer); 
    timer = window.setTimeout( function() {
      timer = null;
      callback(params); // Pass the params you need
    }, delay );
  };

  input = null;
};

// Execute
delayKeyupExecution(myInput, userNameAjaxCheck, 500);
0 голосов
/ 23 января 2019

Я думаю, что проблема идет из-за настройки хост-сервера.если вы отправите слишком много почтовых запросов, сервер заблокирует вас на 60–120 секунд из-за настроек.

Попробуйте использовать запрос GET вместо запроса POST, я думаю, что это решит проблему.

$(document).ready(function() {
    $('#username').keyup(function() {
        var usercheck = $(this).val();
        $('#usercheck').html('<img src="images/loading.gif" width="150" />');
        $.get("signup/check1.php", {
            user_name: usercheck
        }, function(data) {
            if (data.status == true) {
                $('#usercheck')
                   .parent('div')
                   .removeClass('has-error')
                   .addClass('has-success');

            } else {
                $('#usercheck')
                   .parent('div')
                   .removeClass('has-success')
                   .addClass('has-error');
            }
            $('#usercheck').html(data.msg);
        }, 'json');
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...