public function onWorkerStart($server, $workerId)
{
global $argv;
if ($server->taskworker) {
# 任务序号
$taskId = $workerId - $server->setting['worker_num'];
$className = self::$namespace . 'WorkerTask';
if (!class_exists($className)) {
# 停止服务
if ($taskId === 0) {
self::warn("任务进程 {$className} 类不存在");
}
$className = '\\MyQEE\\Server\\WorkerTask';
}
# 内存限制
ini_set('memory_limit', self::$config['server']['task_worker_memory_limit'] ?: '4G');
static::setProcessName("php " . implode(' ', $argv) . " [task#{$taskId}]");
self::$workerTask = new $className($server);
self::$workerTask->id = $workerId;
self::$workerTask->taskId = $workerId - $server->setting['worker_num'];
self::$workerTask->onStart();
} else {
if ($workerId === 0 && self::$clustersType > 0) {
# 集群模式, 第一个进程执行, 连接注册服务器
$id = isset(Server::$config['clusters']['id']) && Server::$config['clusters']['id'] >= 0 ? (int) Server::$config['clusters']['id'] : -1;
Register\Client::init(Server::$config['clusters']['group'] ?: 'default', $id, false);
}
$className = self::$namespace . 'WorkerMain';
if (!class_exists($className)) {
if ($workerId === 0) {
# 停止服务
self::warn("工作进程 {$className} 类不存在");
}
$className = '\\MyQEE\\Server\\Worker';
}
ini_set('memory_limit', self::$config['server']['worker_memory_limit'] ?: '2G');
static::setProcessName("php " . implode(' ', $argv) . " [worker#{$workerId}]");
self::$worker = new $className($server);
self::$worker->name = 'Main';
self::$workers['Main'] = self::$worker;
# 加载自定义端口对象
foreach (array_keys(self::$workers) as $name) {
if ($name === 'Main') {
continue;
}
/**
* @var Worker $class
*/
$className = self::$namespace . "Worker{$name}";
if (!class_exists($className)) {
if (in_array($name, ['API', 'Manager'])) {
# 使用系统自带的对象
$className = "\\MyQEE\\Server\\Worker{$name}";
} else {
unset(self::$workers[$name]);
if (self::$server->worker_id === 0) {
self::warn("{$className} 不存在, 已忽略对应监听");
}
continue;
}
}
# 构造对象
$class = new $className($server);
switch ($name) {
case 'API':
if ($class instanceof WorkerAPI) {
/**
* @var WorkerAPI $class
*/
$class->prefix = self::$config['server']['http']['api_prefix'] ?: '/api/';
$class->prefixLength = strlen($class->prefix);
} else {
unset(self::$workers[$name]);
self::warn("忽略{$className} 服务, 必须继承 \\MyQEE\\Server\\WorkerAPI 类");
continue 2;
}
break;
case 'Manager':
if ($class instanceof WorkerManager) {
/**
* @var WorkerManager $class
*/
$class->prefix = self::$config['server']['http']['manager_prefix'] ?: '/admin/';
$class->prefixLength = strlen($class->prefix);
} else {
unset(self::$workers[$name]);
self::warn("忽略 {$className} 服务, 必须继承 \\MyQEE\\Server\\WorkerManager 类");
continue 2;
}
break;
default:
if (!$class instanceof Worker) {
unset(self::$workers[$name]);
self::warn("忽略 {$name} 多协议服务, 对象 {$className} 必须继承 \\MyQEE\\Server 的 WorkerTCP 或 WorkerUDP 或 WorkerHttp 或 WorkerWebSocket");
continue 2;
}
break;
}
$class->name = $name;
$class->worker = self::$worker;
self::$workers[$name] = $class;
}
foreach (self::$workers as $class) {
# 设置工作ID
$class->id = $workerId;
# 调用初始化方法
$class->onStart();
}
}
}