2013-07-30 45 views
2

我正在考虑3个选项,如果有任何问题,我会考虑更多的建议。在循环中查询数据库,使用睡眠或单独请求循环

问题:我不断收到建议沟睡眠,我没有背景三个

我之间保持回暖斥骂睡眠是非常糟糕的PHP脚本使用,但从来没有人强调过为什么。我打算让系统具有可扩展性,即解决这个问题的方法可以使用10到100倍。

选项1:睡眠

$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:

只需从我上面的非服务器知识除去睡眠认为这是糟糕的,但是,我敢肯定,我可能是非常错误的

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]; 

因此,这是最好的给 我的目标:

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

请给我一个为什么我真的想理解一种方法是优越的说法

如果这被标记为有争议的,它必须意味着所有的答案都是有效的:)我将其作为答案:)

+1

你想解决什么问题? – Barmar

+1

问题是我一直建议沟渠睡眠,我没有背景选择之间的三个 –

+1

为什么你有睡觉在第一个地方?据推测,这是为了解决一些问题,因为在数据库查询脚本中这是不正常的。 – Barmar

回答

1

我会采取刺探为什么程序员认为sleep坏在一个循环,这似乎成为你问题的核心。

简短的回答,是的,你可以使用睡眠。

为什么你不是呢?

什么理想想要做的一些工作,当数据变得可用的数据库。为此,如果您可以在数据可用时得到通知,那么您已经完成了最少量的工作。在编程中有多种方式可以实现这一点:HTTP世界中的webhooks,锁/信号量,回调以及事件/观察者是一些范例。另一个引用的原因是race conditions,我会让你读一读。由于数据库正在为您自动执行任务,因此这不是一个担心。

但是,在理想的无状态世界即HTTP中,您无法锁定,有时您根本无法获取事件或回调。我见过一些AJAX编程鼓励使用固定或随机间隔的轮询,就服务器而言,这本质上是一种睡眠形式。

您的选择2是最糟糕的,因为您的程序正在做大量无用的工作。所有这些无用的工作都会耗费你的电力和占用资源(CPU),而这些资源可能会转移到其他地方。如果您登录到计算机,运行任何其他程序,为网站提供服务,所有这些都会变慢。

+0

我真的很感谢你的回应。所以如果你不得不说3或1会更好吗? –

+0

3或1看起来不错 - 尽管我并不完全知道 –

+0

100人连接到服务器,并在睡眠循环中〜= 100人连接到服务器一遍又一遍...好奇好奇至于为什么整个图片很重要......你错过了什么数据来作出结论 –