2021-01-05 16:19:35 +08:00
|
|
|
|
# ZMAtomic 原子计数器
|
|
|
|
|
|
|
|
|
|
|
|
原子计数器是用于多进程间跨进程使用的原子计数使用的,比如统计入站请求数量等。此功能基于 Swoole 的 Atomic,详情见 [Swoole - 文档]([进程间无锁计数器(Atomic) (swoole.com)](http://wiki.swoole.com/#/memory/atomic))。
|
|
|
|
|
|
|
|
|
|
|
|
## 配置和初始化
|
|
|
|
|
|
|
|
|
|
|
|
见配置文件:`config/global.php` 中的 `init_atomics` 字段:
|
|
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
/** zhamao-framework在框架启动时初始化的atomic们 */
|
|
|
|
|
|
$config['init_atomics'] = [
|
|
|
|
|
|
'foo' => 0,
|
|
|
|
|
|
'bar' => 4,
|
|
|
|
|
|
];
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
这时我们就成功初始化两个原子计数器,名字分别为 `foo` 和 `bar`。
|
|
|
|
|
|
|
2022-03-22 00:51:03 +08:00
|
|
|
|
::: warning 注意
|
2021-01-05 16:19:35 +08:00
|
|
|
|
|
2022-03-22 00:51:03 +08:00
|
|
|
|
初始化的值必须是不小于 0 的 int32 值!
|
2021-01-05 16:19:35 +08:00
|
|
|
|
|
2022-03-22 00:51:03 +08:00
|
|
|
|
:::
|
2021-01-05 16:19:35 +08:00
|
|
|
|
|
|
|
|
|
|
## 使用
|
|
|
|
|
|
|
|
|
|
|
|
定义和命名空间:`ZM\Store\ZMAtomic`
|
|
|
|
|
|
|
|
|
|
|
|
连接计数示例:
|
|
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
|
<?php
|
|
|
|
|
|
namespace Module\Example;
|
|
|
|
|
|
use ZM\Annotation\Swoole\OnRequestEvent;
|
|
|
|
|
|
use ZM\Store\ZMAtomic;
|
|
|
|
|
|
class Hello {
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @OnRequestEvent()
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function onRequest() {
|
|
|
|
|
|
$cnt = ZMAtomic::get("foo")->add(1);
|
|
|
|
|
|
ctx()->getResponse()->end("当前已访问:".$cnt."次");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### ZMAtomic::get()->get()
|
|
|
|
|
|
|
|
|
|
|
|
获取计数的数字:`dump(ZMAtomic::get("bar")->get());` 返回 4。
|
|
|
|
|
|
|
|
|
|
|
|
### ZMAtomic::get()->add($num)
|
|
|
|
|
|
|
|
|
|
|
|
加上一定的数并返回结果:`dump(ZMAtomic::get("bar")->add(5));` 返回 9。
|
|
|
|
|
|
|
|
|
|
|
|
### ZMAtomic::get()->sub($num)
|
|
|
|
|
|
|
|
|
|
|
|
要减少的数值(必须为正整数):`dump(ZMAtomic::get("bar")->sub(5));` 返回 5。
|
|
|
|
|
|
|
|
|
|
|
|
### ZMAtomic::get()->set($num)
|
|
|
|
|
|
|
|
|
|
|
|
设置计数的数字:`ZMAtomic::get("bar")->set(77);`
|
|
|
|
|
|
|
2022-03-22 00:51:03 +08:00
|
|
|
|
::: tip 提示
|
2021-01-05 16:19:35 +08:00
|
|
|
|
|
2022-03-22 00:51:03 +08:00
|
|
|
|
还有一些不常用的方法,可以看 Swoole 官方的文档,这里就不一一列举了。
|
2021-01-05 16:19:35 +08:00
|
|
|
|
|
2022-03-22 00:51:03 +08:00
|
|
|
|
:::
|