$worker->onMessage = function($connection, $data) {
$connection->send($ret);
static $request_count;
// 业务处理略
if(++$request_count > 10000) {
// 请求数达到10000后退出当前进程,主进程会自动重启一个新的进程
Worker::stopAll();
}
};
我想知道这样处理的话send出去的数据能发送成功吗?当处理到一定请求之后重启当前进程的话。
正常情况下都会发送成功,极端情况可能不成功,比如发送了超大的数据,数据积压在workerman的数据缓冲区的情况。
如果是短连接业务,最好是有个判断 count($worker->connections) == 0 的时候执行重启。
我这边最多发送的数据不会超过100k 短连接的情况是不是不会出现发送失败。
这个判断我加上吧防止万一。谢谢了哈。回复的好及时哈哈
再麻烦问下 count($worker->connections) == 0 这个等于0 是指当前进程没有连接进来是吗。那如果一直在处理是不是就一直无法触发了。我是写在onmessage 里面的。最后一发发送send的话。这个值会为空吗。
send之后不会为空,close后有可能为空
@1:那如果加上这个判断的话是不是永不不会触发重启的条件呢?还是这个不要写在onmessage里
你可以在onWorkerStart里写个定时器,定时检查
@1:懂了就是定时检查次进程是否没有新连接进来并且已经处理了指定数量的请求之后就重启这样是吧。
对
想再问下
$worker->onMessage = function ($connection, $data) {
global $request_count;
$request_count++;
})
$worker->onWorkerStart = function ($worker) {
global $request_count;
Timer::add(10, function () use ($worker, $request_count) {
if ($request_count > Item\Config::$maxRequest&&count($worker->connections) == 0) {
// 请求数达到指定数量请求后退出当前进程,主进程会自动重启一个新的进程
Worker::stopAll();
}
};
//为什么在定时器里取到的$request_count 一直是null呢。
onWorkerStart里定义下$request_count = 0;,没赋值是null
@1:我的意思是我在onmessage ++了定时器 里取值还一直是0呢,我初始值改为0 也一样
@1:我写错了。我改成这样就行了
$worker->onWorkerStart = function ($worker) {
// 将db实例存储在全局变量中(也可以存储在某类的静态成员中)
global $request_count;
$request_count=0;
Timer::add(10, function () use ($worker) {
global $request_count;
if ($request_count > Item\Config::$maxRequest&&count($worker->connections) == 0) {
// 请求数达到指定数量请求后退出当前进程,主进程会自动重启一个新的进程
Worker::stopAll();
}
};