2012-11-30 29 views
1

设想一个呼叫中心不能被客户每分钟超过2次呼叫淹没。因此,该范围之外的任何人都将获得电子邮件支持链接($ bTrigger = FALSE)。其他人($ bTrigger = TRUE)将获得技术支持电话号码。每分钟间隔触发x个动作的最有效方法是什么?

脚本是PHP。那么,建立这个最有效率和最准确的方法是什么?

这是我到目前为止,但不幸的是它只是每分钟触发一次。我似乎无法弄清楚为什么它不会每分钟运行两次。

<?php 

$bTrigger = FALSE; 
$sDir = dirname(__FILE__); 
$sDir = rtrim($sDir,'/'); 
$sFile = $sDir . '/MINUTE-TIMER.txt'; 

$sLine = @ file_get_contents($sFile); 
$sLine = str_replace("\r\n",'',$sLine); 
$sLine = str_replace("\r",'',$sLine); 
$sLine = str_replace("\n",'',$sLine); 
$sLine = str_replace("\t",'',$sLine); 
$asParts = explode(',',$sLine); 
$nLetThru = @ $asParts[0]; 
$nLetThru = intval($nLetThru); 
$nLastMin = @ $asParts[1]; 
$nLastMin = intval($nLastMin); 
$nCurMin = intval(date('i')); 
if (empty($sLine)) { 
    $nLetThru = 0; 
    $nLastMin = 0; 
} 

$nMaxLetThru = 2; 

if ($nCurMin != $nLastMin) { // meaning, a new minute since last checked 
    if ($nLetThru <= $nMaxLetThru) { // meaning, we haven't hit more than max allowed 
    $bTrigger = TRUE; 
    ++$nLetThru; 
    file_put_contents($sFile,"$nLetThru,$nCurMin"); 
    } else { 
    file_put_contents($sFile,"0,$nCurMin"); 
    } 
} 

if ($bTrigger) { 
    echo 'TRIGGERED!!!!'; 
} else { 
    echo 'not triggered'; 
} 
+2

我们在这里帮助您解决特定问题,而不是为您做好工作。 –

+0

@MarcB我即将回答它,然后人们可以挑战这个答案。我将从挑战中学习。 – Volomike

+0

您的问题需要改进。如果你有答案,为什么不包括它? – Kermit

回答

2

的问题是一个简单的编码错误:$ nLetThru没有被复位时一刻改变。 (另外,你< =本来应该<,但你已经注意到了。)

这里是固定的代码(基于原来的版本,在这个问题):

if (empty($sLine)) { 
    $nLastMin = -1; # (instead of 0) just affects the 1st time thru, 1 chance in 60 
} 

...

if ($nCurMin != $nLastMin) { // new minute 
    $bTrigger = TRUE; 
    $nLetThru = 1; 
} else { // another hit, same minute 
    if ($nLetThru < $nMaxLetThru) { // not too many yet 
    $bTrigger = TRUE; 
    ++$nLetThru; 
    } 
} 
if ($bTrigger) { 
    file_put_contents($sFile,"$nLetThru,$nCurMin"); 
} 
1
<?php 

$bTrigger = TRUE; 
$config = (object) array(); 
$config->THROTTLE_ENABLED = TRUE; 
$config->THROTTLE_MAX_PER_MINUTE = 2; 
if ($config->THROTTLE_ENABLED) { 

    $bThrottleTrigger = FALSE; 
    $sDir = dirname(__FILE__); 
    $sDir = rtrim($sDir,'/'); 
    $sFile = $sDir . '/MINUTE-TIMER.txt'; 

    $sLine = @ file_get_contents($sFile); 
    $sLine = str_replace("\r\n",'',$sLine); 
    $sLine = str_replace("\r",'',$sLine); 
    $sLine = str_replace("\n",'',$sLine); 
    $sLine = str_replace("\t",'',$sLine); 
    $asParts = explode(',',$sLine); 
    $nLetThru = @ $asParts[0]; 
    $nLetThru = intval($nLetThru); 
    $nLastMin = @ $asParts[1]; 
    $nLastMin = intval($nLastMin); 
    $nCurMin = intval(date('i')); 
    if (empty($sLine)) { 
     $nLetThru = 0; 
     $nLastMin = 0; 
    } 

    if ($nCurMin != $nLastMin) { // meaning, a new minute since last checked 
     if ($nLetThru < $config->THROTTLE_MAX_PER_MINUTE) { // meaning, we haven't hit more than max allowed 
      $bThrottleTrigger = TRUE; 
      ++$nLetThru; 
      @ file_put_contents($sFile,"$nLetThru,$nLastMin"); 
     } else { 
      @ file_put_contents($sFile,"0,$nCurMin"); 
     } 
    } else { 
     @ file_put_contents($sFile,"0,$nCurMin"); 
    } 

    if (!$bThrottleTrigger) { // will be like most of the time 
     $bTrigger = FALSE; // don't show the number 
    } 

} // end if ($config->THROTTLE_ENABLED) 
+0

这几乎是正确的,但是当分钟没有改变时,您需要检查计数。当分钟HAS改变时,你应该继续并让用户通过,并将计数器设置为1.当分钟没有改变时,然后检查计数器,如果计数器小于2,则增加计数器让呼叫通过,否则不要让通话通过。 –

相关问题