当我发送太多请求时,它会失败,整个网站将停止工作

Posted

技术标签:

【中文标题】当我发送太多请求时,它会失败,整个网站将停止工作【英文标题】:When i send too many request it gives failed and whole website will stop working 【发布时间】:2019-06-16 15:52:10 【问题描述】:

我正在创建一个注册页面,用户只能在其中选择可用的用户名,即数据库中不存在的用户名。所以我为此使用 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"  />');
        $.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>

【问题讨论】:

easytechguides.com/google-chrome-connection-errors.html 你能检查一下这个链接吗?这可能会对你有所帮助。我认为代码很好,代码没有问题 我认为您的问题是同时触发了太多请求(由于您使用了.keyup())。我在下面提供了解释和解决方案。 这对@Dhyaneshwar Shukla 有帮助吗? 是的,感谢您的帮助。我只问了一个问题,你能帮帮我吗 【参考方案1】:

我认为问题是由于托管服务器设置而出现的。如果您发出过多的 post 请求,服务器会因为设置而阻止您 60 到 120 秒。

尝试使用 GET 请求而不是 POST 请求,我认为它会解决问题。

$(document).ready(function() 
    $('#username').keyup(function() 
        var usercheck = $(this).val();
        $('#usercheck').html('<img src="images/loading.gif"  />');
        $.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');
    );
);

【讨论】:

这段代码工作正常,但我想知道这会降低我的服务器速度。还是使用此代码后我的服务器负载变重了? @DhyaneshwarShukla。不,我认为这不会发生,因为有时您在注册页面中没有很多用户。这也取决于服务器。 @DhyaneshwarShukla。如果代码对您有用,请批准并投票,以便对其他人也有帮助【参考方案2】:

我认为您的问题是同时向服务器发出太多请求。

我注意到您正在使用 .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);

【讨论】:

以上是关于当我发送太多请求时,它会失败,整个网站将停止工作的主要内容,如果未能解决你的问题,请参考以下文章

jQuery-Mobile:ajax请求在changePage失败后停止工作

调用存储过程然后接口失败

当我在 asp.net 上发布我的网站时,注册/登录停止工作

Socket.IO 在 Google Chrome 43.0.2357.65 上停止工作

使用代理时如何停止NodeJS“请求”模块更改请求

Flutter 应用程序的 Firebase 通知突然停止