# 注意事项
## 定时器使用注意事项
1、可以在任意位置使用定时器。全局的定时器推荐在`onWorkerStart`回调中设置,针对某个连接的定时器推荐在`onConnect`中设置。
2、添加的定时任务会启动新的协程执行,不会导致进程阻塞。
3、当前进程忙于其它业务时或者当一个任务没有在预期的时间运行完,这时又到了下一个运行周期,则会等待当前任务完成才会运行,这会导致定时器没有按照预期时间间隔运行。也就是说当前进程的业务都是串行执行的,如果是多进程则进程间的任务运行是并行的。
4、需要注意多进程设置了定时任务造可能会造成并发问题,例如下面的代码每秒会打印5次。
~~~
use \Workerman\Worker;
use \Workerman\Lib\Timer;
require_once __DIR__ . '/Workerman/Autoloader.php';
Warriorman\Worker::rename();
$task= new Worker("tcp://0.0.0.0:2345");
$task->protocol = "\Workerman\Protocols\Http";
// 5个进程
$worker->count = 5;
$worker->onWorkerStart = function($worker) {
// 5个进程,每个进程都有一个这样的定时器
Timer::add(1, function(){
echo "hi\r\n";
});
};
Worker::runAll();
~~~
5、根据epoll超时实现,误差极小。
6、定时器不能跨进程删除,例如a进程设置的定时器无法在b进程直接调用Timer::del接口删除
7、不同进程间的定时器id可能会重复,但是同一个进程内产生的定时器id不会重复
- 序言
- 启动停止
- 简单的开发示例
- 性能测试
- 性能测试-数据库
- 通讯协议
- Coroutine类
- create
- getCid
- yield
- resume
- sleep
- wait
- getTotalNum
- isExist
- defer
- Runtime类
- Worker类
- 构造函数
- 属性
- workerId
- id
- name
- protocol
- transport
- reusePort
- backlog
- connections
- stdoutFile
- pidFile
- logFile
- user
- reloadable
- daemonize
- globalEvent
- 回调属性
- onWorkerStart
- onWorkerReload
- onConnect
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 方法
- rename
- runAll
- stopAll
- listen
- TcpConnection类
- 属性
- id
- protocol
- worker
- maxSendBufferSize
- defaultMaxSendBufferSize
- defaultMaxPackageSize
- 方法
- set
- send
- getRemoteIp
- getRemotePort
- close
- destroy
- pauseRecv
- resumeRecv
- pipe
- Timer定时器类
- add
- del
- 定时器注意事项
- Channel类
- 构造方法
- push
- pop
- length
- isEmpty()