1

毎分 2 件を超える電話で顧客が殺到することのないコール センターを想像してみてください。そのため、その範囲外のユーザーには、電子メール サポート リンク ($bTrigger = FALSE) が送信されます。他の全員 ($bTrigger = TRUE) は、技術サポートの電話番号を取得します。

スクリプトはPHPです。では、これを構築する最も効率的で正確な方法は何ですか?

これは私がこれまでに持っているものですが、残念ながら1分に1回しかトリガーされません. 1分間に2回実行されない理由がわかりません。

<?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';
}
4

2 に答える 2

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");
}
于 2012-12-05T00:13:08.723 に答える
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)
于 2012-11-30T19:59:28.810 に答える