php登录次数冻结,php – 服务器发送事件的循环导致页面冻结

我目前正在使用服务器发送事件来接收消息的聊天。但是,我遇到了一个问题。服务器发送的事件永远不会连接并保持在挂起,因为该页面不加载。

例如:

while(true) {

echo "data: This is the message.";

sleep(3);

ob_flush();

flush();

}

?>

我预计每3秒钟,“数据:这是消息”。将被输出。相反,该页面不加载。但是,我需要这种服务器发送的事件的行为。有没有办法来解决这个问题?

编辑:

完整代码:

session_start();

require "connect.php";

require "user.php";

session_write_close();

echo $data["number"];

header("Content-Type: text/event-stream\n\n");

header('Cache-Control: no-cache');

set_time_limit(1200);

$store = new StdClass(); // STORE LATEST MESSAGES TO COMPARE TO NEW ONES

$ms = 200; // REFRESH TIMING (in ms)

$go = true; // MESSAGE CHANGED

function formateNumber ($n) {

$areaCode = substr($n, 0, 3);

$part1 = substr($n, 3, 3);

$part2 = substr($n, 6, 4);

return "($areaCode) $part1-$part2";

}

function shorten ($str, $mLen, $elp) {

if (strlen($str) <= $mLen) {

return $str;

} else {

return rtrim(substr($str, 0, $mLen)) . $elp;

}

}

do {

$number = $data["number"];

$sidebarQ = "

SELECT *

FROM (

SELECT *

FROM messages

WHERE deleted NOT LIKE '%$number%'

AND (

`from`='$number'

OR

`to`='$number'

)

ORDER BY `timestamp` DESC

) as mess

GROUP BY `id`

ORDER BY `timestamp` DESC";

$query = $mysqli->query($sidebarQ);

if ($query->num_rows == 0) {

echo 'data: null' . $number;

echo "\n\n";

} else {

$qr = array();

while($row = $query->fetch_assoc()) {

$qr[] = $row;

}

foreach ($qr as $c) {

$id = $c["id"];

if (!isset($store->{$id})) {

$store->{$id} = $c["messageId"];

$go = true;

} else {

if ($store->{$id} != $c["messageId"]) {

$go = true;

$store->{$id} = $c["messageId"];

}

}

}

if($go == true) {

$el = $n = "";

foreach ($qr as $rows) {

$to = $rows["to"];

$id = $rows["id"];

$choose = $to == $number ? $rows["from"] : $to;

$nameQuery = $mysqli->query("SELECT `savedname` FROM `contacts` WHERE `friend`='$choose' AND `number`='$number'");

$nameGet = $nameQuery->fetch_assoc();

$hasName = $nameQuery->num_rows == 0 ? formateNumber($choose) : $nameGet["savedname"];

$new = $mysqli->query("SELECT `id` FROM `messages` WHERE `to`='$number' AND `tostatus`='0' AND `id`='$id'")->num_rows;

if ($new > 0) {

$n = "" . $new . "";

}

$side = "" . ($to == $number ? "To you:" : "From you:") . "";

$el .= "

$hasName
$side " . shorten($rows["message"], 25, "...") . "
$n
";

}

echo 'data: '. $el;

echo "\n\n";

$go = false;

}

}

echo " ";

ob_flush();

flush();

sleep(2);

} while(true);

?>

我也想注意,这个无限循环不应该导致这种情况发生。这正是SSE的平均设置,甚至在MDN网站上也是如此。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值