

{"id":320,"date":"2024-02-08T11:26:47","date_gmt":"2024-02-08T03:26:47","guid":{"rendered":"https:\/\/www.01j.top\/?p=320"},"modified":"2024-02-08T11:26:48","modified_gmt":"2024-02-08T03:26:48","slug":"window%e5%92%8clinux%e7%b3%bb%e7%bb%9f%e5%ae%89%e8%a3%85thinkphp5gatewayworkerworkerman","status":"publish","type":"post","link":"https:\/\/www.01j.top\/?p=320","title":{"rendered":"Window\u548cLINUX\u7cfb\u7edf\u5b89\u88c5thinkphp5+GatewayWorker+Workerman"},"content":{"rendered":"\n<p><a href=\"https:\/\/www.thinkphp.cn\/code\/3938.html\"><\/a><\/p>\n\n\n\n<p>thinkphp5+GatewayWorker+Workerman\u804a\u5929\u5ba4\uff0c\u53ef\u4ee5\u591a\u4eba\u804a\u5929\uff0c\u6307\u5b9a\u67d0\u4e2a\u4eba\u8fdb\u884c\u804a\u5929\uff0c\u8fd8\u53ef\u4ee5\u5207\u6362\u804a\u5929\u623f\u95f4<\/p>\n\n\n\n<h2 id=\"h2-0\"><strong>Windows\u7248\u5b89\u88c5<\/strong><\/h2>\n\n\n\n<p>a) \u5b89\u88c5thinkphp5\uff1b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer create-project topthink\/think tp5  --prefer-dist<\/code><\/pre>\n\n\n\n<p>b) \u8fdb\u5165tp5\u7684\u76ee\u5f55\uff0c\u5b89\u88c5Windows\u7248\u672c\u7684workerman\uff1b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer require workerman\/workerman-for-win<\/code><\/pre>\n\n\n\n<p>c)\u5b89\u88c5Windows\u7248\u672c\u7684gateway\uff1b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer require workerman\/gateway-worker-for-win<\/code><\/pre>\n\n\n\n<h2 id=\"h2-1\"><strong>\u5f00\u59cb\u5173\u952e\u90e8\u5206,\u670d\u52a1\u7aef\u5b9e\u73b0<\/strong><\/h2>\n\n\n\n<p>\u63a7\u5236\u5668 \u63a7\u5236\u5668\uff1aapp\\index\\controller\\Sregister<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\nnamespace app\\index\\controller;\r\nuse Workerman\\Worker;\r\nuse GatewayWorker\\Register;\r\nclass Sregister{\r\n    public function __construct(){\r\n        \/\/ register \u670d\u52a1\u5fc5\u987b\u662ftext\u534f\u8bae\r\n        $register = new Register('text:\/\/0.0.0.0:1236');\r\n        \r\n        \/\/ \u5982\u679c\u4e0d\u662f\u5728\u6839\u76ee\u5f55\u542f\u52a8\uff0c\u5219\u8fd0\u884crunAll\u65b9\u6cd5\r\n        if(!defined('GLOBAL_START'))\r\n        {\r\n            Worker::runAll();\r\n        }\r\n    }\r\n}<\/code><\/pre>\n\n\n\n<p>\u63a7\u5236\u5668\uff1aapp\\index\\controller\\Sgateway.php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\nnamespace app\\index\\controller;\r\nuse Workerman\\Worker;\r\nuse GatewayWorker\\Gateway;\r\nuse Workerman\\Autoloader;\r\nclass Sgateway{\r\n    public function __construct(){\r\n        \/\/ gateway \u8fdb\u7a0b\r\n        $gateway = new Gateway(\"Websocket:\/\/0.0.0.0:7272\");\r\n        \/\/ \u8bbe\u7f6e\u540d\u79f0\uff0c\u65b9\u4fbfstatus\u65f6\u67e5\u770b\r\n        $gateway->name = 'ChatGateway';\r\n        \/\/ \u8bbe\u7f6e\u8fdb\u7a0b\u6570\uff0cgateway\u8fdb\u7a0b\u6570\u5efa\u8bae\u4e0ecpu\u6838\u6570\u76f8\u540c\r\n        $gateway->count = 4;\r\n        \/\/ \u5206\u5e03\u5f0f\u90e8\u7f72\u65f6\u8bf7\u8bbe\u7f6e\u6210\u5185\u7f51ip\uff08\u975e127.0.0.1\uff09\r\n        $gateway->lanIp = '127.0.0.1';\r\n        \/\/ \u5185\u90e8\u901a\u8baf\u8d77\u59cb\u7aef\u53e3\uff0c\u5047\u5982$gateway->count=4\uff0c\u8d77\u59cb\u7aef\u53e3\u4e3a4000\r\n        \/\/ \u5219\u4e00\u822c\u4f1a\u4f7f\u75284000 4001 4002 4003 4\u4e2a\u7aef\u53e3\u4f5c\u4e3a\u5185\u90e8\u901a\u8baf\u7aef\u53e3\r\n        $gateway->startPort = 2300;\r\n        \/\/ \u5fc3\u8df3\u95f4\u9694\r\n        $gateway->pingInterval = 10;\r\n        \/\/ \u5fc3\u8df3\u6570\u636e\r\n        $gateway->pingData = '{\"type\":\"ping\"}';\r\n        \/\/ \u670d\u52a1\u6ce8\u518c\u5730\u5740\r\n        $gateway->registerAddress = '127.0.0.1:1236';\r\n        \r\n        \/*\r\n         \/\/ \u5f53\u5ba2\u6237\u7aef\u8fde\u63a5\u4e0a\u6765\u65f6\uff0c\u8bbe\u7f6e\u8fde\u63a5\u7684onWebSocketConnect\uff0c\u5373\u5728websocket\u63e1\u624b\u65f6\u7684\u56de\u8c03\r\n         $gateway->onConnect = function($connection)\r\n         {\r\n         $connection->onWebSocketConnect = function($connection , $http_header)\r\n         {\r\n         \/\/ \u53ef\u4ee5\u5728\u8fd9\u91cc\u5224\u65ad\u8fde\u63a5\u6765\u6e90\u662f\u5426\u5408\u6cd5\uff0c\u4e0d\u5408\u6cd5\u5c31\u5173\u6389\u8fde\u63a5\r\n         \/\/ $_SERVER&#91;'HTTP_ORIGIN']\u6807\u8bc6\u6765\u81ea\u54ea\u4e2a\u7ad9\u70b9\u7684\u9875\u9762\u53d1\u8d77\u7684websocket\u94fe\u63a5\r\n         if($_SERVER&#91;'HTTP_ORIGIN'] != 'http:\/\/chat.workerman.net')\r\n         {\r\n         $connection->close();\r\n         }\r\n         \/\/ onWebSocketConnect \u91cc\u9762$_GET $_SERVER\u662f\u53ef\u7528\u7684\r\n         \/\/ var_dump($_GET, $_SERVER);\r\n         };\r\n         };\r\n         *\/\r\n        \r\n        \/\/ \u5982\u679c\u4e0d\u662f\u5728\u6839\u76ee\u5f55\u542f\u52a8\uff0c\u5219\u8fd0\u884crunAll\u65b9\u6cd5\r\n        if(!defined('GLOBAL_START'))\r\n        {\r\n            Worker::runAll();\r\n        }\r\n        \r\n        \r\n    }\r\n}<\/code><\/pre>\n\n\n\n<p>\u63a7\u5236\u5668\uff1aapp\\index\\controller\\Sbusinessworker.php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\nnamespace app\\index\\controller;\r\nuse Workerman\\Worker;\r\nuse GatewayWorker\\BusinessWorker;\r\nuse Workerman\\Autoloader;\r\nclass Sbusinessworker{\r\n    public function __construct(){\r\n        \/\/ bussinessWorker \u8fdb\u7a0b\r\n        $worker = new BusinessWorker();\r\n        \/\/ worker\u540d\u79f0\r\n        $worker->name = 'ChatBusinessWorker';\r\n        \/\/ bussinessWorker\u8fdb\u7a0b\u6570\u91cf\r\n        $worker->count = 4;\r\n        \/\/ \u670d\u52a1\u6ce8\u518c\u5730\u5740\r\n        $worker->registerAddress = '127.0.0.1:1236';\r\n        \/\/\u8bbe\u7f6e\u5904\u7406\u4e1a\u52a1\u7684\u7c7b,\u6b64\u5904\u5236\u5b9aEvents\u7684\u547d\u540d\u7a7a\u95f4\r\n        $worker->eventHandler = 'app\\index\\controller\\Events';\r\n        \r\n        \/\/ \u5982\u679c\u4e0d\u662f\u5728\u6839\u76ee\u5f55\u542f\u52a8\uff0c\u5219\u8fd0\u884crunAll\u65b9\u6cd5\r\n        if(!defined('GLOBAL_START'))\r\n        {\r\n            Worker::runAll();\r\n        }\r\n    }\r\n}<\/code><\/pre>\n\n\n\n<p>\u63a7\u5236\u5668\uff1aapp\\index\\controller\\Events.php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\nnamespace app\\index\\controller;\r\n\/**\r\n * \u7528\u4e8e\u68c0\u6d4b\u4e1a\u52a1\u4ee3\u7801\u6b7b\u5faa\u73af\u6216\u8005\u957f\u65f6\u95f4\u963b\u585e\u7b49\u95ee\u9898\r\n * \u5982\u679c\u53d1\u73b0\u4e1a\u52a1\u5361\u6b7b\uff0c\u53ef\u4ee5\u5c06\u4e0b\u9762declare\u6253\u5f00\uff08\u53bb\u6389\/\/\u6ce8\u91ca\uff09\uff0c\u5e76\u6267\u884cphp start.php reload\r\n * \u7136\u540e\u89c2\u5bdf\u4e00\u6bb5\u65f6\u95f4workerman.log\u770b\u662f\u5426\u6709process_timeout\u5f02\u5e38\r\n *\/\r\n\/\/declare(ticks=1);\r\n\/**\r\n * \u804a\u5929\u4e3b\u903b\u8f91\r\n * \u4e3b\u8981\u662f\u5904\u7406 onMessage onClose \r\n *\/\r\nuse \\GatewayWorker\\Lib\\Gateway;\r\nclass Events\r\n{\r\n   \/**\r\n    * \u6709\u6d88\u606f\u65f6\r\n    * @param int $client_id\r\n    * @param mixed $message\r\n    *\/\r\n   public static function onMessage($client_id, $message)\r\n   {\r\n        \/\/ debug\r\n        echo \"client:{$_SERVER&#91;'REMOTE_ADDR']}:{$_SERVER&#91;'REMOTE_PORT']} gateway:{$_SERVER&#91;'GATEWAY_ADDR']}:{$_SERVER&#91;'GATEWAY_PORT']}  client_id:$client_id session:\".json_encode($_SESSION).\" onMessage:\".$message.\"\\n\";\r\n        \r\n        \/\/ \u5ba2\u6237\u7aef\u4f20\u9012\u7684\u662fjson\u6570\u636e\r\n        $message_data = json_decode($message, true);\r\n        if(!$message_data)\r\n        {\r\n            return ;\r\n        }\r\n        \r\n        \/\/ \u6839\u636e\u7c7b\u578b\u6267\u884c\u4e0d\u540c\u7684\u4e1a\u52a1\r\n        switch($message_data&#91;'type'])\r\n        {\r\n            \/\/ \u5ba2\u6237\u7aef\u56de\u5e94\u670d\u52a1\u7aef\u7684\u5fc3\u8df3\r\n            case 'pong':\r\n                return;\r\n            \/\/ \u5ba2\u6237\u7aef\u767b\u5f55 message\u683c\u5f0f: {type:login, name:xx, room_id:1} \uff0c\u6dfb\u52a0\u5230\u5ba2\u6237\u7aef\uff0c\u5e7f\u64ad\u7ed9\u6240\u6709\u5ba2\u6237\u7aefxx\u8fdb\u5165\u804a\u5929\u5ba4\r\n            case 'login':\r\n                \/\/ \u5224\u65ad\u662f\u5426\u6709\u623f\u95f4\u53f7\r\n                if(!isset($message_data&#91;'room_id']))\r\n                {\r\n                    throw new \\Exception(\"\\$message_data&#91;'room_id'] not set. client_ip:{$_SERVER&#91;'REMOTE_ADDR']} \\$message:$message\");\r\n                }\r\n                \r\n                \/\/ \u628a\u623f\u95f4\u53f7\u6635\u79f0\u653e\u5230session\u4e2d\r\n                $room_id = $message_data&#91;'room_id'];\r\n                $client_name = htmlspecialchars($message_data&#91;'client_name']);\r\n                $_SESSION&#91;'room_id'] = $room_id;\r\n                $_SESSION&#91;'client_name'] = $client_name;\r\n              \r\n                \/\/ \u83b7\u53d6\u623f\u95f4\u5185\u6240\u6709\u7528\u6237\u5217\u8868 \r\n                $clients_list = Gateway::getClientSessionsByGroup($room_id);\r\n                foreach($clients_list as $tmp_client_id=>$item)\r\n                {\r\n                    $clients_list&#91;$tmp_client_id] = $item&#91;'client_name'];\r\n                }\r\n                $clients_list&#91;$client_id] = $client_name;\r\n                \r\n                \/\/ \u8f6c\u64ad\u7ed9\u5f53\u524d\u623f\u95f4\u7684\u6240\u6709\u5ba2\u6237\u7aef\uff0cxx\u8fdb\u5165\u804a\u5929\u5ba4 message {type:login, client_id:xx, name:xx} \r\n                $new_message = array('type'=>$message_data&#91;'type'], 'client_id'=>$client_id, 'client_name'=>htmlspecialchars($client_name), 'time'=>date('Y-m-d H:i:s'));\r\n                Gateway::sendToGroup($room_id, json_encode($new_message));\r\n                Gateway::joinGroup($client_id, $room_id);\r\n               \r\n                \/\/ \u7ed9\u5f53\u524d\u7528\u6237\u53d1\u9001\u7528\u6237\u5217\u8868 \r\n                $new_message&#91;'client_list'] = $clients_list;\r\n                Gateway::sendToCurrentClient(json_encode($new_message));\r\n                return;\r\n                \r\n            \/\/ \u5ba2\u6237\u7aef\u53d1\u8a00 message: {type:say, to_client_id:xx, content:xx}\r\n            case 'say':\r\n                \/\/ \u975e\u6cd5\u8bf7\u6c42\r\n                if(!isset($_SESSION&#91;'room_id']))\r\n                {\r\n                    throw new \\Exception(\"\\$_SESSION&#91;'room_id'] not set. client_ip:{$_SERVER&#91;'REMOTE_ADDR']}\");\r\n                }\r\n                $room_id = $_SESSION&#91;'room_id'];\r\n                $client_name = $_SESSION&#91;'client_name'];\r\n                \r\n                \/\/ \u79c1\u804a\r\n                if($message_data&#91;'to_client_id'] != 'all')\r\n                {\r\n                    $new_message = array(\r\n                        'type'=>'say',\r\n                        'from_client_id'=>$client_id, \r\n                        'from_client_name' =>$client_name,\r\n                        'to_client_id'=>$message_data&#91;'to_client_id'],\r\n                        'content'=>\"&lt;b>\u5bf9\u4f60\u8bf4: &lt;\/b>\".nl2br(htmlspecialchars($message_data&#91;'content'])),\r\n                        'time'=>date('Y-m-d H:i:s'),\r\n                    );\r\n                    Gateway::sendToClient($message_data&#91;'to_client_id'], json_encode($new_message));\r\n                    $new_message&#91;'content'] = \"&lt;b>\u4f60\u5bf9\".htmlspecialchars($message_data&#91;'to_client_name']).\"\u8bf4: &lt;\/b>\".nl2br(htmlspecialchars($message_data&#91;'content']));\r\n                    return Gateway::sendToCurrentClient(json_encode($new_message));\r\n                }\r\n                \r\n                $new_message = array(\r\n                    'type'=>'say', \r\n                    'from_client_id'=>$client_id,\r\n                    'from_client_name' =>$client_name,\r\n                    'to_client_id'=>'all',\r\n                    'content'=>nl2br(htmlspecialchars($message_data&#91;'content'])),\r\n                    'time'=>date('Y-m-d H:i:s'),\r\n                );\r\n                return Gateway::sendToGroup($room_id ,json_encode($new_message));\r\n        }\r\n   }\r\n   \r\n   \/**\r\n    * \u5f53\u5ba2\u6237\u7aef\u65ad\u5f00\u8fde\u63a5\u65f6\r\n    * @param integer $client_id \u5ba2\u6237\u7aefid\r\n    *\/\r\n   public static function onClose($client_id)\r\n   {\r\n       \/\/ debug\r\n       echo \"client:{$_SERVER&#91;'REMOTE_ADDR']}:{$_SERVER&#91;'REMOTE_PORT']} gateway:{$_SERVER&#91;'GATEWAY_ADDR']}:{$_SERVER&#91;'GATEWAY_PORT']}  client_id:$client_id onClose:''\\n\";\r\n       \r\n       \/\/ \u4ece\u623f\u95f4\u7684\u5ba2\u6237\u7aef\u5217\u8868\u4e2d\u5220\u9664\r\n       if(isset($_SESSION&#91;'room_id']))\r\n       {\r\n           $room_id = $_SESSION&#91;'room_id'];\r\n           $new_message = array('type'=>'logout', 'from_client_id'=>$client_id, 'from_client_name'=>$_SESSION&#91;'client_name'], 'time'=>date('Y-m-d H:i:s'));\r\n           Gateway::sendToGroup($room_id, json_encode($new_message));\r\n       }\r\n   }\r\n  \r\n}<\/code><\/pre>\n\n\n\n<p><strong>\u4ee3\u7801\u76ee\u5f55\u622a\u56fe<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" width=\"377\" height=\"755\" src=\"https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image.png\" alt=\"\" class=\"wp-image-321\" srcset=\"https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image.png 377w, https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-150x300.png 150w\" sizes=\"(max-width: 377px) 100vw, 377px\" \/><figcaption>\u76ee\u5f55\u7ed3\u6784<\/figcaption><\/figure>\n\n\n\n<p><strong>\u7136\u540e\u5728\u9879\u76ee\u6839\u76ee\u5f55 \u65b0\u589e\u5165\u53e3\u6587\u4ef6 start_register.php \u3001start_gateway.php \u3001start_businessworker.php\u4e09\u4e2a\u5165\u53e3\u6587\u4ef6<\/strong><\/p>\n\n\n\n<p><strong>\u6587\u4ef6\uff1astart_register.php<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \r\ndefine('APP_PATH', __DIR__ . '\/application\/');\r\ndefine('BIND_MODULE','index\/Sregister');\r\n\/\/ \u52a0\u8f7d\u6846\u67b6\u5f15\u5bfc\u6587\u4ef6\r\nrequire __DIR__ . '\/thinkphp\/start.php';<\/code><\/pre>\n\n\n\n<p><strong>\u6587\u4ef6\uff1astart_gateway.php<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\ndefine('APP_PATH', __DIR__ . '\/application\/');\r\ndefine('BIND_MODULE','index\/Sgateway');\r\n\/\/ \u52a0\u8f7d\u6846\u67b6\u5f15\u5bfc\u6587\u4ef6\r\nrequire __DIR__ . '\/thinkphp\/start.php';<\/code><\/pre>\n\n\n\n<p><strong>\u6587\u4ef6\uff1astart_businessworker.php<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\ndefine('APP_PATH', __DIR__ . '\/application\/');\r\ndefine('BIND_MODULE','index\/Sbusinessworker');\r\n\/\/ \u52a0\u8f7d\u6846\u67b6\u5f15\u5bfc\u6587\u4ef6\r\nrequire __DIR__ . '\/thinkphp\/start.php';<\/code><\/pre>\n\n\n\n<p><strong>\u7531\u4e8ePHP-CLI\u5728windows\u7cfb\u7edf\u65e0\u6cd5\u5b9e\u73b0\u591a\u8fdb\u7a0b\u4ee5\u53ca\u5b88\u62a4\u8fdb\u7a0b,\u6240\u4ee5\u53ea\u80fd\u628a\u4e09\u4e2a\u6587\u4ef6\u653e\u5230bat\u6587\u4ef6\uff0c\u7136\u540e\u53cc\u51fb\u542f\u52a8<\/strong><\/p>\n\n\n\n<p>bat\u6587\u4ef6\uff1astart_for_win.bat<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php start_register.php start_gateway.php start_businessworker.phppause\r<\/code><\/pre>\n\n\n\n<p><strong>\u4ee3\u7801\u76ee\u5f55\u622a\u56fe<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" width=\"364\" height=\"451\" src=\"https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-1.png\" alt=\"\" class=\"wp-image-322\" srcset=\"https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-1.png 364w, https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-1-242x300.png 242w\" sizes=\"(max-width: 364px) 100vw, 364px\" \/><figcaption>\u76ee\u5f55\u7ed3\u6784<\/figcaption><\/figure>\n\n\n\n<h2 id=\"h2-2\"><strong>\u542f\u52a8\u7a0b\u5e8f<\/strong><\/h2>\n\n\n\n<p>\u5728\u9879\u76ee\u7684\u6839\u76ee\u5f55\u4e0b\u53cc\u51fb\u542f\u52a8 start_for_win.bat<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"244\" src=\"https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-2-1024x244.png\" alt=\"\" class=\"wp-image-323\" srcset=\"https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-2-1024x244.png 1024w, https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-2-300x71.png 300w, https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-2-768x183.png 768w, https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-2.png 1080w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>\u542f\u52a8<\/figcaption><\/figure>\n\n\n\n<h2 id=\"h2-3\"><strong>\u670d\u52a1\u7aef\u5b9e\u73b0<\/strong><\/h2>\n\n\n\n<p>view : tp5\\application\\index\\view\\index.html<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;html>&lt;head>\r\n  &lt;meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\">\r\n  &lt;title>workerman-chat PHP\u804a\u5929\u5ba4 Websocket(HTLM5\/Flash)+PHP\u591a\u8fdb\u7a0bsocket\u5b9e\u65f6\u63a8\u9001\u6280\u672f&lt;\/title>\r\n  &lt;script type=\"text\/javascript\">\r\n  \/\/WebSocket = null;\r\n  &lt;\/script>\r\n  &lt;link href=\"__PUBLIC__\/chat\/css\/bootstrap.min.css\" rel=\"stylesheet\">\r\n  &lt;link href=\"__PUBLIC__\/chat\/css\/style.css\" rel=\"stylesheet\">\r\n  &lt;!-- Include these three JS files: -->\r\n  &lt;script type=\"text\/javascript\" src=\"__PUBLIC__\/chat\/js\/swfobject.js\">&lt;\/script>\r\n  &lt;script type=\"text\/javascript\" src=\"__PUBLIC__\/chat\/js\/web_socket.js\">&lt;\/script>\r\n  &lt;script type=\"text\/javascript\" src=\"__PUBLIC__\/chat\/js\/jquery.min.js\">&lt;\/script>\r\n  &lt;script type=\"text\/javascript\">\r\n    if (typeof console == \"undefined\") {    this.console = { log: function (msg) {  } };}\r\n    \/\/ \u5982\u679c\u6d4f\u89c8\u5668\u4e0d\u652f\u6301websocket\uff0c\u4f1a\u4f7f\u7528\u8fd9\u4e2aflash\u81ea\u52a8\u6a21\u62dfwebsocket\u534f\u8bae\uff0c\u6b64\u8fc7\u7a0b\u5bf9\u5f00\u53d1\u8005\u900f\u660e\r\n    WEB_SOCKET_SWF_LOCATION = \"__PUBLIC__\/chat\/swf\/WebSocketMain.swf\";\r\n    \/\/ \u5f00\u542fflash\u7684websocket debug\r\n    WEB_SOCKET_DEBUG = true;\r\n      \r\n    var ws, name, client_list={};\r\n    \/\/ \u8fde\u63a5\u670d\u52a1\u7aef\r\n    function connect() {\r\n       \/\/ \u521b\u5efawebsocket\r\n       ws = new WebSocket(\"ws:\/\/\"+document.domain+\":7272\");\r\n       \/\/ \u5f53socket\u8fde\u63a5\u6253\u5f00\u65f6\uff0c\u8f93\u5165\u7528\u6237\u540d\r\n       ws.onopen = onopen;\r\n       \/\/ \u5f53\u6709\u6d88\u606f\u65f6\u6839\u636e\u6d88\u606f\u7c7b\u578b\u663e\u793a\u4e0d\u540c\u4fe1\u606f\r\n       ws.onmessage = onmessage; \r\n       ws.onclose = function() {\r\n          console.log(\"\u8fde\u63a5\u5173\u95ed\uff0c\u5b9a\u65f6\u91cd\u8fde\");\r\n          connect();\r\n       };\r\n       ws.onerror = function() {\r\n           console.log(\"\u51fa\u73b0\u9519\u8bef\");\r\n       };\r\n    }\r\n    \/\/ \u8fde\u63a5\u5efa\u7acb\u65f6\u53d1\u9001\u767b\u5f55\u4fe1\u606f\r\n    function onopen()\r\n    {\r\n        if(!name)\r\n        {\r\n            show_prompt();\r\n        }\r\n        \/\/ \u767b\u5f55\r\n        var login_data = '{\"type\":\"login\",\"client_name\":\"'+name.replace(\/\"\/g, '\\\\\"')+'\",\"room_id\":\"&lt;?php echo isset($_GET&#91;'room_id']) ? $_GET&#91;'room_id'] : 1?>\"}';\r\n        console.log(\"websocket\u63e1\u624b\u6210\u529f\uff0c\u53d1\u9001\u767b\u5f55\u6570\u636e:\"+login_data);\r\n        ws.send(login_data);\r\n    }\r\n    \/\/ \u670d\u52a1\u7aef\u53d1\u6765\u6d88\u606f\u65f6\r\n    function onmessage(e)\r\n    {\r\n        console.log(e.data);\r\n        var data = eval(\"(\"+e.data+\")\");\r\n        switch(data&#91;'type']){\r\n            \/\/ \u670d\u52a1\u7aefping\u5ba2\u6237\u7aef\r\n            case 'ping':\r\n                ws.send('{\"type\":\"pong\"}');\r\n                break;;\r\n            \/\/ \u767b\u5f55 \u66f4\u65b0\u7528\u6237\u5217\u8868\r\n            case 'login':\r\n                \/\/{\"type\":\"login\",\"client_id\":xxx,\"client_name\":\"xxx\",\"client_list\":\"&#91;...]\",\"time\":\"xxx\"}\r\n                say(data&#91;'client_id'], data&#91;'client_name'],  data&#91;'client_name']+' \u52a0\u5165\u4e86\u804a\u5929\u5ba4', data&#91;'time']);\r\n                if(data&#91;'client_list'])\r\n                {\r\n                    client_list = data&#91;'client_list'];\r\n                }\r\n                else\r\n                {\r\n                    client_list&#91;data&#91;'client_id']] = data&#91;'client_name']; \r\n                }\r\n                flush_client_list();\r\n                console.log(data&#91;'client_name']+\"\u767b\u5f55\u6210\u529f\");\r\n                break;\r\n            \/\/ \u53d1\u8a00\r\n            case 'say':\r\n                \/\/{\"type\":\"say\",\"from_client_id\":xxx,\"to_client_id\":\"all\/client_id\",\"content\":\"xxx\",\"time\":\"xxx\"}\r\n                say(data&#91;'from_client_id'], data&#91;'from_client_name'], data&#91;'content'], data&#91;'time']);\r\n                break;\r\n            \/\/ \u7528\u6237\u9000\u51fa \u66f4\u65b0\u7528\u6237\u5217\u8868\r\n            case 'logout':\r\n                \/\/{\"type\":\"logout\",\"client_id\":xxx,\"time\":\"xxx\"}\r\n                say(data&#91;'from_client_id'], data&#91;'from_client_name'], data&#91;'from_client_name']+' \u9000\u51fa\u4e86', data&#91;'time']);\r\n                delete client_list&#91;data&#91;'from_client_id']];\r\n                flush_client_list();\r\n        }\r\n    }\r\n    \/\/ \u8f93\u5165\u59d3\u540d\r\n    function show_prompt(){  \r\n        name = prompt('\u8f93\u5165\u4f60\u7684\u540d\u5b57\uff1a', '');\r\n        if(!name || name=='null'){  \r\n            name = '\u6e38\u5ba2';\r\n        }\r\n    }\r\n    \/\/ \u63d0\u4ea4\u5bf9\u8bdd\r\n    function onSubmit() {\r\n      var input = document.getElementById(\"textarea\");\r\n      var to_client_id = $(\"#client_list option:selected\").attr(\"value\");\r\n      var to_client_name = $(\"#client_list option:selected\").text();\r\n      ws.send('{\"type\":\"say\",\"to_client_id\":\"'+to_client_id+'\",\"to_client_name\":\"'+to_client_name+'\",\"content\":\"'+input.value.replace(\/\"\/g, '\\\\\"').replace(\/\\n\/g,'\\\\n').replace(\/\\r\/g, '\\\\r')+'\"}');\r\n      input.value = \"\";\r\n      input.focus();\r\n    }\r\n    \/\/ \u5237\u65b0\u7528\u6237\u5217\u8868\u6846\r\n    function flush_client_list(){\r\n        var userlist_window = $(\"#userlist\");\r\n        var client_list_slelect = $(\"#client_list\");\r\n        userlist_window.empty();\r\n        client_list_slelect.empty();\r\n        userlist_window.append('&lt;h4>\u5728\u7ebf\u7528\u6237&lt;\/h4>&lt;ul>');\r\n        client_list_slelect.append('&lt;option value=\"all\" id=\"cli_all\">\u6240\u6709\u4eba&lt;\/option>');\r\n        for(var p in client_list){\r\n            userlist_window.append('&lt;li id=\"'+p+'\">'+client_list&#91;p]+'&lt;\/li>');\r\n            client_list_slelect.append('&lt;option value=\"'+p+'\">'+client_list&#91;p]+'&lt;\/option>');\r\n        }\r\n        $(\"#client_list\").val(select_client_id);\r\n        userlist_window.append('&lt;\/ul>');\r\n    }\r\n    \/\/ \u53d1\u8a00\r\n    function say(from_client_id, from_client_name, content, time){\r\n        $(\"#dialog\").append('&lt;div class=\"speech_item\">&lt;img src=\"http:\/\/lorempixel.com\/38\/38\/?'+from_client_id+'\" class=\"user_icon\" \/> '+from_client_name+' &lt;br> '+time+'&lt;div style=\"clear:both;\">&lt;\/div>&lt;p class=\"triangle-isosceles top\">'+content+'&lt;\/p> &lt;\/div>');\r\n    }\r\n    $(function(){\r\n        select_client_id = 'all';\r\n        $(\"#client_list\").change(function(){\r\n             select_client_id = $(\"#client_list option:selected\").attr(\"value\");\r\n        });\r\n    });\r\n  &lt;\/script>\r\n&lt;\/head>\r\n&lt;body onload=\"connect();\">\r\n    &lt;div class=\"container\">\r\n        &lt;div class=\"row clearfix\">\r\n            &lt;div class=\"col-md-1 column\">\r\n            &lt;\/div>\r\n            &lt;div class=\"col-md-6 column\">\r\n               &lt;div class=\"thumbnail\">\r\n                   &lt;div class=\"caption\" id=\"dialog\">&lt;\/div>\r\n               &lt;\/div>\r\n               &lt;form onsubmit=\"onSubmit(); return false;\">\r\n                    &lt;select style=\"margin-bottom:8px\" id=\"client_list\">\r\n                        &lt;option value=\"all\">\u6240\u6709\u4eba&lt;\/option>\r\n                    &lt;\/select>\r\n                    &lt;textarea class=\"textarea thumbnail\" id=\"textarea\">&lt;\/textarea>\r\n                    &lt;div class=\"say-btn\">&lt;input type=\"submit\" class=\"btn btn-default\" value=\"\u53d1\u8868\" \/>&lt;\/div>\r\n               &lt;\/form>\r\n               &lt;div>\r\n                   &lt;b>\u623f\u95f4\u5217\u8868:&lt;\/b>\uff08\u5f53\u524d\u5728 \u623f\u95f4&lt;?php echo isset($_GET&#91;'room_id'])&amp;&amp;intval($_GET&#91;'room_id'])>0 ? intval($_GET&#91;'room_id']):1; ?>\uff09&lt;br>\r\n                   &lt;a href=\"\/?room_id=1\">\u623f\u95f41&lt;\/a>    &lt;a href=\"\/?room_id=2\">\u623f\u95f42&lt;\/a>    &lt;a href=\"\/?room_id=3\">\u623f\u95f43&lt;\/a>    &lt;a href=\"\/?room_id=4\">\u623f\u95f44&lt;\/a>\r\n               &lt;br>&lt;br>\r\n               &lt;\/div>\r\n               &lt;p class=\"cp\">PHP\u591a\u8fdb\u7a0b+Websocket(HTML5\/Flash)+PHP Socket\u5b9e\u65f6\u63a8\u9001\u6280\u672f    Powered by &lt;a href=\"http:\/\/www.workerman.net\/workerman-chat\" target=\"_blank\">workerman-chat&lt;\/a>&lt;\/p>\r\n            &lt;\/div>\r\n            &lt;div class=\"col-md-3 column\">\r\n               &lt;div class=\"thumbnail\">\r\n                   &lt;div class=\"caption\" id=\"userlist\">&lt;\/div>\r\n               &lt;\/div>\r\n              \r\n            &lt;\/div>\r\n        &lt;\/div>\r\n    &lt;\/div>\r\n    &lt;script type=\"text\/javascript\">var _bdhmProtocol = ((\"https:\" == document.location.protocol) ? \" https:\/\/\" : \" http:\/\/\");document.write(unescape(\"%3Cscript src='\" + _bdhmProtocol + \"hm.baidu.com\/h.js%3F7b1919221e89d2aa5711e4deb935debd' type='text\/javascript'%3E%3C\/script%3E\"));&lt;\/script>\r\n&lt;\/body>\r\n&lt;\/html><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" width=\"715\" height=\"709\" src=\"https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-3.png\" alt=\"\" class=\"wp-image-324\" srcset=\"https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-3.png 715w, https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-3-300x297.png 300w, https:\/\/www.01j.top\/wp-content\/uploads\/2024\/02\/image-3-150x150.png 150w\" sizes=\"(max-width: 715px) 100vw, 715px\" \/><\/figure>\n\n\n\n<h2 id=\"h2-4\"><strong>linux\u7248\u5b89\u88c5<\/strong><\/h2>\n\n\n\n<p>a) \u5b89\u88c5thinkphp5\uff1b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer create-project topthink\/think tp5  --prefer-dist<\/code><\/pre>\n\n\n\n<p>b) \u8fdb\u5165tp5\u7684\u76ee\u5f55\uff0c\u5b89\u88c5linux\u7248\u672c\u7684workerman\uff1b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer require topthink\/think-worker<\/code><\/pre>\n\n\n\n<p>c)\u5b89\u88c5linux\u7248\u672c\u7684gateway\uff1b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer require workerman\/gateway-worker-for-win<\/code><\/pre>\n\n\n\n<h2 id=\"h2-5\">\u5173\u952e\u90e8\u5206\uff0c\u670d\u52a1\u7aef\u5b9e\u73b0<\/h2>\n\n\n\n<p>\u63a7\u5236\u5668 app\\index\\controller\\Gate<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \r\n\/**\r\n * linux workerman\u4f8b\u5b50\u6d4b\u8bd5\r\n * \u9700\u8981\u5728Linux\u7cfb\u7edf\u63a7\u5236\u53f0\u8fdb\u884c\u542f\u52a8\uff0c\u542f\u52a8\u6587\u4ef6\u4f4d\u4e8e\u6839\u76ee\u5f55\u7684start.php\u6587\u4ef6\u4e2d\r\n * Windows\u65e0\u6cd5\u8fdb\u884c\u540c\u65f6\u542f\u52a8\u591a\u4e2a\u534f\u8bae\r\n * \u7531\u4e8ePHP-CLI\u5728windows\u7cfb\u7edf\u65e0\u6cd5\u5b9e\u73b0\u591a\u8fdb\u7a0b\u4ee5\u53ca\u5b88\u62a4\u8fdb\u7a0b\uff0c\u6240\u4ee5windows\u7248\u672cWorkerman\u5efa\u8bae\u4ec5\u4f5c\u5f00\u53d1\u8c03\u8bd5\u4f7f\u7528\u3002\r\n *\/\r\nnamespace app\\index\\controller;\r\nuse Workerman\\Worker;\r\nuse GatewayWorker\\Gateway;\r\nuse GatewayWorker\\Register;\r\nuse GatewayWorker\\BusinessWorker;\r\nclass Gate\r\n{\r\n    \/**\r\n     * \u6784\u9020\u51fd\u6570\r\n     * @access public\r\n     *\/\r\n    public function __construct(){\r\n        \r\n        \/\/\u521d\u59cb\u5316\u5404\u4e2aGatewayWorker\r\n        \/\/\u521d\u59cb\u5316register register \u670d\u52a1\u5fc5\u987b\u662ftext\u534f\u8bae\r\n        $register = new Register('text:\/\/0.0.0.0:1236');\r\n    \r\n        \/\/\u521d\u59cb\u5316 bussinessWorker \u8fdb\u7a0b\r\n        $worker = new BusinessWorker();\r\n        \/\/ worker\u540d\u79f0\r\n        $worker->name = 'ChatBusinessWorker';\r\n        \/\/ bussinessWorker\u8fdb\u7a0b\u6570\u91cf\r\n        $worker->count = 4;\r\n        \/\/ \u670d\u52a1\u6ce8\u518c\u5730\u5740\r\n        $worker->registerAddress = '127.0.0.1:1236';\r\n        \/\/\u8bbe\u7f6e\u5904\u7406\u4e1a\u52a1\u7684\u7c7b,\u6b64\u5904\u5236\u5b9aEvents\u7684\u547d\u540d\u7a7a\u95f4\r\n        $worker->eventHandler = 'app\\index\\controller\\Events';\r\n        \/\/ \u521d\u59cb\u5316 gateway \u8fdb\u7a0b\r\n        $gateway = new Gateway(\"websocket:\/\/0.0.0.0:7272\");\r\n        \/\/ \u8bbe\u7f6e\u540d\u79f0\uff0c\u65b9\u4fbfstatus\u65f6\u67e5\u770b\r\n        $gateway->name = 'ChatGateway';\r\n        $gateway->count = 4;\r\n        \/\/ \u5206\u5e03\u5f0f\u90e8\u7f72\u65f6\u8bf7\u8bbe\u7f6e\u6210\u5185\u7f51ip\uff08\u975e127.0.0.1\uff09\r\n        $gateway->lanIp = '127.0.0.1';\r\n        \/\/ \u5185\u90e8\u901a\u8baf\u8d77\u59cb\u7aef\u53e3\uff0c\u5047\u5982$gateway->count=4\uff0c\u8d77\u59cb\u7aef\u53e3\u4e3a4000\r\n        \/\/ \u5219\u4e00\u822c\u4f1a\u4f7f\u75284000 4001 4002 4003 4\u4e2a\u7aef\u53e3\u4f5c\u4e3a\u5185\u90e8\u901a\u8baf\u7aef\u53e3\r\n        $gateway->startPort = 2300;\r\n        \/\/ \u5fc3\u8df3\u95f4\u9694\r\n        $gateway->pingInterval = 10;\r\n        \/\/ \u5fc3\u8df3\u6570\u636e\r\n        $gateway->pingData = '{\"type\":\"ping\"}';\r\n        \/\/ \u670d\u52a1\u6ce8\u518c\u5730\u5740\r\n        $gateway->registerAddress = '127.0.0.1:1236';\r\n    \r\n        \/\/\u8fd0\u884c\u6240\u6709Worker;\r\n        Worker::runAll();\r\n    }\r\n}<\/code><\/pre>\n\n\n\n<p><strong>\u5165\u53e3\u6587\u4ef6<\/strong><br>\u6587\u4ef6\uff1a start.php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\n\/**\r\n * workerman + GatewayWorker\r\n * \u6b64\u6587\u4ef6\u53ea\u80fd\u5728Linux\u8fd0\u884c\r\n * run with command\r\n * php start.php start\r\n *\/\r\nini_set('display_errors', 'on');\r\nif(strpos(strtolower(PHP_OS), 'win') === 0)\r\n{\r\n    exit(\"start.php not support windows.\\n\");\r\n}\r\n\/\/\u68c0\u67e5\u6269\u5c55\r\nif(!extension_loaded('pcntl'))\r\n{\r\n    exit(\"Please install pcntl extension. See http:\/\/doc3.workerman.net\/appendices\/install-extension.html\\n\");\r\n}\r\nif(!extension_loaded('posix'))\r\n{\r\n    exit(\"Please install posix extension. See http:\/\/doc3.workerman.net\/appendices\/install-extension.html\\n\");\r\n}\r\ndefine('APP_PATH', __DIR__ . '\/application\/');\r\ndefine('BIND_MODULE','chat\/Gate');\r\n\/\/ \u52a0\u8f7d\u6846\u67b6\u5f15\u5bfc\u6587\u4ef6\r\nrequire __DIR__ . '\/thinkphp\/start.php';<\/code><\/pre>\n\n\n\n<p><strong>\u542f\u52a8\u7a0b\u5e8f<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php start.php start<\/code><\/pre>\n\n\n\n<p><strong>\u5ba2\u6237\u7aef\u8ddfWindows\u4e00\u6837\u5c31\u53ef\u4ee5\u4e86<\/strong><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>thinkphp5+GatewayWorker+Workerman\u804a\u5929\u5ba4\uff0c\u53ef\u4ee5\u591a\u4eba\u804a\u5929\uff0c\u6307\u5b9a\u67d0\u4e2a\u4eba\u8fdb\u884c\u804a\u5929\uff0c\u8fd8 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[42],"tags":[64,66,63,56,65],"_links":{"self":[{"href":"https:\/\/www.01j.top\/index.php?rest_route=\/wp\/v2\/posts\/320"}],"collection":[{"href":"https:\/\/www.01j.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.01j.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.01j.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.01j.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=320"}],"version-history":[{"count":1,"href":"https:\/\/www.01j.top\/index.php?rest_route=\/wp\/v2\/posts\/320\/revisions"}],"predecessor-version":[{"id":325,"href":"https:\/\/www.01j.top\/index.php?rest_route=\/wp\/v2\/posts\/320\/revisions\/325"}],"wp:attachment":[{"href":"https:\/\/www.01j.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.01j.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.01j.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}