gpt4 book ai didi

php - 循环查询数据库,循环 sleep ,或单独请求

转载 作者:搜寻专家 更新时间:2023-10-30 20:28:34 24 4
gpt4 key购买 nike

我正在考虑这 3 个选项,如果有任何建议,我会采纳更多建议。

问题:不断有人建议我放弃 sleep ,而我没有背景可以在这三者之间做出选择

我一直被告知在 php 脚本中使用 sleep 是非常糟糕的,但没有人强调原因。我打算让系统具有可扩展性,即这个问题的解决方案可以使用 10 到 100 倍。

选项一: sleep

$timer = time() + (30);

while($done==0){
$result = mysqli_query($mysqli, $query);
$row_cnt = mysqli_num_rows($result);

if ($row_cnt>0){
$row = mysqli_fetch_array($result);
print $row[0];
$done=1;}

else{
$current = time();
if( $timer>$current){sleep(1);}
else{$done=1;}
}

选项 2:

简单地从上面移除 sleep 我的非服务器知识认为这更糟糕但是,我确信我可能是非常错误的

else{
$current = time();
if( $timer>$current){}
else{$done=1;}
}

选项 3:让客户端循环请求页面并让文件只显示信息

$result = mysqli_query($mysqli,$query);
$row_cnt = mysqli_num_rows($result);

if ($row_cnt>0){
$row = mysqli_fetch_array($result);
print $row[0];

所以哪个最好我的目标:

  • 可靠性-最重要
  • 客户获取信息的速度
  • 可扩展性 - 重要性最低(仍然重要)

请告诉我为什么我真的很想理解一种方法更优越的说法

如果这被标记为有争议的,那一定意味着所有答案都是有效的 :) 我会把它作为答案 :)

最佳答案

如果您了解 PHP 是单线程的并且它将暂停脚本其余部分的执行,那么使用 PHP 的 sleep 没有任何问题。

这绝对不是“正确的事”。当您开始连接更多客户端时会发生什么,您将拥有许多 apache PHP 线程,它们都将处于 sleep 状态以等待同一事件。您将很快耗尽资源。你在做什么本质上是长轮询。睡还是不睡,还是不好。

更好的方法之一是使该系统更加基于事件。当事件到来时,数据被推送到所有客户端。取决于您可以使用的技术,这将非常灵活并且只会产生网络延迟。 WebSockets 之类的东西非常适合这里。

由于您在 µC 上并且不能轻松地执行 websockets,最好的办法是打开到服务器的持久 TCP 连接,然后将数据向下发送。

下一个最好的办法是通过缓存结果使脚本执行得更快,比如 memcached . Memcached 本质上是一个内存键值存储。您将使用您的 clientId 或唯一标识客户端的东西作为 key 。这个过程是这样的:

结果数据从一些外部源更新并添加到数据库中。如果数据本质上是每个客户端,则删除(无效)该客户端在 memcache 中的 key ,因此当它请求结果时,它会被迫直接进入数据库。如果在记录结果时不是每个客户端的结果,请遍历当前连接的所有客户端并分别使它们的缓存无效。这个过程会很快,因为一切都在 RAM 中。

当clients请求结果时,脚本首先以clientID为key在memcache中查找,如果找不到则查询数据库并将结果放入memcache中以备后用。

我手头没有任何好的内存缓存教程,但快速谷歌搜索发现了这个,它并不糟糕:http://www.stevenmcmillan.co.uk/blog/2010/php5-memcached-example/

我还建议您重新考虑使用原始 TCP 套接字。您真的错过了,因为您可以在客户端和服务器之间建立实时连接,并且您的代码总体上可以更简单。如果您的托管不允许,请获得更好的托管服务提供商。便宜的那么多,如果你买不起~$5一个月,我担心你的营养。我有两个 atm 是 RamNode 和 DigitalOcean。

除此之外,您确实需要更详细地描述您的情况。

关于php - 循环查询数据库,循环 sleep ,或单独请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com