walkor il y a 12 ans
Parent
commit
d893b26227

+ 0 - 46
Config/main.ini

@@ -1,46 +0,0 @@
-[main]
-;dev or production dev环境中var_dump、echo、php notcie等不会在终端上打印出来
-debug=1
-;保存主进程pid的文件
-pid_file=/var/run/php-server.pid
-;日志文件目录
-log_dir=../logs/
-;共享内存及消息队列用到的key
-ipc_key=0x70010a2e
-;开启共享内存大小
-shm_size=393216
-
-[GameGateway]
-socket[protocol] = tcp
-socket[port] = 8282
-socket[persistent] = 1
-children_count = 5
-user = www-data
-preread_length = 23
-lan_ip = 127.0.0.1
-game_worker[] = udp://127.0.0.1:8383
-game_worker[] = udp://127.0.0.1:8383
-
-[GameWorker]
-socket[protocol] = udp
-socket[port] = 8383
-socket[persistent] = 1
-children_count = 5
-user = www-data
-preread_length = 23
-
-;监控框架的进程,并提供telnet接口
-[Monitor]
-socket[protocol] = tcp
-socket[port] = 10101
-socket[ip] = 0.0.0.0
-socket[persistent] = 1
-children_count=1
-max_requests=10000
-user=root
-preread_length=64
-max_worker_exit_count=2000
-max_mem_limit=83886
-
-;[FileMonitor]
-;children_count = 1

+ 1 - 1
Core/AbstractWorker.php

