我正在考虑这 3 个选项,如果有任何建议,我会接受更多建议。
问题:我不断被建议放弃 sleep ,但我没有背景可以在这三者之间进行选择
我一直被告知在 php 脚本中使用 sleep 非常糟糕,但没有人强调原因。我希望系统具有可扩展性,即这个问题的解决方案可以使用 10 到 100 倍。
选项 1: 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 上并且无法轻松执行 Websocket,因此最好的办法是打开与服务器的持久 TCP 连接,然后将数据发送到该连接。
下一个最好的办法是通过缓存结果来使脚本快速执行,例如memcached 。 Memcached 本质上是内存中的键值存储。您可以使用 clientId 或唯一标识客户端的内容作为 key 。这个过程大概是这样的:
结果数据从某些外部源更新并添加到数据库中。如果数据本质上是每个客户端的,则删除(无效)该客户端在内存缓存中的 key ,以便当它请求结果时,它被迫直接进入数据库。如果记录时结果不是针对每个客户端的,请运行当前连接的所有客户端并分别使它们的缓存失效。这个过程会很快,因为所有内容都在 RAM 中。
当客户端请求结果时,脚本应该首先使用 clientID 作为键在 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/