毫秒定时器

Testing Is Documentation

tests/Protocol/TimerTest.php毫秒定时器 - 图1

毫秒定时器是对 Swoole 官方的简单封装。

Uses

  1. <?php
  2. use Exception;
  3. use Leevel\Log\ILog;
  4. use Leevel\Protocol\Timer;

执行任务

执行任务过程中不抛出异常则为一次通过,有异常支持重试。

  1. public function testTimer(): void
  2. {
  3. /** @var \Leevel\Log\ILog $log */
  4. $log = $this->createMock(ILog::class);
  5. $timer = new Timer($log);
  6. $errorCount = 0;
  7. $taskLog = __DIR__.'/task.log';
  8. $timer->work(function () use (&$errorCount, $taskLog): void {
  9. $errorCount++;
  10. file_put_contents($taskLog, '.count '.$errorCount, FILE_APPEND);
  11. if (1 === $errorCount) {
  12. defer(function () use ($taskLog) {
  13. $this->assertSame('.count 1', file_get_contents($taskLog));
  14. unlink($taskLog);
  15. });
  16. }
  17. }, 10, 5);
  18. $this->assertSame(1, 1);
  19. }

执行任务失败重试

执行任务过程中抛出异常则为失败,失败会支持重试,到达次数后将丢弃。

  1. public function testTimerError(): void
  2. {
  3. /** @var \Leevel\Log\ILog $log */
  4. $log = $this->createMock(ILog::class);
  5. $timer = new Timer($log);
  6. $errorCount = 0;
  7. $taskLog = __DIR__.'/taskError.log';
  8. $timer->work(function () use (&$errorCount, $taskLog): void {
  9. $errorCount++;
  10. file_put_contents($taskLog, '.count '.$errorCount, FILE_APPEND);
  11. if (5 === $errorCount) {
  12. defer(function () use ($taskLog) {
  13. $this->assertSame('.count 1.count 2.count 3.count 4.count 5', file_get_contents($taskLog));
  14. unlink($taskLog);
  15. });
  16. }
  17. throw new Exception('Failed test');
  18. }, 10, 5);
  19. $this->assertSame(1, 1);
  20. }