@@ -253,7 +253,7 @@ abstract class AbstractWorker
     {
         $str = 'Worker['.get_class($this).']:'.$str;
         Lib\Log::add($str);
-        if($display && Lib\Config::get('debug') == 1)
+        if($display && Lib\Config::get('workerman.debug') == 1)
         {
             echo $str."\n";
         }

+ 8 - 22
Core/Lib/Checker.php

@@ -106,34 +106,20 @@ class Checker
         $total_worker_count = 0;
         // 检查worker 是否有语法错误
         echo "----------------------WORKERS--------------------\n";
-        foreach (Config::get('workers') as $worker_name=>$config)
+        foreach (Config::getAllWorkers() as $worker_name=>$config)
         {
-            if(isset($config['socket']))
+            if(empty($config['start_workers']))
             {
-                // 端口、协议、进程数等信息
-                if(empty($config['socket']['port']))
-                {
-                    \WORKERMAN\Core\Master::notice(str_pad($worker_name, $pad_length)." [port not set] \t Server start fail");
-                    exit(str_pad($worker_name, $pad_length)."\033[31;40m [port not set] \033[0m\n\n\033[31;40mServer start fail\033[0m\n");
-                }
-                if(empty($config['socket']['protocol']))
-                {
-                    \WORKERMAN\Core\Master::notice(str_pad($worker_name, $pad_length)." [protocol not set]\tServer start fail");
-                    exit(str_pad($worker_name, $pad_length)."\033[31;40m [protocol not set]\033[0m\n\n\033[31;40mServer start fail\033[0m\n");
-                }
-            }
-            if(empty($config['children_count']))
-            {
-                \WORKERMAN\Core\Master::notice(str_pad($worker_name, $pad_length)." [children_count not set]\tServer start fail");
-                exit(str_pad($worker_name, $pad_length)."\033[31;40m [children_count not set]\033[0m\n\n\033[31;40mServer start fail\033[0m\n");
+                \WORKERMAN\Core\Master::notice(str_pad($worker_name, $pad_length)." [start_workers not set]\tServer start fail");
+                exit(str_pad($worker_name, $pad_length)."\033[31;40m [start_workers not set]\033[0m\n\n\033[31;40mServer start fail\033[0m\n");
             }
     
-            $total_worker_count += $config['children_count'];
+            $total_worker_count += $config['start_workers'];
     
             // 语法检查
             if(0 != self::checkSyntaxError(WORKERMAN_ROOT_DIR . "Workers/$worker_name.php", $worker_name))
             {
-                unset(Config::instance()->config['workers'][$worker_name]);
+                unset(Config::instance()->config[$worker_name]);
                 \WORKERMAN\Core\Master::notice("$worker_name has Fatal Err");
                 echo str_pad($worker_name, $pad_length),"\033[31;40m [Fatal Err] \033[0m\n";
                 continue;
@@ -155,8 +141,8 @@ class Checker
     
         if($total_worker_count > \WORKERMAN\Core\Master::SERVER_MAX_WORKER_COUNT)
         {
-            \WORKERMAN\Core\Master::notice("Number of worker processes can not be more than " . \WORKERMAN\Core\Master::SERVER_MAX_WORKER_COUNT . ".\tPlease check children_count in " . WORKERMAN_ROOT_DIR . "config/main.php\tServer start fail");
-            exit("\n\033[31;40mNumber of worker processes can not be more than " . \WORKERMAN\Core\Master::SERVER_MAX_WORKER_COUNT . ".\nPlease check children_count in " . WORKERMAN_ROOT_DIR . "config/main.php\033[0m\n\n\033[31;40mServer start fail\033[0m\n");
+            \WORKERMAN\Core\Master::notice("Number of worker processes can not be more than " . \WORKERMAN\Core\Master::SERVER_MAX_WORKER_COUNT . ".\tPlease check start_workers in " . WORKERMAN_ROOT_DIR . "config/main.php\tServer start fail");
+            exit("\n\033[31;40mNumber of worker processes can not be more than " . \WORKERMAN\Core\Master::SERVER_MAX_WORKER_COUNT . ".\nPlease check start_workers in " . WORKERMAN_ROOT_DIR . "config/main.php\033[0m\n\n\033[31;40mServer start fail\033[0m\n");
         }
     
         echo "-------------------------------------------------\n";

+ 37 - 25
Core/Lib/Config.php

@@ -3,41 +3,46 @@ namespace WORKERMAN\Core\Lib;
 class Config
 {
     public $filename;
-    public $config;
-    protected static $instances = array();
+    public $config = array();
+    protected static $instances = null;
 
-    private function __construct($domain = 'main') {
-        $folder = WORKERMAN_ROOT_DIR . 'Config';
-        $filename = $folder . '/' . $domain;
-        $filename .= '.ini';
-
-        if (!file_exists($filename)) {
-            throw new \Exception('Configuration file "' . $filename . '" not found');
+    private function __construct()
+     {
+        $config_file = WORKERMAN_ROOT_DIR . 'conf/workerman.conf';
+        if (!file_exists($config_file)) 
+        {
+            throw new \Exception('Configuration file "' . $config_file . '" not found');
         }
-
-        $config = parse_ini_file($filename, true);
-        if (!is_array($config) || empty($config)) {
-            throw new \Exception('Invalid configuration file format');
+        $this->config['workerman'] = $this->parseFile($config_file);
+        $this->filename = realpath($config_file);
+        foreach(glob(WORKERMAN_ROOT_DIR . 'conf.d/*.conf') as $config_file)
+        {
+            $worker_name = basename($config_file, '.conf');
+            $this->config[$worker_name] = $this->parseFile($config_file);
         }
-
-        $this->config = $config['main'];
-        unset($config['main']);
-        $this->config['workers'] = $config;
-        $this->filename = realpath($filename);
     }
-
-    public static function instance($domain = 'main')
+    
+    protected function parseFile($config_file)
     {
-        if (empty(self::$instances[$domain])) {
-            self::$instances[$domain] = new self($domain);
+        $config = parse_ini_file($config_file, true);
+        if (!is_array($config) || empty($config))
+        {
+            throw new \Exception('Invalid configuration format');
         }
-        return self::$instances[$domain];
+        return $config;
     }
 
-    public static function get($uri, $domain = 'main')
+    public static function instance()
     {
-        $node = self::instance($domain)->config;
+        if (!self::$instances) {
+            self::$instances = new self();
+        }
+        return self::$instances;
+    }
 
+    public static function get($uri)
+    {
+        $node = self::instance()->config;
         $paths = explode('.', $uri);
         while (!empty($paths)) {
             $path = array_shift($paths);
@@ -50,6 +55,13 @@ class Config
         return $node;
     }
     
+    public static function getAllWorkers()
+    {
+         $copy = $this->config;
+         unset($copy['workerman']);
+         return $copy;
+    }
+    
     public static function reload()
     {
         self::$instances = array();

+ 10 - 11
Core/Master.php

@@ -299,20 +299,19 @@ class Master
     protected static function createSocketsAndListen()
     {
         // 循环读取配置创建socket
-        foreach (Lib\Config::get('workers') as $worker_name=>$config)
+        foreach (Lib\Config::getAllWorkers() as $worker_name=>$config)
         {
-            if(isset($config['socket']))
+            if(isset($config['listen']))
             {
-                $flags = $config['socket']['protocol'] == 'udp' ? STREAM_SERVER_BIND : STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-                $ip = isset($config['socket']['ip']) ? $config['socket']['ip'] : "0.0.0.0";
+                $flags = substr($config['listen'], 0, 3) == 'udp' ? STREAM_SERVER_BIND : STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
                 $error_no = 0;
                 $error_msg = '';
                 // 创建监听socket
-                self::$listenedSockets[$worker_name] = stream_socket_server("{$config['socket']['protocol']}://{$ip}:{$config['socket']['port']}", $error_no, $error_msg, $flags);
+                self::$listenedSockets[$worker_name] = stream_socket_server($config['listen'], $error_no, $error_msg, $flags);
                 if(!self::$listenedSockets[$worker_name])
                 {
-                    Lib\Log::add("can not create socket {$config['socket']['protocol']}://{$ip}:{$config['socket']['port']} info:{$error_no} {$error_msg}\tServer start fail");
-                    exit("\n\033[31;40mcan not create socket {$config['socket']['protocol']}://{$ip}:{$config['socket']['port']} info:{$error_no} {$error_msg}\033[0m\n\n\033[31;40mServer start fail\033[0m\n\n");
+                    Lib\Log::add("can not create socket {{$config['listen']} info:{$error_no} {$error_msg}\tServer start fail");
+                    exit("\n\033[31;40mcan not create socket {{$config['listen']} info:{$error_no} {$error_msg}\033[0m\n\n\033[31;40mServer start fail\033[0m\n\n");
                 }
             }
         }
@@ -326,7 +325,7 @@ class Master
     protected static function createWorkers()
     {
         // 循环读取配置创建一定量的worker进程
-        foreach (Lib\Config::get('workers') as $worker_name=>$config)
+        foreach (Lib\Config::getAllWorkers() as $worker_name=>$config)
         {
             // 初始化
             if(empty(self::$workerPids[$worker_name]))
@@ -334,7 +333,7 @@ class Master
                 self::$workerPids[$worker_name] = array();
             }
     
-            while(count(self::$workerPids[$worker_name]) < $config['children_count'])
+            while(count(self::$workerPids[$worker_name]) < $config['start_workers'])
             {
                 $pid = self::forkOneWorker($worker_name);
                 // 子进程退出
@@ -388,7 +387,7 @@ class Master
             }
     
             // 尝试以指定用户运行worker
-            if($worker_user = Lib\Config::get('workers.' . $worker_name . '.user'))
+            if($worker_user = Lib\Config::get($worker_name . '.user'))
             {
                 self::setWorkerUser($worker_user);
             }
@@ -816,7 +815,7 @@ class Master
     protected static function resetStdFd()
     {
         // 开发环境不关闭标准输出,用于调试
-        if(Lib\Config::get('debug') == 1 && posix_ttyname(STDOUT))
+        if(Lib\Config::get('workerman.debug') == 1 && posix_ttyname(STDOUT))
         {
             return;
         }

+ 3 - 3
Core/SocketWorker.php

@@ -171,12 +171,12 @@ abstract class SocketWorker extends AbstractWorker
         }
         
         // 是否开启长连接
-        $this->isPersistentConnection = (bool)Lib\Config::get('workers.' . $worker_name . '.socket.persistent');
+        $this->isPersistentConnection = (bool)Lib\Config::get( $worker_name . '.persistent_connection');
         // 最大请求数,如果没有配置则使用PHP_INT_MAX
-        $this->maxRequests = (int)Lib\Config::get('workers.' . $worker_name . '.max_requests');
+        $this->maxRequests = (int)Lib\Config::get( $worker_name . '.max_requests');
         $this->maxRequests = $this->maxRequests <= 0 ? PHP_INT_MAX : $this->maxRequests;
 
-        $preread_length = (int)Lib\Config::get('workers.' . $worker_name . '.preread_length');
+        $preread_length = (int)Lib\Config::get( $worker_name . '.preread_length');
         if($preread_length > 0)
         {
             $this->prereadLength = $preread_length;

+ 1 - 1
Workers/FileMonitor.php

@@ -27,7 +27,7 @@ class FileMonitor extends WORKERMAN\Core\AbstractWorker
      */
     public function start()
     {
-        if(\WORKERMAN\Core\Lib\Config::get('debug') != 1)
+        if(\WORKERMAN\Core\Lib\Config::get('workerman.debug') != 1)
         {
             return;
         }

+ 3 - 3
Workers/GameGateway.php

@@ -41,7 +41,7 @@ class GameGateway extends WORKERMAN\Core\SocketWorker
         
         // 创建内部通信套接字
         $this->lanPort = posix_getpid();
-        $this->lanIp = WORKERMAN\Core\Lib\Config::get('workers.'.$this->workerName.'.lan_ip');
+        $this->lanIp = WORKERMAN\Core\Lib\Config::get($this->workerName.'.lan_ip');
         if(!$this->lanIp)
         {
             $this->notice($this->workerName.'.lan_ip not set');
@@ -119,7 +119,7 @@ class GameGateway extends WORKERMAN\Core\SocketWorker
     
     protected function initWorkerAddresses()
     {
-        $this->workerAddresses = WORKERMAN\Core\Lib\Config::get('workers.'.$this->workerName.'.game_worker');
+        $this->workerAddresses = WORKERMAN\Core\Lib\Config::get($this->workerName.'.game_worker');
         if(!$this->workerAddresses)
         {
             $this->notice($this->workerName.'game_worker not set');
@@ -273,7 +273,7 @@ class GameGateway extends WORKERMAN\Core\SocketWorker
     {
         $str = 'Worker['.get_class($this).']:'."$str ip:".$this->getRemoteIp();
         WORKERMAN\Core\Lib\Log::add($str);
-        if($display && WORKERMAN\Core\Lib\Config::get('debug') == 1)
+        if($display && WORKERMAN\Core\Lib\Config::get('workerman.debug') == 1)
         {
             echo $str."\n";
         }

+ 4 - 4
Workers/Monitor.php

@@ -341,7 +341,7 @@ class Monitor extends WORKERMAN\Core\SocketWorker
         {
             $pid = $message['pid'];
             $worker_name = $message['worker_name'];
-            $workers = \WORKERMAN\Core\Lib\Config::get('workers');
+            $workers = \WORKERMAN\Core\Lib\Config::getAllWorkers();
             $port = $workers[$worker_name]['socket']['port'];
             $proto = $workers[$worker_name]['socket']['protocol'];
             $str = "$pid\t".str_pad(round($message['memory']/(1024*1024),2)."M", 9)." $proto    ". str_pad($port, 5) ." ". $message['start_time'] ." ".str_pad($worker_name, $this->maxWorkerNameLength)." ";
@@ -437,7 +437,7 @@ class Monitor extends WORKERMAN\Core\SocketWorker
             return;
         }
         
-        $max_worker_exit_count = (int)\WORKERMAN\Core\Lib\Config::get("workers.".$this->workerName.".max_worker_exit_count");
+        $max_worker_exit_count = (int)\WORKERMAN\Core\Lib\Config::get($this->workerName.".max_worker_exit_count");
         if($max_worker_exit_count <= 0)
         {
             $max_worker_exit_count = 2000;
@@ -477,7 +477,7 @@ class Monitor extends WORKERMAN\Core\SocketWorker
      */
     protected function checkWorkerMemByPid($pid, $worker_name)
     {
-        $mem_limit = \WORKERMAN\Core\Lib\Config::get('workers.'.__CLASS__.'.max_mem_limit');
+        $mem_limit = \WORKERMAN\Core\Lib\Config::get($this->workerName.'.max_mem_limit');
         if(!$mem_limit)
         {
             $mem_limit = self::DEFAULT_MEM_LIMIT;
@@ -554,7 +554,7 @@ class Monitor extends WORKERMAN\Core\SocketWorker
         {
             if($worker_name)
             {
-                $ip = \WORKERMAN\Core\Lib\Config::get('workers.' . $worker_name . '.ip');
+                $ip = \WORKERMAN\Core\Lib\Config::get($worker_name . '.ip');
             }
             if(empty($ip) || $ip == '0.0.0.0' || $ip = '127.0.0.1')
             {

+ 8 - 0
conf/conf.d/GameGateway.conf

@@ -0,0 +1,8 @@
+listen = tcp://127.0.0.1:8282
+persistent_connection = 1
+start_workers = 5
+user = www-data
+preread_length = 23
+lan_ip = 127.0.0.1
+game_worker[] = udp://127.0.0.1:8383
+game_worker[] = udp://127.0.0.1:8383

+ 5 - 0
conf/conf.d/GameWorker.conf

@@ -0,0 +1,5 @@
+listen = udp://127.0.0.1:8383
+persistent_connection = 1
+start_workers = 5
+user = www-data
+preread_length = 23

+ 8 - 0
conf/conf.d/Monitor.conf

@@ -0,0 +1,8 @@
+listen = tcp://0.0.0.0:10011
+persistent_connection = 1
+start_workers=1
+max_requests=10000
+user=root
+preread_length=64
+max_worker_exit_count=2000
+max_mem_limit=83886

+ 10 - 0
conf/workerman.conf

@@ -0,0 +1,10 @@
+;dev or production dev环境中var_dump、echo、php notcie等不会在终端上打印出来
+debug=1
+;保存主进程pid的文件
+pid_file=/var/run/php-server.pid
+;日志文件目录
+log_dir=../logs/
+;共享内存及消息队列用到的key
+ipc_key=0x70010a2e
+;开启共享内存大小
+shm_size=393216