Quellcode durchsuchen

v3.0.8 App\*\start fix Select Timer args

walkor vor 10 Jahren
Ursprung
Commit
b7b2620337

+ 22 - 13
Applications/Todpole/start.php

@@ -1,21 +1,26 @@
 <?php 
+use \Workerman\Worker;
 use \Workerman\WebServer;
 use \GatewayWorker\Gateway;
 use \GatewayWorker\BusinessWorker;
 
-// gateway
-$gateway = new Gateway("Websocket://0.0.0.0:8585");
+// 自动加载类
+require_once __DIR__ . '/Workerman/Autoloader.php';
 
+// gateway 进程
+$gateway = new Gateway("Websocket://0.0.0.0:8585");
+// worker名称,以便status时查看方便
 $gateway->name = 'TodpoleGateway';
-
+// 开启的进程数,建议与cpu核数相同
 $gateway->count = 4;
-
+// 分布式部署时请设置成内网ip(非127.0.0.1)
 $gateway->lanIp = '127.0.0.1';
-
+// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
+// 则一般会使用4001 4002 4003 4004 4个端口作为内部通讯端口 
 $gateway->startPort = 4000;
-
+// 心跳间隔
 $gateway->pingInterval = 10;
-
+// 心跳数据
 $gateway->pingData = '{"type":"ping"}';
 
 /* 
@@ -36,18 +41,22 @@ $gateway->onConnect = function($connection)
 }; 
 */
 
-
-// bussinessWorker
+// bussinessWorker 进程
 $worker = new BusinessWorker();
-
+// worker名称
 $worker->name = 'TodpoleBusinessWorker';
-
+// bussinessWorker进程数量
 $worker->count = 4;
 
 
 // WebServer
 $web = new WebServer("http://0.0.0.0:8686");
-
+// WebServer数量
 $web->count = 2;
-
+// 设置站点根目录
 $web->addRoot('www.your_domain.com', __DIR__.'/Web');
+// 如果不是在根目录启动,则运行runAll方法
+if(!defined('GLOBAL_START'))
+{
+    Worker::runAll();
+}

+ 0 - 71
Workerman/Connection/AsyncTcpConnection.php

@@ -125,75 +125,4 @@ class AsyncTcpConnection extends TcpConnection
             $this->emitError(WORKERMAN_CONNECT_FAIL, 'connect fail');
         }
     }
-    
-    /**
-     * 发送数据给对方
-     * @param string $send_buffer
-     * @return void|boolean
-     */
-    public function send($send_buffer)
-    {
-        // 如果有设置协议,则用协议编码
-        if($this->protocol)
-        {
-            $parser = $this->protocol;
-            $send_buffer = $parser::encode($send_buffer, $this);
-        }
-        
-        // 如果当前状态是连接中,则把数据放入发送缓冲区
-        if($this->_status === self::STATUS_CONNECTING)
-        {
-            $this->_sendBuffer .= $send_buffer;
-            return null;
-        }
-        // 如果当前连接是关闭中,则返回false
-        elseif($this->_status == self::STATUS_CLOSED)
-        {
-            return false;
-        }
-        // 如果发送缓冲区无数据,则尝试直接发送
-        if($this->_sendBuffer === '')
-        {
-            // 直接发送,得到已经发送(写入socket写缓冲区)的字节数
-            $len = @fwrite($this->_socket, $send_buffer);
-            // 如果已经发送出去的长度刚好为要发送数据的长度,则说明数据发送成功
-            if($len === strlen($send_buffer))
-            {
-                return true;
-            }
-            // 数据只发送了一部分,则将剩余的数据放入发送缓冲区
-            if($len > 0)
-            {
-                $this->_sendBuffer = substr($send_buffer, $len);
-            }
-            // 发送出现异常
-            else
-            {
-                // 如果连接关闭
-                if(feof($this->_socket))
-                {
-                    // status命令 统计发送失败次数
-                    self::$statistics['send_fail']++;
-                    // 如果有设置失败回到,则执行
-                    if($this->onError)
-                    {
-                        call_user_func($this->onError, $this, WORKERMAN_SEND_FAIL, 'client close');
-                    }
-                    // 销毁本实例
-                    $this->destroy();
-                    return false;
-                }
-                // 连接未关闭,则将整个数据放入发送缓冲区
-                $this->_sendBuffer = $send_buffer;
-            }
-            // 监听可写事件,将发送缓冲区的数据发送给对方(写到socket发送缓冲区)
-            Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'baseWrite'));
-            return null;
-        }
-        // 发送缓冲区有数据,则直接将数据放入发送缓冲区
-        else
-        {
-            $this->_sendBuffer .= $send_buffer;
-        }
-    }
 }

+ 11 - 4
Workerman/Connection/TcpConnection.php

@@ -180,12 +180,19 @@ class TcpConnection extends ConnectionInterface
      */
     public function send($send_buffer, $raw = false)
     {
-        // 如果连接已经关闭,则返回false
-        if($this->_status == self::STATUS_CLOSED)
+        // 如果当前状态是连接中,则把数据放入发送缓冲区
+        if($this->_status === self::STATUS_CONNECTING)
+        {
+            $this->_sendBuffer .= $send_buffer;
+            return null;
+        }
+        // 如果当前连接是关闭,则返回false
+        elseif($this->_status == self::STATUS_CLOSED)
         {
             return false;
         }
-        // 如果没有设置以原始数据发送,并且有设置协议。只协议编码
+        
+        // 如果没有设置以原始数据发送,并且有设置协议则按照协议编码
         if(false === $raw && $this->protocol)
         {
             $parser = $this->protocol;
@@ -241,7 +248,7 @@ class TcpConnection extends ConnectionInterface
         }
         else
         {
-            // 缓冲区已经标记为满,然有数据发送,则丢弃数据包
+            // 缓冲区已经标记为满,仍然然有数据发送,则丢弃数据包
             if(self::$maxSendBufferSize <= strlen($this->_sendBuffer))
             {
                 // 为status命令统计发送失败次数

+ 1 - 1
Workerman/Events/Select.php

@@ -185,7 +185,7 @@ class Select implements EventInterface
                 // 尝试执行任务
                 try
                 {
-                    call_user_func($task_data[0], $task_data[1]);
+                    call_user_func_array($task_data[0], $task_data[1]);
                 }
                 catch(\Exception $e)
                 {

+ 1 - 1
Workerman/Worker.php

@@ -21,7 +21,7 @@ class Worker
      * 版本号
      * @var string
      */
-    const VERSION = '3.0.7';
+    const VERSION = '3.0.8';
     
     /**
      * 状态 启动中

+ 6 - 1
start.php

@@ -7,6 +7,7 @@
 ini_set('display_errors', 'on');
 use Workerman\Worker;
 
+// 检查扩展
 if(!extension_loaded('pcntl'))
 {
     exit("Please install pcntl extension. See http://doc3.workerman.net/install/install.html\n");
@@ -17,11 +18,15 @@ if(!extension_loaded('posix'))
     exit("Please install posix extension. See http://doc3.workerman.net/install/install.html\n");
 }
 
+// 标记是全局启动
+define('GLOBAL_START', 1);
+
 require_once __DIR__ . '/Workerman/Autoloader.php';
 
+// 加载所有Applications/*/start.php,以便启动所有服务
 foreach(glob(__DIR__.'/Applications/*/start.php') as $start_file)
 {
     require_once $start_file;
 }
-
+// 运行所有服务
 Worker::runAll();