无需重新加载页面的永久请求

我的网络提供商是 Strato。我想每 10 秒进行一次 mysql select 查询而不重新加载页面:


Strato 无法使用 Websocket。对我来说,替代方案是 ajax 轮询。我试过这个:


$.ajax({

   type: "POST",

   url: "ajax/mysqlQuery.php",

   data: 'userID=10'

}).done(function(result) {

      if(result) {

         // DO SOMETHING

      }

})

mysql查询.php


<?php


$data= null;


include("../inc/config.php");


while(!$data) {

    sleep(10);


    $statement = $mysqli->prepare("SELECT * FROM `table` WHERE userID = ?");

    $statement->bind_param("s", $_POST["userID"]);

    $statement->execute();

    $result = $statement->get_result();


    while($row = $result->fetch_object()) {

        $data[] = array("ID" => $row->ID);

    }


}


echo json_encode($data);



?>

这很好用。但:


Strato 的 php max_execution_time 为 120 秒。我的脚本在 120 秒内运行良好 - 然后就会停止。


我该如何解决这个问题?


函数式编程
浏览 71回答 1
1回答

www说

我没有在您的 JS 代码中看到任何实际的轮询,例如。不是setInterval那种东西。要每 10 秒实际运行一次 JS 函数,您应该需要以下内容:const doRequest = () => {&nbsp; $.ajax({&nbsp; &nbsp; type: "POST",&nbsp; &nbsp; url: "ajax/mysqlQuery.php",&nbsp; &nbsp; data: 'userID=10'&nbsp; }).done(function(result) {&nbsp; &nbsp; if (result) {&nbsp; &nbsp; &nbsp; // DO SOMETHING&nbsp; &nbsp; }&nbsp; });}setInterval(doRequest, 1000);关于 PHP 部分,我认为您的脚本中不需要 a while(!$data){ ... },因为只有在进行 AJAX 调用时才会对其进行评估,因此您实际上可以摆脱它。我已经修改了您的 PHP 代码中的一些内容,我将对此进行解释<?php// just leave it alone at the beginninginclude("../inc/config.php");$statement = $mysqli->prepare("SELECT * FROM `table` WHERE userID = ?");$statement->bind_param("s", $_POST["userID"]);$statement->execute();$result = $statement->get_result();$data = null;// maybe you can use $result->fetch_assoc() directly instead of returning an object and mapping it back to an associative arraywhile($row = $result->fetch_object()) {&nbsp; &nbsp; $data[] = array("ID" => $row->ID);}// close the statement for better PHP performances$statement->close();// return itecho json_encode($data);?>如果您的脚本将继续花费超过 2 分钟的时间来回答,则可能是数据库出了问题,或者它只是限制了您的脚本的主机作为旁注,如果您希望从您的 PHP 代码中获得一个数组,您也可以设置$data = []为默认值,这样如果没有返回任何内容,您将不需要在 JS 代码中编辑内容,例如检查结果是否实际上是一个数组等等...
打开App,查看更多内容
随时随地看视频慕课网APP