php - 为什么 php sleep() 会暂停所有脚本的执行?

标签 php sleep long-polling

<分区>

我正在尝试在 php 中实现简单的长轮询,我的服务器代码是这样的:

if (!isset($_SESSION["lastResult"])) {
    $_SESSION["lastResult"] = "";
}

while(true){
   $sql = "SELECT * from table";
   $result = mysqli_query($conn, $sql);

   $array = [];
   while ($row = $result->fetch_array()) {
        do something and insert each element into $array;
   }
   $jsonRes = json_encode($array);

   //if old array is different from the new one, that means information has been updated, 
   //so I need to echo new data to user.

   if (strcmp($jsonRes, $_SESSION["lastResult"]) == 0) {
        echo $jsonRes;
        $_SESSION["lastResult"] = $jsonRes;
        exit();
    }

    //If information hasn't changed, just sleep for 5 seconds and repeat next time.
    sleep(5);
}

和客户端代码:

  const waitForData = () => {
    //this is just a js fetch function
    getDataHTTP().then(res => {
      this.setState({ itemsData: res });
      waitForData ();
    });
  };
  waitForData();

但是在我的网络选项卡中发生了什么,我看到我的 getData php 脚本应该“挂起”,但它永远挂起,另一件事是我无法真正编辑网页上的任何其他数据,因为出于某种原因,我假设是 sleep() 函数,我所有的 php 脚本都停止工作,并且永远处于“待定”状态。

提前致谢。

编辑:

仅作记录,$_SESSION 变量有效,所有数据都在其应有的位置。 SQL 查询也是如此,它会正确返回所有内容。

编辑2:

除了最大执行时间之外,我没有收到任何错误。

最佳答案

看看你的代码:

while(true){  // do this FOREVER unless we break the loop
   $sql = SELECT * from table;    // I assume we always get all rows?
   $result = mysqli_query($conn, $sql);
   $array = [];

   while ($row = $result->fetch_array()) {
        // Do stuff
        $array[] = $row;
   }
   // now array has all rows

   $jsonRes = json_encode($array);

   if (strcmp($jsonRes, $_SESSION["lastResult"]) == 0) {
        echo $jsonRes;
        $_SESSION["lastResult"] = $jsonRes;
        exit();
    }
    // so just sleep 5 seconds and do it all over again
    sleep(5);
}

在表中有一个日期时间列会不会更容易,如果一个选择返回的行的更新时间晚于上次运行的时间,那么选择 * 并返回?没有 while true 循环?

关于php - 为什么 php sleep() 会暂停所有脚本的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59631949/

相关文章:

php - 关闭 session 而不写入或销毁它

php - 谷歌应用引擎 phpBB

linux - 让线程休眠的开销太高?

C++ FLTK 1.3.2 : up-to-date screen, 处理事件和非阻塞 sleep

c - 在 C 中是否可以调用一个不等待 sleep 发生而 sleep 的函数?

jQuery 增量读取 AJAX 流?

php - 运行我自己的 OpenID 身份服务器/服务 (php)

PHP, XML 如何获取属性?

java - 如何使用 Struts 2 在 Java 中实现长轮询?

php - 仅在更新时长轮询 MySQL 数据库