php - 在循环、 sleep 循环或单独请求中查询数据库

标签 php mysql sql database performance

我正在考虑这 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/

相关文章:

mysql - #1044 - 用户 'someusr' @'localhost' 访问数据库 'somedb' 被拒绝

php - 如何在 SQL 或 PHP 中计算持续时间日期

mysql - 为什么不建议在 SQL 中使用 "LIKE"?

php - DB检索代码显示代码本身而不是查询结果

c# - Database.ExecuteSqlCommand 的返回值是什么?

php - 在 laravel 8 中收到名为 '' Class 'Database\Seeders\App\Models\Product' not found'' 的错误

php - 在php中动态测量A4尺寸

php - 我在 Prestashop 中看不到我的测试模块页面

php - 在 Laravel 5.5 中测试授权策略时遇到问题

mysql - 如何将 yml 文件导入 MySQL 数据库?